SCP与paramiko,使用不同的远程和本地目录

时间:2012-04-26 18:03:20

标签: python linux paramiko

我有一个使用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应该是等于的。如果不是“找不到文件” 如何更改或使用与local-dir不同的另一个remote-dir? 例如:

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

谢谢

3 个答案:

答案 0 :(得分: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()将路径构建到你想要放置文件的位置

答案 1 :(得分:1)

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

然而,我正在寻找实际的 SCP而不是paramiko,不幸的是,这里的答案位于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()

答案 2 :(得分:1)

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

远非实际上没有回答被问到的问题,上面的代码提供了与openssh SCP协议兼容的scp的实际实现。我个人还没有使用dropbear进行测试,但它实际上是回答主题行中的问题的代码。

SCP!= SFTP。

相关问题