22

我正在尝试使用 Paramiko 连接到远程主机并执行一些文本文件替换。

i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/" 
                              + replaced + "/g'" + conf);

其中一些命令需要作为 sudo 运行,这会导致:

sudo:对不起,你必须有一个 tty 才能运行 sudo

我可以使用 -t 开关和 ssh 强制进行伪 tty 分配。

是否可以使用 paramiko 做同样的事情?

4

4 回答 4

40

其实很简单。只是:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
于 2015-02-03T22:58:57.240 回答
22

以下代码适用于我:

#!/usr/bin/env python
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('localhost',username='root',password='secret')
chan = ssh.get_transport().open_session()
chan.get_pty()
chan.exec_command('tty')
print(chan.recv(1024))

这只是通过在线查看一些示例组装而成的......不确定它是否“正确”的方式。

于 2011-09-30T15:58:29.237 回答
14

我认为您想要对象的invoke_shell方法SSHClient(我很想提供一个 URL,但 lag.net 上的 paramiko 文档框架重的,只是不会向我显示文档中给定位置的特定 URL)-它为您提供了一个Channel,您可以在其上执行exec_command类似操作,但是通过伪终端(包含终端类型以及行数和列数!-)来执行此操作,这似乎是您所要求的。

于 2010-05-26T02:24:46.543 回答
9

根据 sudo 手册页:

-S (stdin) 选项使 sudo 从标准输入而不是终端设备读取密码。密码后面必须跟一个换行符。

您可以写入标准输入,因为它是一个带有 write() 的文件对象:

import paramiko

client = paramiko.client.SSHClient()
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
client.connect(hostname='localhost', port=22, username='user', password='password')
stdin, stdout, stderr = client.exec_command('sudo -S aptitude update')
stdin.write('password\n')
stdin.flush()
# print the results
print stdout.read()
client.close()
于 2014-08-26T06:49:37.137 回答