Python中的SFTP?(独立于平台)

Mar*_*bur 168 python sftp

我正在研究一种简单的工具,它将文件传输到硬编码的位置,密码也是硬编码的.我是一个python新手,但多亏了ftplib,很简单:

import ftplib

info= ('someuser', 'password')    #hard-coded

def putfile(file, site, dir, user=(), verbose=True):
    """
    upload a file by ftp to a site/directory
    login hard-coded, binary transfer
    """
    if verbose: print 'Uploading', file
    local = open(file, 'rb')    
    remote = ftplib.FTP(site)   
    remote.login(*user)         
    remote.cwd(dir)
    remote.storbinary('STOR ' + file, local, 1024)
    remote.quit()
    local.close()
    if verbose: print 'Upload done.'

if __name__ == '__main__':
    site = 'somewhere.com'            #hard-coded
    dir = './uploads/'                #hard-coded
    import sys, getpass
    putfile(sys.argv[1], site, dir, user=info)
Run Code Online (Sandbox Code Playgroud)

问题是我找不到任何支持sFTP的库.安全地做这样的事情的正常方法是什么?

编辑:感谢这里的答案,我已经让它与Paramiko合作,这就是语法.

import paramiko

host = "THEHOST.com"                    #hard-coded
port = 22
transport = paramiko.Transport((host, port))

password = "THEPASSWORD"                #hard-coded
username = "THEUSERNAME"                #hard-coded
transport.connect(username = username, password = password)

sftp = paramiko.SFTPClient.from_transport(transport)

import sys
path = './THETARGETDIRECTORY/' + sys.argv[1]    #hard-coded
localpath = sys.argv[1]
sftp.put(localpath, path)

sftp.close()
transport.close()
print 'Upload done.'
Run Code Online (Sandbox Code Playgroud)

再次感谢!

Bri*_*per 103

Paramiko支持SFTP.我用过它,而且我用过Twisted.两者都有自己的位置,但您可能会发现从Paramiko开始更容易.

  • 请参阅http://bitprophet.org/blog/2012/09/29/paramiko-and-ssh/,其中Jeff Forcier解释说ssh已经过时,而paramiko是前进的方向. (15认同)
  • yepp,paramiko是要走的路(超级好用),找到一个依赖的pycrypto的windows包有点棘手. (2认同)
  • 还有http://code.google.com/p/pysftp/这是基于Paramiko,但更容易使用 (2认同)
  • [始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。](https://stackoverflow.com/help/how-to-answer) (2认同)

Dun*_* MT 64

您应该查看pysftp https://pypi.python.org/pypi/pysftp 它取决于paramiko,但是将大多数常见用例包含在几行代码中.

import pysftp
import sys

path = './THETARGETDIRECTORY/' + sys.argv[1]    #hard-coded
localpath = sys.argv[1]

host = "THEHOST.com"                    #hard-coded
password = "THEPASSWORD"                #hard-coded
username = "THEUSERNAME"                #hard-coded

with pysftp.Connection(host, username=username, password=password) as sftp:
    sftp.put(localpath, path)

print 'Upload done.'
Run Code Online (Sandbox Code Playgroud)

  • 我认为如果这个答案透露回答者是所推荐软件的作者和唯一维护者,那就太好了。但该用户似乎已经停止使用 SO 并停止在“pysftp”上工作。 (8认同)
  • 在示例中为"with"投票 (4认同)
  • 警告: pysftp 似乎不再活跃。他们网站上问题跟踪器的链接已损坏(表示未设置)。我发现了一个错误,正在尝试找出记录它并修复它的最佳方法,但它似乎已经 4 年多没有更新了 (4认同)
  • `pip install pysftp` (2认同)
  • 是否可以选择自动将新的sftp主机添加到已知主机? (2认同)

hop*_*pla 15

如果您想要简单易用,您可能还想看看Fabric.它是一个自动化的部署工具,如Ruby的Capistrano,但更简单,也适用于Python.它建立在Paramiko之上.

您可能不想进行"自动部署",但Fabric完全适合您的用例.为了向您展示Fabric的简单性:您的脚本的fab文件和命令将如下所示(未经过测试,但99%确定它可以正常工作):

fab_putfile.py:

from fabric.api import *

env.hosts = ['THEHOST.com']
env.user = 'THEUSER'
env.password = 'THEPASSWORD'

def put_file(file):
    put(file, './THETARGETDIRECTORY/') # it's copied into the target directory
Run Code Online (Sandbox Code Playgroud)

然后使用fab命令运行该文件:

fab -f fab_putfile.py put_file:file=./path/to/my/file
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了!:)


rad*_*tek 9

以下是使用pysftp和私钥的示例.

import pysftp

def upload_file(file_path):

    private_key = "~/.ssh/your-key.pem"  # can use password keyword in Connection instead
    srv = pysftp.Connection(host="your-host", username="user-name", private_key=private_key)
    srv.chdir('/var/web/public_files/media/uploads')  # change directory on remote server
    srv.put(file_path)  # To download a file, replace put with get
    srv.close()  # Close connection
Run Code Online (Sandbox Code Playgroud)

pysftp是一个易于使用的sftp模块,它使用paramiko和pycrypto.它为sftp提供了一个简单的接口.使用pysftp可以做的其他事情非常有用:

data = srv.listdir()  # Get the directory and file listing in a list
srv.get(file_path)  # Download a file from remote server
srv.execute('pwd') # Execute a command on the server
Run Code Online (Sandbox Code Playgroud)

这里有更多命令和PySFTP .


小智 7

fsspec是一个很好的选择,它提供了一个类似于sftp实现的文件系统。

from fsspec.implementations.sftp import SFTPFileSystem
fs = SFTPFileSystem(host=host, username=username, password=password)

# list a directory
fs.ls("/")

# open a file
with fs.open(file_name) as file:
    content = file.read()
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是,fsspec 在实现中使用了 paramiko 。


Abh*_*eet 5

使用 RSA Key 然后参考这里

片段:

import pysftp
import paramiko
from base64 import decodebytes

keydata = b"""AAAAB3NzaC1yc2EAAAADAQABAAABAQDl""" 
key = paramiko.RSAKey(data=decodebytes(keydata)) 
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add(host, 'ssh-rsa', key)


with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts) as sftp:   
  with sftp.cd(directory):
    sftp.put(file_to_sent_to_ftp)
Run Code Online (Sandbox Code Playgroud)