2012-04-26 44 views
4

我有一个使用的paramiko一个Python代码。与SCP的paramiko,使用不同的远程和本地目录

#!/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') 

谢谢

+0

更改这些变量完全像你说的应该工作。 'sftp.put()'将'localD'路径中的本地文件复制到远程'remoteD'文件路径。我可能并不完全了解你想要什么,你能告诉我你做了什么,你期望什么以及你实际得到了什么? – KurzedMetal 2012-04-26 18:13:20

+0

我试图使用SFTP来转院(本地)/ var/tmp中/文件1到(远程)/家庭/用户/转移/文件1 我收到此错误: OSERROR:[错误2]没有这样的文件或目录: “/var/tmp/pruebaxxxxxxxx.tar。GZ” 这个脚本只有在本地和远程目录都是平等的工作,像 (本地)/ var/tmp中/文件1到(远程)/ var/tmp中/文件1 – 2012-04-26 18:15:56

+0

我知道你不必须有本地和远程相同,只是执行:'sftp.put(remotepath ='/ usr/jgaines2/foo.bar',localpath ='/ bin/edit.cmd')'工作得很好。 – 2012-04-26 19:17:38

回答

4

由于错误消息说,“没有这样的文件或目录”,我会首先检查,以确保远程系统上存在的目录,可写在您正在使用的凭据。 SFTPClient类具有各种可以调用的其他方法来验证目标路径的存在,并在目标路径尚不存在时创建它们。

例如,呼叫统计()方法,通过在目标路径应该给你回一个元组相同的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()

+0

此目录存在: localD =( '/var/tmp/testxxxxxxxx.tar.gz') 远程化=( '/home/user/testxxxxxxxx.tar.gz') sftp.put(remotepath =远程的,局部路径= localD) 是likeI不能改变远程目录目的地,如果文件存在于/ var/tmp中,在所述远程服务器的同一目录被复制。 也许我必须使用os.path.join(os.getcwd()什么的,但我不没什么两样如何 – 2012-04-26 18:40:24

+0

谢谢约翰!但如果该目录存在,为什么我收到一个错误的文件testxxxxxxxx.tar。 GZ,显然不是在远程服务器上,因为是传输的文件。我必须首先创建??? 我只需要通过SSH发送文件。 – 2012-04-26 19:39:23

+0

是远程机器在UNIX机器吗?如果是这样,ssh进入它使用在你的脚本中使用相同的userid/pw,cd到目标目录并执行'touch foo.bar'(关键是foo.bar目前还不存在,这会测试你将文件写入该目录的能力),如果你。得到任何错误,回到一切无论是CD中或作为触摸命令的结果,你看权限问题 – 2012-04-26 19:47:13

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

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

远远没有真正回答这是问的问题,上面的代码提供了一个实际的实现SCP的是与O兼容penssh SCP协议。我个人还没有使用dropbear进行测试,但它是代码,它实际上回答了主题行中的问题。

SCP!= SFTP。

相关问题