पायथन में SFTP? (स्वतंत्र मंच)


181

मैं एक सरल टूल पर काम कर रहा हूं, जो फाइलों को हार्ड-कोडित स्थान पर पासवर्ड के साथ स्थानांतरित करता है और हार्ड-कोडित भी है। मैं एक अजगर नौसिखिया हूँ, लेकिन 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.'

एक बार फिर धन्यवाद!


1
धन्यवाद ! 5 मिनट में काम करने वाली एक SFTP अपलोड स्क्रिप्ट मिली :)
Ohad Schneider

1
मूल प्रश्न पर सिर्फ एक सामान्य टिप्पणी है कि अजगर ftplib भी FTPS के लिए समर्थन है - TLS en.m.wikipedia.org/wiki/FTPS पर ftp । एफटीपीएस सर्वर यकीनन यूनिक्स दुनिया में कम उपयोग किए जाते हैं, आंशिक रूप से एसएस / एसटीपी की सर्वव्यापीता के कारण, हालांकि, एसएफटीपी सर्वर विंडोज वातावरण में बहुत कम मौजूद हैं, जहां एफटीपीएस अधिक आम है।
Gnudiff

ऐसा लगता है कि Python 3.2 में एक विस्तारित वर्ग स्रोत के साथ FTPS समर्थन जोड़ा गया था : वर्ग ftplib.FTP_TLS (होस्ट = '', उपयोगकर्ता = '', पासवार्ड = '', acct = '', keyfile = कोई नहीं, प्रमाणिक = कोई नहीं, संदर्भ = कोई नहीं, मध्यांतर = कोई नहीं, source_address = कोई नहीं)
mgrollins

जवाबों:


109

Paramiko SFTP को सपोर्ट करता है। मैंने इसका उपयोग किया है, और मैंने मुड़ का उपयोग किया है। दोनों में अपनी जगह है, लेकिन शायद आपको परमिको के साथ शुरुआत करना आसान लगे।


2
येप, पारमिको जाने का रास्ता है (सुपर इजी टू यूज़), इसकी थोड़ी सी पेचीदा चीज़ पाइक्रिप्टो के विंडोज़ पैकेज को खोजने के लिए है जो एक निर्भरता है।
मौली

धन्यवाद। रीडमी में इंस्टॉलेशन निर्देशों की कमी के कारण पैकेज को स्थापित करने का तरीका जानने में मुझे थोड़ा समय लगा, लेकिन यह वही था जो मुझे चाहिए था!
मार्क विल्बर

15
Bitprophet.org/blog/2012/09/29/paramiko-and-ssh देखें जिसमें जेफ फॉरेस्टर बताते हैं कि ssh अप्रचलित है और पैरामीको आगे का रास्ता है।
क्रिस्टोफर महान

2
वहाँ भी है code.google.com/p/pysftp जो Paramiko पर आधारित है, लेकिन आसान उपयोग करने के लिए
franzlorenzon


78

आपको 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.'

4
withउदाहरण के लिए वोट करें
रोमन पोडलिनोव

2
pip install pysftp
बॉब स्टीन

2
क्या ज्ञात मेजबानों में नए sftp होस्ट को स्वचालित रूप से जोड़ने का विकल्प है?
user443854

1
@ user443854 हाँ वहाँ pysftp.readthedocs.io/en/release_0.2.9// है, लेकिन मैं निश्चित रूप से यह अनुशंसा नहीं करूंगा, हालांकि आप एक और
ज्ञात_होस्ट

15

यदि आप आसान और सरल चाहते हैं, तो आप फैब्रिक को भी देखना चाह सकते हैं । यह रूबी कैपिस्ट्रानो की तरह एक स्वचालित तैनाती उपकरण है, लेकिन सरल और निश्चित रूप से पायथन के लिए है। यह परमिको के ऊपर बना है।

