在Python中scp文件的最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')

当前回答

您可以使用包子进程和命令调用从shell中使用scp命令。

from subprocess import call

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

其他回答

看看面料。转印。

from fabric import Connection

with Connection(host="hostname", 
                user="admin", 
                connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}
               ) as c:
    c.get('/foo/bar/file.txt', '/tmp/')

不久前,我把一个依赖于paramiko的python SCP复制脚本放在一起。它包括使用私钥或SSH密钥代理处理连接的代码,并退回到密码身份验证。

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

嗯,也许另一个选择是使用类似sshfs的东西(Mac也有sshfs)。一旦你的路由器挂载,你可以直接复制文件。我不确定这是否适用于你的特定应用,但这是一个很好的解决方案。

试试Paramiko的Python scp模块。它很容易使用。示例如下:

import paramiko
from scp import SCPClient

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代码)