212

パスワードもハードコードされたハードコードされた場所にファイルを転送する簡単なツールに取り組んでいます。私は 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)

問題は、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.'

再度、感謝します!

4

11 に答える 11

122

Paramikoは SFTP をサポートしています。私はそれを使用し、Twisted を使用しました。どちらにもそれぞれの役割がありますが、Paramiko から始める方が簡単かもしれません。

于 2009-01-11T05:04:22.937 に答える
96

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.'
于 2014-05-27T23:05:35.770 に答える
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

次に、fab コマンドでファイルを実行します。

fab -f fab_putfile.py put_file:file=./path/to/my/file

そして、あなたは完了です!:)

于 2009-12-08T13:29:52.827 に答える
4

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

fsspec が実装で paramiko を使用していることにも注意してください。

于 2020-08-11T20:20:54.480 に答える
3

Twistedはあなたがやっていることを手助けしてくれます。彼らのドキュメントをチェックしてください。たくさんの例があります。また、大きな開発者/ユーザー コミュニティが背後にある成熟した製品でもあります。

于 2009-01-11T04:51:32.993 に答える
1

pysftp について言及している回答がたくさんあるので、pysftp のコンテキスト マネージャー ラッパーが必要な場合は、コードがさらに少なく、使用すると次のようになります。

path = "sftp://user:p@ssw0rd@test.com/path/to/file.txt"

# Read a file
with open_sftp(path) as f:
    s = f.read() 
print s

# Write to a file
with open_sftp(path, mode='w') as f:
    f.write("Some content.") 

(完全な) 例: http://www.prschmid.com/2016/09/simple-opensftp-context-manager-for.html

このコンテキスト マネージャーには、初めて接続できない場合に備えて自動再試行ロジックが組み込まれています (これは、実稼働環境で予想されるよりも驚くほど頻繁に発生します...)。

コンテキストマネージャーの要点open_sftp: https://gist.github.com/prschmid/80a19c22012e42d4d6e791c1e4eb8515

于 2016-11-28T22:41:46.323 に答える