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

使用此代码,本地目录和远程目录应该相等。如果不是“找不到文件”如何更改或使用与本地目录不同的另一个远程目录?例子:

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

这是 sftp,不是 SCP。当连接到有 dropbear 的设备时(例如 OpenWRT 上的设备)没有sftp 子系统,所以 sftp 失败。相反,我使用 tar 命令(paramiko 在“连接”函数后面抽象出来。

然而,我在 paramiko 上寻找实际的SCP,不幸的是,这里的答案位于谷歌搜索的顶部,实际上并没有回答这个问题。

# 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 回答
1

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

上面的代码并没有真正回答所提出的问题,而是提供了与 openssh SCP 协议兼容的 scp 的实际实现。就我个人而言,我还没有使用 dropbear 对其进行测试,但它是实际回答主题行中问题的代码。

SCP!= SFTP。

于 2013-12-12T10:58:07.827 回答