在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')

当前回答

看看面料。转印。

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

其他回答

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

from subprocess import call

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

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

所以你可以用os。win32上的系统黑客。

(你可以使用putty-agent进行键管理)


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

这个问题被提出已经有一段时间了,与此同时,另一个可以处理这个问题的库突然出现了: 你可以使用Plumbum库中包含的复制函数:

import plumbum
r = plumbum.machines.SshMachine("example.net")
   # this will use your ssh config as `ssh` from shell
   # depending on your config, you might also need additional
   # params, eg: `user="username", keyfile=".ssh/some_key"`
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)

到目前为止,最好的解决方案可能是AsyncSSH

https://asyncssh.readthedocs.io/en/latest/#scp-client

async with asyncssh.connect('host.tld') as conn:
    await asyncssh.scp((conn, 'example.txt'), '.', recurse=True)

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

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