आप 'स्वचालित परिनियोजन' नहीं करना चाहते हैं, लेकिन फैब्रिक आपके उपयोग के मामले को पूरी तरह से कम नहीं करेगा। आपको यह दिखाने के लिए कि फैब्रिक कितना सरल है: आपकी स्क्रिप्ट के लिए फैब फ़ाइल और कमांड इस तरह दिखाई देगी (परीक्षण नहीं किया गया, लेकिन 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 -f fab_putfile.py put_file:file=./path/to/my/file

और आपने कल लिया! :)


12

यहाँ एक नमूना है जो 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

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

अधिक कमांड और यहां PySFTP के बारे में ।


srv.get(file_path) # Download a file from remote serverक्या आप बता सकते हैं कि यह फ़ाइल को कहाँ से डाउनलोड करता है?
मार्कस मेस्कैन

क्या आपने आपके द्वारा निष्पादित स्थानीय के लिए प्रयास किया था?
राडेक

हाँ, लेकिन फ़ाइल सिस्टम पर कहाँ? सब कुछ सफलतापूर्वक हो जाता है, लेकिन मुझे लगता है कि कहीं से भी फ़ाइल नहीं मिल रही है।
मार्कस मेस्कैनन

क्षमा करें, मेरा मतलब स्थानीय dir था। अपने घर से लिपि को निष्पादित करने की कोशिश करें और देखें कि क्या फ़ाइल है।
राडेक

3

ट्विस्टेड आप जो कर रहे हैं उससे आपको मदद मिल सकती है, उनके डॉक्यूमेंटेशन देखें, बहुत सारे उदाहरण हैं। इसके अलावा यह एक बड़े डेवलपर / उपयोगकर्ता समुदाय के पीछे एक परिपक्व उत्पाद है।



1

RSA कुंजी के साथ फिर यहां देखें

स्निपेट:

import pysftp
import paramiko
from base64 import decodebytes

keydata = b"""L+WsiL5VL51ecJi3LVjmblkAdUTU+xbmXmUArIU5+8N6ua76jO/+T""" 
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)

0

ऐसे उत्तरों का एक समूह है जो 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


0

परमिको इतना धीमा है। उपप्रोसेस और शेल का उपयोग करें, यहाँ एक उदाहरण है:

remote_file_name = "filename"
remotedir = "/remote/dir"
localpath = "/local/file/dir"
    ftp_cmd_p = """
    #!/bin/sh
    lftp -u username,password sftp://ip:port <<EOF
    cd {remotedir}
    lcd {localpath}
    get {filename}
    EOF
    """
subprocess.call(ftp_cmd_p.format(remotedir=remotedir,
                                 localpath=localpath,
                                 filename=remote_file_name 
                                 ), 
                shell=True, stdout=sys.stdout, stderr=sys.stderr)

सवाल "पायथन" के बारे में है, जो आम तौर पर उस के भीतर चिपके हुए हैं - खासकर जब ऐसा करने के लिए बहुत सारे विकल्प हैं। अधिक महत्वपूर्ण बात यह है कि, यह "प्लेटफ़ॉर्म स्वतंत्र" कहता है। मैं यह नहीं कह सकता कि आपका जवाब तेजी से काम करता है या नहीं। शायद?
बुविएनज

0

अपने sshfs के साथ PyFilesystem एक विकल्प है। यह हुड के नीचे पैरामिको का उपयोग करता है और शीर्ष पर एक अच्छा पटलफॉर्म स्वतंत्र इंटरफ़ेस प्रदान करता है।

import fs

sf = fs.open_fs("sftp://[user[:password]@]host[:port]/[directory]")
sf.makedir('my_dir')

या

from fs.sshfs import SSHFS
sf = SSHFS(...

-1

आप pexpect मॉड्यूल का उपयोग कर सकते हैं

यहाँ एक अच्छा परिचय पोस्ट है

child = pexpect.spawn ('/usr/bin/sftp ' + user@ftp.site.com )
child.expect ('.* password:')
child.sendline (your_password)
child.expect ('sftp> ')
child.sendline ('dir')
child.expect ('sftp> ')
file_list = child.before
child.sendline ('bye')

मैंने इसका परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.