Paramiko与伪终端分配
我正在尝试使用Paramiko连接到一个远程主机,并执行一些文本文件的替换操作。
i, o, e = client.exec_command("perl -p -i -e 's/" + initial + "/"
+ replaced + "/g'" + conf);
其中一些命令需要以sudo权限运行,这就导致了以下问题:
sudo: 抱歉,你必须有一个tty才能运行sudo
我可以通过在ssh命令中加上-t选项来强制分配伪终端。
请问使用paramiko也能做到这一点吗?
4 个回答
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))
这段代码是我参考网上的一些例子拼凑出来的……不太确定这是不是“正确”的做法。
42
其实这很简单。只需要:
stdin, stdout, stderr = client.exec_command(command, get_pty=True)
14
我觉得你想要的是SSHClient
对象的invoke_shell
方法(我很想给你一个网址,但paramiko的文档在lag.net上加载得很慢,根本无法给出具体的链接)。这个方法会给你一个Channel
,在这个通道上你可以执行exec_command
等命令。不过,它是通过一个伪终端来实现的(还包括终端类型和行列数!),这似乎正是你想要的功能。