当前位置:  开发笔记 > 编程语言 > 正文

如何在python scp?

如何解决《如何在pythonscp?》经验,为你挑选了7个好方法。

在Python中scp文件的最pythonic方法是什么?我所知道的唯一途径是

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

这是一个hack,并且在类似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')

小智.. 93

试试模块paramiko_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代码)



1> 小智..:

试试模块paramiko_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代码)


同意,你在源代码中看到的是远程调用`scp -t`或`scp -f`('to'和'from'模式,这是为了服务器端目的而存在的).这实质上就是scp的工作原理 - 它依赖于服务器上现有的另一个scp副本.本文非常好地解释了它:https://blogs.oracle.com/janp/entry/how_the_scp_protocol_works
这个解决方案对我有两点需要注意:1.这些是我使用的import语句:`import paramiko``来自scp import SCPClient` 2.这是scp.get()命令的一个例子:`scp.get(r '/nfs_home/appers/xxxx/test2.txt',r'C:\ Users\xxxx\Desktop\MR_Test')`
除了该模块实际上并没有使用paramiko之外-许多代码最终使scp最终实际上调用了仅在* nix上可用的scp命令行。
@Nick Bastin,在linux和windows上都很棒

2> Pat Notz..:

您可能对尝试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')



3> JimB..:

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

[编辑]抱歉,错过了你提到paramiko的路线.以下模块只是paramiko的scp协议的一个实现.如果你不想使用paramiko或conch(我知道python的唯一ssh实现),你可以重做这个以使用管道运行常规ssh会话.

用于paramiko的scp.py


这将使用运行sshd的任何机器传输文件,该机器在PATH中有scp(scp不是ssh规范的一部分,但它相当普遍).这会在服务器上调用"scp -t",并使用scp协议传输文件,这与sftp无关.

4> Blauohr..:

如果你在win32上安装putty你得到一个pscp(putty scp).

所以你也可以在win32上使用os.system hack.

(并且您可以使用油灰剂进行密钥管理)


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



5> Maviles..:

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



6> user443854..:

看一下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/')


你可以再详细一点吗?

7> 小智..:

您可以使用包子进程和命令调用来从外壳程序使用scp命令。

from subprocess import call

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


这与提问者提到的基本案例有何本质区别?是的,子进程比os.system更好,但是在两种情况下,它都无法在类似linux的系统之外运行,并且存在密码提示问题等。
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有