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()