Мне нужно войти в систему через 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()
выполняет pwd как root, а не как foo.
Что не так?