How to scp in python?

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

What's the most pythonic way to scp a file in Python? The only route I'm aware of is

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

which is a hack, and which doesn't work outside linux-like systems, and which needs help from the Pexpect module to avoid password prompts unless you already have passwordless SSH set up to the remote host.

I'm aware of Twisted's conch, but I'd prefer to avoid implementing scp myself via low-level ssh modules.

I'm aware of paramiko, a Python module that supports ssh and sftp; but it doesn't support scp.

Background: I'm connecting to a router which doesn't support sftp but does support ssh/scp, so sftp isn't an option.

EDIT: This is a duplicate of How to copy a file to a remote server in Python using SCP or SSH?. However, that question doesn't give an scp-specific answer that deals with keys from within python. I'm hoping for a way to run code kind of like

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

回答1:

Try the module paramiko_scp. It's very easy to use. See the following example:

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()) 

Then call scp.get() or scp.put() to do scp operations.

(SCPClient code)



回答2:

You might be interested in trying Pexpect (SourceForge project). This would allow you to deal with interactive prompts for your password.

Here's a snip of example usage (for ftp) from the main website:

    # 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:

You could also check out paramiko. There's no scp module (yet), but it fully supports sftp.

[EDIT] Sorry, missed the line where you mentioned paramiko. The following module is simply an implementation of the scp protocol for paramiko. If you don't want to use paramiko or conch (the only ssh implementations I know of for python), you could rework this to run over a regular ssh session using pipes.

scp.py for paramiko



回答4:

if you install putty on win32 you get an pscp (putty scp).

so you can use the os.system hack on win32 too.

(and you can use the putty-agent for key-managment)


sorry it is only a hack (but you can wrap it in a python class)



回答5:

Couldn't find a straight answer, and this "scp.Client" module doesn't exist. Instead, this suits me:

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:

It has been quite a while since this question was asked, and in the meantime, another library that can handle this has cropped up: You can use the copy function included in the Plumbum library:

import plumbum r = plumbum.machines.RemoteMachine("example.net",  user="username", keyfile=".ssh/some_key") fro = plumbum.local.path("some_file") to = r.path("/path/to/destination/") plumbum.path.utils.copy(fro, to) 


回答7:

Have a look at fabric. An example can be found here.



回答8:

You can use the package subprocess and the command call to use the scp command from the shell.

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


回答9:

Hmmm, perhaps another option would be to use something like sshfs (there an sshfs for Mac too). Once your router is mounted you can just copy the files outright. I'm not sure if that works for your particular application but it's a nice solution to keep handy.



回答10:

I while ago I put together a python SCP copy script that depends on paramiko. It includes code to handle connections with a private key or SSH key agent with a fallback to password authentication.

http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/



回答11:

If you are on *nix you can use sshpass

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


回答12:

I don't think there's any one module that you can easily download to implement scp, however you might find this helpful: http://www.ibm.com/developerworks/linux/library/l-twist4.html



文章来源: How to scp in python?
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!