Paramiko和Pseudo-tty分配

时间:2010-05-26 00:38:46

标签: python ssh paramiko

我正在尝试使用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 个答案:

答案 0 :(得分:36)

实际上它非常简单。只是:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)

答案 1 :(得分: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))

这只是通过在线查看几个例子来组装的......不确定它是否是“正确”的方式。

答案 2 :(得分:14)

我认为您需要invoke_shell对象的SSHClient方法(我很想提供一个网址,但lag.net的paramiko文档很重,只是不会显示文档中给定位置的特定URL) - 它为您提供Channel,您可以在其上执行exec_command等,但通过伪终端(完成终端类型和行数和列数! - )这似乎是你要求的。

答案 3 :(得分:6)

根据sudo手册页:

  

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

您可以写入stdin,因为它是一个带有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()