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

2024-04-23

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

Thanks.


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

正确的解决方案是设置一个专用私钥,仅具有您的任务所需的权限。也可以看看允许使用 SSH 在 Linux 上以 root 身份自动执行命令 https://superuser.com/q/1481318/213663.


无论如何,你的命令失败了,因为sudo配置为需要一个交互式终端requiretty选项中sudoers配置文件 https://linux.die.net/man/5/sudoers(作为阻止其自动化的一种方式)。

Paramiko(正确地)没有为以下对象分配伪终端:exec默认频道。

要么删除requiretty option.

如果您无法删除它,您可以使用以下命令强制 Paramiko 分配伪终端get_pty的参数exec_command method https://docs.paramiko.org/en/latest/api/client.html#paramiko.client.SSHClient.exec_command:

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

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

  • 有没有一种简单的方法可以消除使用 Python 的 Paramiko 库进行 SSH 并从远程计算机的 CLI 获取输出时出现的垃圾值? https://stackoverflow.com/q/33291631/850848
  • 当我使用 JSch 运行命令时删除不需要的字符 https://stackoverflow.com/q/44276916/850848
  • 从 JSch 中的命令输出中删除 shell 内容(如提示) https://stackoverflow.com/q/40142559/850848
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用 Paramiko 模块切换到 root 用户时出现“必须从终端运行” 的相关文章

随机推荐