2016-10-21 18 views
0

私はexpectを使って、より大きなpythonプログラムの一部としてタスクを自動化しようとしています。そして、リモートマシン上でsshコマンドのstdoutを得るのに苦労しています。以前はexpectを使用しておらず、manページで解決策を見つけることに成功していませんでした。sshからの出力を得るためにexpectを使う

実際にこのコマンドを実行する前に、いくつかのやり取りを自動化するためにexpectを使用する必要がありますが、質問を簡略化するためにここで削除しました。ここで

は、プログラムの簡単な例です:

import subprocess 

expect = """ 
/usr/bin/expect <<EOF 

spawn ssh some_machine ls 
expect eof 
puts "$expect_out(buffer)" 
""" 

output = subprocess.check_output(expect, shell=True) 
print(output) 

出力:

b'spawn ssh some_machine ls\r\n116029\r\nArchive\r\n\r\n(buffer)\n' 

終わりでSPAWNコマンドと同様に、 "(バッファ)" を含むように表示されます。なぜこれが起きているのか分かりません。 lsの結果のみを取得しようとしています。

期待通りにデバッグモードをオンにすると、expect_out(buffer)は返信したいものに設定されていますが、putsには反映されません。

出力:

expect version 5.45 
argv[0] = /usr/bin/expect argv[1] = -d 
set argc 0 
set argv0 "/usr/bin/expect" 
set argv "" 
executing commands from command file 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {1753} 
expect: read eof 
expect: set expect_out(spawn_id) "exp7" 
expect: set expect_out(buffer) "116029\r\nArchive\r\n" 
<wrong output as above> 
+1

なぜあなたはここに 'expect'を使用していますか?コマンドを実行して標準出力を読み込んでいるだけです。 'subprocess.check_output( 'ssh some_machine ls'、shell = True)'を実行するだけです。 – larsks

+0

私はスクリプトの目的を簡略化しましたが、出力を収集する前にいくつかのやりとりを自動化するために使用する必要があります。 – Matteo

+0

また、シェルスクリプト 'expect'に' EOF'にマッチする端末 'EOF'がありません。 – larsks

答えて

1

あなたはlog_userコマンドで期待からログ出力を抑制することができる。

log_user 0 
spawn ssh some_host ls 
expect eof 
puts "$expect_out(buffer)" 

log_user 0なしには、私が取得:

$ expect -f sample.tcl 
spawn ssh some_host ls 
file1 
file2 

log_user 0を追加することにより、私は得る:

$ expect -f sample.tcl 
file1 
file2 

ありますが、標準入力経由でスクリプトを期待してフィードする際、いくつかの奇数判定のようですが、次は動作するようです:

import subprocess 
import tempfile 

expect = """ 
log_user 0 
spawn ssh some_host ls < /dev/null 
expect eof 
puts "$expect_out(buffer)" 
""" 

with tempfile.NamedTemporaryFile() as fd: 
    fd.write(expect) 
    fd.flush() 
    fd.seek(0) 
    output = subprocess.check_output(['expect', fd.name]) 

print(output) 
+0

私がこれを行うことによって得られる唯一の出力は 'b '(バッファ)\ n" ' – Matteo

+0

です。あなたのコメントには何かがありませんが、私があなたが記述しようとしていた振る舞いを見ていると思います。見て... – larsks

+0

はい、それはsample.tclを使用して動作します。しかし、私がPythonで使用すると、正しく動作せず、出力が上にしか見えません。私は調査を続けます... – Matteo

関連する問題