我正在尝试使用Paramiko连接到远程主机并执行许多文本文件替换。
i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/"
+ replaced + "/g'" + conf);
其中一些命令需要以sudo身份运行,结果是:
sudo:对不起,你必须有一个tty 运行sudo
我可以使用-t开关和ssh强制使用伪tty分配。
是否可以使用paramiko做同样的事情?
答案 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()