被害妄想症の友人: Pythonでssh
paramikoというpythonのsshライブラリで遠隔マシンの操作が自動化できる。
hello paramiko
import paramiko
transport=paramiko.Transport( ( 'takao3' , 22 ) )
transport.connect(username='tengu', password='xxxx')
c=transport.open_session()
c.exec_command('ls hoge > /dev/null')
if c.recv_exit_status()==0:
print c.makefile('rb', -1).readlines()
else:
print c.makefile_stderr('rb', -1).readlines()
接続
pkeyを使うようにすべきだが、passwordを使わなきゃいけないときもある。ところで、TCPソケット以外のTransportって何がるんだろう…
transport=paramiko.Transport( ( 'takao3', 22 ) )
transport.connect(username='tengu', password='xxxx')
セッション・チャンネル
遠隔コマンドとはChannelと呼ばれるデータストリームでデータをやり取りする。チャンネルを開いてデータを書き込んだり、返答を読み出したり、プロセスの終了を待ったりexit statusを得たりできる。subprocessのPopenみたいな感覚だ。
http://www.lag.net/paramiko/docs/ (help(paramiko.Channel)) を参照。
# チャンネル(セッション)はコマンド毎に開く
c=transport.open_session()
c.exec_command('ls hoge > /dev/null')# コマンドが終了するまでブロックする。wait(2)に相当する。
if c.recv_exit_status()==0:
# 出力が少いのでバッファさせた出力を読む。
# 出力が多いと読んだ後にrecv_exit_status()しないといけないだろう。
print c.makefile('rb', -1).readlines()
else:
print c.makefile_stderr('rb', -1).readlines()
サイトのドキュメンテーション(http://www.lag.net/paramiko/docs/)もしっかりしていて、よく管理されたライブラリという印象が得られる。ちなみにparamikoという名は「被害妄想症の友人」という意味のエスペラント語の造語だそうだ。