如何在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