如何在Python中scp?

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不是一个选项。

编辑 :这是如何使用SCP或SSH将文件复制到Python中的远程服务器的副本。 然而 ,这个问题并没有给出一个特定于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项目)。 这将允许您处理交互式提示输入密码。

以下是来自主网站的示例用法(对于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')

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

[编辑]对不起,错过了你提到paramiko的路线。 以下模块只是paramiko的scp协议的一个实现。 如果你不想使用paramiko或者conch(我知道的python中唯一的ssh实现),你可以重写这个以使用管道在普通的ssh会话上运行。

用于paramiko的scp.py

链接地址: http://www.djcxy.com/p/25717.html

上一篇: How to scp in python?

下一篇: Bash 'printf' equivalent for command prompt?