我有一个使用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')
谢谢
由于错误消息中显示“没有这样的文件或目录 ”,我首先要检查目录是否存在于远程系统上,并且可以使用您正在使用的凭证写入。 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()
这是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.twclose() tw.tw = None tw.close()
https://github.com/jbardin/scp.py
远远没有实际回答所问的问题,上面的代码提供了一个与SCP协议兼容的scp的实际实现。 我个人还没有使用dropbear进行测试,但它是代码,实际上回答了主题行中的问题。
SCP!= SFTP。