【问题标题】:Executing su user (without password) on paramiko ssh connection在 paramiko ssh 连接上执行 su 用户(无密码)
【发布时间】:2012-01-15 02:59:00
【问题描述】:

我需要通过 ssh 登录到服务器,执行“su 用户名”(无密码)以该用户身份执行一些命令(没有直接登录 ssh)。

从终端看是这样的:

root@cs01:~# su foo
foo@cs01:/root$ cd
foo@cs01:~$ ls

我尝试使用 paramiko (python) 来做到这一点:

import paramiko
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('host', username='root', password='mypassword', key_filename='<filename>')

stdin, stdout, stderr = ssh.exec_command('su foo')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('cd')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()
ssh.close()

但脚本并没有结束。

日志如下:

...
DEB [20111207-16:22:25.538] thr=1   paramiko.transport: userauth is OK
INF [20111207-16:22:25.921] thr=1   paramiko.transport: Authentication (publickey) successful!
DEB [20111207-16:22:25.923] thr=2   paramiko.transport: [chan 1] Max packet in: 34816 bytes
DEB [20111207-16:22:26.088] thr=1   paramiko.transport: [chan 1] Max packet out: 32768 bytes
INF [20111207-16:22:26.088] thr=1   paramiko.transport: Secsh channel 1 opened.
DEB [20111207-16:22:26.151] thr=1   paramiko.transport: [chan 1] Sesch channel 1 request ok

如果我只尝试这个:

stdin, stdout, stderr = ssh.exec_command('su foo')
#without print
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()

它以 root 身份执行 pwd,而不是 foo。

怎么了?

【问题讨论】:

    标签: python shell ssh paramiko su


    【解决方案1】:

    每个exec_command() 调用都发生在一个新的shell 中,因此没有从以前的命令继承的状态。如果命令依赖于先前的命令来执行,则必须在单个语句中或作为脚本发送它们。如果你想要一个交互式shell,有invoke_shell命令,但是你需要解析shell输出来模拟交互式使用(这里可以使用pexpect库)。

    您可以使用sudo 命令或su -c 来执行命令。但是,我建议为所需用户配置安全登录,并直接以该用户身份连接。

    【讨论】:

    • 谢谢。我的目标是调用 su 用户,然后 cd (去他的家),然后 svn up 在那个目录上。有一种方法可以连接它,或者在 paramiko 中保持状态?
    • su foo -c "svn up /home/foo" 是一种可能性。首先在命令行上编写脚本,因为这与 paramiko 无关。不是你不能在 paramiko 中“保持状态”,而是你在执行两个独立的 shell。
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2014-12-30
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多