4

Paramiko を使用する Python コードがあります。

#!/usr/bin/env python

import paramiko

username = ('user')
password = ('1234')
hostname = ('test-server.com')
ports = 22
localD = ('/var/tmp/testxxxxxxxx.tar.gz')
remoteD = ('/var/tmp/testxxxxxxxx.tar.gz')



paramiko.util.log_to_file('/tmp/paramiko.log')
transport = paramiko.Transport((hostname, ports))
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(remotepath=remoteD, localpath=localD)

sftp.close()
transport.close()

このコードでは、local-dir と remote-dir が等しくなるはずです。「ファイルが見つかりません」でない場合、ローカルディレクトリとは異なる別のリモートディレクトリを変更または使用するにはどうすればよいですか? 例:

localD = ('/var/tmp/testxxxxxxxx.tar.gz')
remoteD = ('/home/user/testxxxxxxxx.tar.gz')

ありがとうございました

4

3 に答える 3

4

エラー メッセージには「そのようなファイルまたはディレクトリはありません」と表示されるため、まずディレクトリがリモート システムに存在し、使用している資格情報で書き込み可能であることを確認します。SFTPClient クラスには、ターゲット パスの存在を確認し、まだ存在しない場合はそれらを作成するために呼び出すことができる、あらゆる種類の他のメソッドがあります。

たとえば、宛先パスを渡して stat() メソッドを呼び出すと、os.stat によって返されるものと同じタプルが返されます。このスクリプトを実行してみてください (ちょっとしたパス チェック ルーチンをハックしてスクリプトに落とし込みました):

#!/usr/bin/env python

import paramiko

username = ('user')
password = ('1234')
hostname = ('test-server.com')
ports = 22
localD = ('/var/tmp/testxxxxxxxx.tar.gz')
remoteD = ('/var/tmp/testxxxxxxxx.tar.gz')

def check(sftp, path):
    parts = path.split('/')
    for n in range(2, len(parts) + 1):
        path = '/'.join(parts[:n])
        print 'Path:', path,
        sys.stdout.flush()
        try:
            s = sftp.stat(path)
            print 'mode =', oct(s.st_mode)
        except IOError as e:
            print e

paramiko.util.log_to_file('/tmp/paramiko.log')
transport = paramiko.Transport((hostname, ports))
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)
check(sftp, remoteD)

sftp.close()
transport.close()

出力は次のようになります。

Path: /var mode = 040755
Path: /var/tmp mode = 040700
Path: /var/tmp/testxxxxxxxx.tar.gz [Errno 2] No such file

モード番号はおそらく異なりますが、ファイル名以外のパスのどの部分でも「そのようなファイルはありません」というエラーが発生することはありません。その場合は、おそらく、sftp.mkdir() を使用してファイルを配置するポイントまでのパスを構築する必要があることを意味します。

于 2012-04-26T18:33:03.823 に答える
1

https://github.com/jbardin/scp.py

尋ねられた質問に実際に答えているわけではありませんが、上記のコードは、openssh SCP プロトコルと互換性のある scp の実際の実装を提供します。個人的にはまだ dropbear でテストしていませんが、件名にある質問に実際に答えるコードです。

SCP != SFTP。

于 2013-12-12T10:58:07.827 に答える
1

これは sftp であり、SCP ではありません。dropbear を備えたデバイス (OpenWRT など) に接続する場合、sftp サブシステムがないため、sftp は失敗します。代わりに、tar コマンド (「接続」関数の背後で抽象化された paramiko を使用します。

ただし、paramiko を介した実際のSCP を探していますが、残念ながら、Google 検索の上部にあるここでの回答は、実際には質問に回答していません。

# argh argh argh dropbear on openwrt not compiled with sftp
# have to use some horribleness...

tw = connect(ipaddr, "root", server_root_password, command="tar xvf -",
             debug_level=debug_level)

tf = StringIO()
tar = tarfile.open(mode= "w:", fileobj = tf)
taradd(tar, "etc/tinc/....")
taradd(tar, ".....", ...)
taradd(tar, "....", ...)
taradd(tar, "etc/init.d/tinc", ...., ex=True)
tar.close()

tf.seek(0)
txt = tf.read()
tw.t.write(txt)
tw.t.write('^D')
tw.t.w.close()
tw.t.w = None
tw.close()
于 2013-12-12T10:52:17.617 に答える