Paramiko和Pseudo-tty分配

Jon*_*Jon 21 python ssh paramiko

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

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

其中一些命令需要以sudo身份运行,这会导致:

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

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

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

Mac*_*zuk 36

实际上这很简单.只是:

stdin, stdout, stderr = client.exec_command(command,  get_pty=True)
Run Code Online (Sandbox Code Playgroud)


小智 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))
Run Code Online (Sandbox Code Playgroud)

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

  • 当接受的答案没有时,这个答案对我有用.谢谢! (2认同)

Ale*_*lli 14

我想你想invoke_shell的方法SSHClient对象(我很乐意给一个网址,但在文档的paramiko lag.net是帧重,只是不会显示我的文档给定点特定URL) -它给你一个Channel,你可以做的事情exec_command等,但通过一个伪终端(完整的终端类型和行数和列数! - ),这似乎是你要求的.

  • 直接无框链接:http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html#invoke_shell. (4认同)

ksa*_*r11 7

根据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()
Run Code Online (Sandbox Code Playgroud)