ssh4pyモジュールでファイル転送 (2)
前回scpのライブラリを試した(http://d.hatena.ne.jp/Megumi221/20100127 )が、ファイルを読み込む部分でフリーズしてしまうので、ひとまずあきらめる。ソースを読んでみるのもいいが、少し時間がかかりそうなので。そこで今回は、sftpの方のライブラリを試してみたらちゃんと動いた。
本来、sftpはscpと比べてインタラクティブにファイル転送ができるのが利点だとは思うが、今回はscpの代替として使うことを想定している。そのため、転送するファイル名やパスが、サーバに接続する前にすでに分かっていることが前提となる。でも、このモジュールがそもそもインタラクティブな転送用に使えるかはわからない。
参考サイト:http://blog.keyphrene.com/keyphrene/index.php/2008/09/27/7-sftp
以下、ファイルのgetとputのサンプル。
ファイルを持ってくるとき(LinuxからWindowsへ)
Windows側で下記のプログラムを実行する。
sftp.open()でのファイルパスの指定方法は、
sftp.open("./testdata", "rb") はOK
sftp.open("~/testdata", "rb") はダメみたい
import socket from ssh4py import SSH2 HOSTNAME = "255.255.255.255" #接続先IP PORT = 22 LOGIN = "hoge" #Linuxでのユーザ名 PWD = "hogepass" #Linuxのパスワード sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOSTNAME, PORT)) sock.setblocking(1) ssh = SSH2.Session() ssh.startup(sock) ssh.setPassword(LOGIN, PWD) sftp = ssh.SFTP() # 持ってくるファイル # テキストデータであっても"rb"のbは付けておくことにする。 channel = sftp.open("/home/hoge/testdata", "rb") # Windows側で保存するファイル名 myfile = open('newfile', 'wb') while 1: data = sftp.read(channel, 1024) #ファイルを1024バイトずつ読む if not data: break myfile.write(data) sftp.close(channel) myfile.close() sftp.shutdown() ssh.close()
ファイルを持っていく(WindowsからLinuxへ)
Windows側で下記のプログラムを実行する。
import socket from ssh4py import SSH2 HOSTNAME = "255.255.255.255" #接続先IP PORT = 22 LOGIN = "hoge" #Linuxでのユーザ名 PWD = "hogepass" #Linuxのパスワード sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOSTNAME, PORT)) sock.setblocking(1) ssh = SSH2.Session() ssh.startup(sock) ssh.setPassword(LOGIN, PWD) sftp = ssh.SFTP() # 持っていくファイル # テキストデータであっても"rb"のbは付けておくことにする。 myfile = open("testdata", "rb") channel = sftp.open("testdata", "wb") while 1: data = myfile.read(1024) #転送元のファイルを読み込んで... if not data: break sftp.write(channel, data) #転送先のファイルに書き込む。 sftp.close(channel) myfile.close() sftp.shutdown() ssh.close()