如何在Python中scp ?

在Python中scp文件的最Python化的方法是什么?我唯一知道的路线是

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

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

我知道Twisted的conch,但我更倾向于避免自己通过低级ssh模块实现scp。

我知道paramiko,一个Python模块,支持SSH和SFTP;但它不支持SCP。

背景:我正在连接到一个不支持SFTP但支持SSH/SCP的路由器,所以SFTP不是一个选项。

< p > 编辑: 这是如何在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')
353359 次浏览

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

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

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


抱歉,这只是一个hack (但你可以把它包装在python类中)

您可能对尝试Pexpect (源代码)感兴趣。这将允许您处理输入密码的交互式提示。

以下是来自主网站的ftp使用示例片段:

# This connects to the openbsd ftp site and
# downloads the recursive directory listing.
import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
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')

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

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

< p >[编辑] 抱歉,我忘了你提到帕拉米科了。 下面的模块只是paramiko的scp协议的实现。 如果你不想使用paramiko或conch(我所知道的python唯一的ssh实现),你可以重新工作,使用管道运行常规的ssh会话

scp.py for paramiko .py

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

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

看看fabric.transfer

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
自从这个问题被问到已经有一段时间了,与此同时,另一个可以处理这个问题的库突然出现了: 你可以使用库中包含的复制函数
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)

找不到一个直接的答案,而这个“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')

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

from subprocess import call


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

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

< a href = " https://asyncssh.readthedocs。io / en /最近/ # scp-client noreferrer“rel = > https://asyncssh.readthedocs.io/en/latest/ scp-client < / >

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


client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())


client.connect('<IP Address>', username='<User Name>',password='' ,key_filename='<.PEM File path')


#Setup sftp connection and transmit this script
print ("copying")


sftp = client.open_sftp()
sftp.put(<Source>, <Destination>)




sftp.close()