在paramiko ssh连接上执行su user(无密码)

2024-04-20 12:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在ssh中登录到服务器,执行“su username”(不带密码)以该用户身份执行一些命令(在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()

它以根而不是foo的形式执行pwd。

怎么了?


Tags: paramikofoostderrstdinstdoutdebrootssh
1条回答
网友
1楼 · 发布于 2024-04-20 12:33:22

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

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

相关问题 更多 >