在Python中使用Paramiko模块切换到root用户时,必须“从终端运行”

时间:2018-03-10 19:35:03

标签: python ssh sudo paramiko su

我正在尝试通过Python脚本自动执行任务。我们的想法是以普通用户身份登录,然后发送su命令并切换到root帐户。

我无法以root身份直接登录的原因是SSHD不允许root登录。

这就是我所拥有的:

ip='192.168.105.8'
port=22
username='xyz'
password='abc'
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
print ("SSH connection established")

stdin,stdout,stderr=ssh.exec_command('sudo fast.sh')
    outlines=stdout.readlines()
    outlines+=stderr.readlines()
    resp=''.join(outlines)
    print(resp)

现在,我想发送su命令并回显root密码。我知道这不是一个好习惯,但我需要一种快速简便的方法来测试这个,所以我对此很好。

然而,当我这样做的时候 stdin,stdout,stderr=ssh.exec_command('su')并提供密码,我收到错误

  

su:必须从终端

运行

有人可以帮我解决这个问题。

我在我的Windows笔记本电脑上运行Python脚本ssh到Linux设备然后使用root命令切换到su用户并回显密码,以便我可以以root身份运行其他命令

感谢。

1 个答案:

答案 0 :(得分:1)

首先,如您所知,自动susudo不是正确的解决方案。

正确的解决方案是设置专用私钥,仅具有您的任务所需的权限。

无论如何,您的命令失败,因为sudo被配置为需要sudoers configuration file中具有requiretty选项的交互式终端(以阻止其自动化)。

Paramiko(正确)默认情况下不为exec频道分配伪终端。

删除requiretty选项。

如果您无法将其删除,可以强制Paramiko使用exec_command methodget_pty参数分配伪终端:

ssh.exec_command('sudo fast.sh', get_pty=True)

但这不是一个好选择,因为它可以带给你很多令人讨厌的副作用。伪终端旨在用于交互式使用,而不是用于自动执行命令。有关示例,请参阅