Paramiko与伪终端分配

24 投票
4 回答
26043 浏览
提问于 2025-04-15 23:10

我正在尝试使用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等命令。不过,它是通过一个伪终端来实现的(还包括终端类型和行列数!),这似乎正是你想要的功能。

撰写回答