如何在远程机器上的Python脚本中使用Paramiko模块运行sudo命令

3

我的情况是我需要登录到远程机器,然后执行sudo切换到另一个账户(如:sudo su anotheract),然后运行其他所需的命令。

但是我能够成功地使用以下脚本连接到远程机器。但是脚本在执行sudo命令(sudo su anotheract)的那一行挂起了。

请帮助我找到这段代码的修复方法好吗?

import paramiko

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(
    paramiko.AutoAddPolicy())

ssh.connect(hostname='XX.XXX.XX.XX',port=22, username='myname',password='XXXXX')

ssh.exec_command=("sudo su anotheract")

stdout,stdin,stderr=ssh.exec_command("java -jar /usr/share/XXX/LogR.jar")

print stdout.readlines()
3个回答

2

有一种(不是非常安全的)方法是通过管道输入密码。需要注意的是,使用paramiko连接到目标主机的用户应具备sudo权限。

例如:

supass = 'some_pass'

stdout, stdin, stderr = ssh.exec_command('echo %s | sudo -S anotheract' % supass)

再次声明,这不是一个非常安全的实现方法,但可以快速完成工作。


我尝试了你的方法,但是出现了“标准输入必须是 tty”的错误。 - Yogeesh Seralathan
@YogeeshSeralathan paramiko.SSHClient().exec_command('your cmd', get_pty=True) - davegallant

-1
import pxssh
ssh = pxssh.pxssh()
ssh.login('host', 'user', 'password')
ssh.sendline("sudo su anotheract")
ssh.prompt('yourrootpassword')

在大多数Linux系统上,使用paramiko时无法执行sudo命令,因为sudo期望从tty接收命令,否则就会引发异常。但是你可以尝试使用invokeshell方法,不过我很久以前使用paramiko时不记得出了什么问题。如果你想在shell上发送各种命令,可以使用pxssh。


嗨,我尝试使用PXssh,但在sudo命令期间没有帮助,它被挂起了,出现了相同的问题。 - user1573644
你的远程机器上安装了什么操作系统? - Denis
@denis 在Linux中如何使用paramiko实现这个? - Yogeesh Seralathan

-2

可能会挂起,因为sudo等待密码。尝试将NOPASSWD:语句添加到/etc/sudoers中。

user    ALL = NOPASSWD: /bin/true

同时,使用su切换用户后继续执行某些操作是不可能的。当su执行完毕后,你会回到原始用户的原始shell。

因此,你需要使用sudo来运行所有命令:

stdout,stdin,stderr = ssh.exec_command=("sudo -u anotheract java -jar /usr/share/XXX/LogR.jar")

感谢您的回复。实际上,NOPASSWD已经存在于/etc/sudoers中,我已经检查过了。如果我通过SSH连接到远程服务器并运行sudo su anotheract命令,它不会要求密码并且可以成功执行。但是在脚本中却遇到了问题。 - user1573644
2
非常好,我们有派对:“今晚大家都是ROOT”。 - Denis
@Denis:你为什么这样认为?你如何使用这行代码为每个人(甚至是user)获取root权限?你知道这行代码的含义吗? - Igor Chubin
@Igor Chubin,好的,我看到你将nopasswd设置为true了,但是无论如何它都不起作用。 - Denis
@Denis:它可以工作;我刚在我的系统上检查了一下。但是回到你的短语“今晚每个人都ROOT”:你为什么写了“每个人”?你在这里看到了“每个人”吗? - Igor Chubin
嗨,我遇到了同样的问题,有没有远程SSH和sudo或使用paramiko运行其他脚本的解决方法? - user1573644

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接