【问题标题】:Getting "must be run from a terminal" when switching to root user using Paramiko module in Python在 Python 中使用 Paramiko 模块切换到 root 用户时获取“必须从终端运行”
【发布时间】:2023-03-18 10:30:01
【问题描述】:

我正在尝试通过 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 设备,然后使用 su 命令切换到 root 用户并回显密码,以便我可以以 root 身份运行其他命令。

谢谢。

【问题讨论】:

    标签: python ssh sudo paramiko su


    【解决方案1】:

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

    正确的解决方案是设置一个仅具有任务所需权限的专用私钥。另见Allowing automatic command execution as root on Linux using SSH


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

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

    要么删除requiretty 选项。

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

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

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

    【讨论】: