2011-12-07 454 views
2

sshでサーバにログインする必要があります。su username(パスワードなし)を実行して、そのユーザ(sshで直接ログインしていないコマンド)を実行します。私はparamiko(パイソン)でこれを行うにしようとしましたparamiko ssh接続でsu user(パスワードなし)を実行

[email protected]:~# su foo 
[email protected]:/root$ cd 
[email protected]:~$ ls 

:端末から

が、このようなものになるだろう

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として、rootとしてPWDを実行します。

どういうところが間違っていますか?

答えて

6

exec_command()呼び出しは新しいシェルで行われるため、前のコマンドから引き継いだ状態はありません。コマンドが実行する前のコマンドに依存している場合は、それらを単一のステートメントまたはスクリプトとして送信する必要があります。対話型シェルが必要な場合はinvoke_shellコマンドがありますが、シェル出力を解析してインタラクティブな使用をシミュレートする必要があります(ここではpexpectライブラリを使用できます)。

sudoコマンドまたはsu -cコマンドを使用してコマンドを実行できます。ただし、必要なユーザーのセキュリティで保護されたログインを構成し、そのユーザーとして直接接続することをお勧めします。

+0

thx。私の目標は、suユーザーを呼び出してからcd(自分の家に行く)、そしてsvnをそのディレクトリに置くことです。これを連結する方法、またはparamikoの状態を変更する方法がありますか? – apelliciari

+1

'su foo -c" svn up/home/foo "'が可能です。これは最初にコマンドラインでスクリプトを実行します。これはparamikoとは関係ありません。 paramikoでは「状態を維持できない」というわけではなく、2つの独立したシェルを実行しているということです。 – JimB

関連する問題