如何在python中scp?

什么是python的最Python的方式来Python中的文件? 我知道的唯一路线是

os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) ) 

这是一种黑客攻击,在类似Linux的系统之外无法工作,并且需要Pexpect模块的帮助才能避免密码提示,除非您已经为远程主机设置了无密码的SSH。

我知道Twisted的conch ,但我宁愿避免通过低级ssh模块来实现scp。

我知道paramiko ,一个支持ssh和sftp的Python模块; 但它不支持scp。

背景:我连接到不支持sftp但支持ssh / scp的路由器,所以sftp不是一个选项。

编辑 :这是如何复制文件到远程服务器在Python中使用SCP或SSH的副本? 。 然而 ,这个问题并没有给出一个特定于scp的答案来处理python中的键。 我希望有一种方法来运行类似的代码

 import scp client = scp.Client(host=host, user=user, keyfile=keyfile) # or client = scp.Client(host=host, user=user) client.use_system_keys() # or client = scp.Client(host=host, user=user, password=password) # and then client.transfer('/etc/local/filename', '/etc/remote/filename') 

尝试模块paramiko_scp 。 这非常容易使用。 看下面的例子:

 def createSSHClient(server, port, user, password): client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(server, port, user, password) return client ssh = createSSHClient(server, port, user, password) scp = SCPClient(ssh.get_transport()) 

然后调用scp.get()或scp.put()来执行scp操作。

( SCPClient代码 )

您可能有兴趣尝试Pexpect ( SourceForge项目 )。 这将允许您处理交互式提示input密码。

以下是主要网站的示例用法(对于ftp):

    #这个连接到openbsd的ftp站点和
    #下载recursion目录列表。
   导入pexpect
    child = pexpect.spawn('ftp ftp.openbsd.org')
    child.expect('Name。*:')
    child.sendline('anonymous')
    child.expect('密码:')
    child.sendline('noah@example.com')
    child.expect('ftp>')
    child.sendline('cd pub')
    child.expect('ftp>')
    child.sendline('get ls -lR.gz')
    child.expect('ftp>')
    child.sendline('bye')

你也可以看看paramiko 。 还没有scp模块,但它完全支持sftp。

[编辑]对不起,错过了你提到paramiko的行。 以下模块只是paramiko的scp协议的一个实现。 如果你不想使用paramiko或海螺(我知道的python的唯一的ssh实现),你可以重写这个使用pipe道运行在一个正常的ssh会话。

为paramiko scp.py

如果你在win32上安装putty,你会得到一个pscp(putty scp)。

所以你也可以在win32上使用os.system hack。

(你可以使用腻子代理进行密钥pipe理)


对不起,这只是一个黑客(但你可以把它包装在一个Python类)

自问这个问题已经有一段时间了,同时,另一个可以处理这个问题的库已经出现了:您可以使用包含在铅库中的复制function:

 import plumbum r = plumbum.machines.RemoteMachine("example.net", user="username", keyfile=".ssh/some_key") fro = plumbum.local.path("some_file") to = r.path("/path/to/destination/") plumbum.path.utils.copy(fro, to) 

看看面料 。 一个例子可以在这里find。

找不到直接的答案,这个“scp.Client”模块不存在。 相反, 这适合我:

 from paramiko import SSHClient from scp import SCPClient ssh = SSHClient() ssh.load_system_host_keys() ssh.connect('example.com') with SCPClient(ssh.get_transport()) as scp: scp.put('test.txt', 'test2.txt') scp.get('test2.txt') 

您可以使用软件包subprocess和命令调用从shell中使用scp命令。

 from subprocess import call cmd = "scp user1@host1:files user2@host2:files" call(cmd.split(" ")) 

嗯,也许另一种select是使用类似sshfs的东西(也有Mac的sshfs )。 一旦你的路由器被安装,你可以直接复制文件。 我不确定这是否适合您的特定应用程序,但这是保持方便的一个很好的解决scheme。

我前一阵子,我放在一个python SCP副本剧本依赖于paramiko。 它包括代码来处理与私钥或SSH密钥代理的连接,并回退到密码validation。

http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/

如果你在* nix你可以使用sshpass

 sshpass -p password scp -o User=username -o StrictHostKeyChecking=no src dst:/path 

我不认为有任何一个模块,您可以轻松地下载来实现scp,但是你可能会发现这有帮助: http : //www.ibm.com/developerworks/linux/library/l-twist4.html