我试图通过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身份运行其他命令。
谢谢。
首先,如您所知,自动化su
或sudo
不是正确的解决方案。
正确的解决方案是设置专用私钥,仅具有任务所需的权限。
无论如何,你的命令失败是因为sudo
被配置为需要在requiretty
中使用sudoers
configuration file选项的交互式终端(作为阻止其自动化的一种方法)。
Paramiko(正确)默认情况下不为exec
通道分配伪终端。
要么删除requiretty
选项。
如果你不能删除它,你可以强制Paramiko使用get_pty
的exec_command
method参数分配伪终端:
ssh.exec_command('sudo fast.sh', get_pty=True)
但这不是一个好选择,因为它可以带来很多令人讨厌的副作用。伪终端旨在用于交互式使用,而不是用于自动执行命令。有些例子,请参阅