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

问题描述 投票:3回答:1

我试图通过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身份运行其他命令。

谢谢。

python ssh sudo paramiko su
1个回答
1
投票

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

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


无论如何,你的命令失败是因为sudo被配置为需要在requiretty中使用sudoers configuration file选项的交互式终端(作为阻止其自动化的一种方法)。

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

要么删除requiretty选项。

如果你不能删除它,你可以强制Paramiko使用get_ptyexec_command method参数分配伪终端:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.