私は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>
なぜあなたはここに 'expect'を使用していますか?コマンドを実行して標準出力を読み込んでいるだけです。 'subprocess.check_output( 'ssh some_machine ls'、shell = True)'を実行するだけです。 – larsks
私はスクリプトの目的を簡略化しましたが、出力を収集する前にいくつかのやりとりを自動化するために使用する必要があります。 – Matteo
また、シェルスクリプト 'expect'に' EOF'にマッチする端末 'EOF'がありません。 – larsks