পাইথনে এসএফটিপি? (স্বাধীন প্ল্যাটফর্ম)


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)

সমস্যাটি হ'ল আমি এমন কোনও লাইব্রেরি খুঁজে পাচ্ছি না যা এসএফটিপি সমর্থন করে। নিরাপদে এই জাতীয় কিছু করার স্বাভাবিক উপায় কী?

সম্পাদনা করুন: উত্তরের জন্য ধন্যবাদ, আমি এটি প্যারামিকোর সাথে কাজ করেছিলাম এবং এটি বাক্য গঠন ছিল।

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 মিনিটের মধ্যে কাজ করে একটি এসএফটিপি আপলোড স্ক্রিপ্ট পেয়েছেন :)
ওহাদ স্নাইডার

1
TLS এর উপর FTP - শুধু মূল প্রশ্ন পাইথন ftplib এছাড়াও FTPS জন্য সমর্থন করেছে একটি সাধারণ নোট en.m.wikipedia.org/wiki/FTPS । ইউনিক্স বিশ্বে এফটিপিএস সার্ভারগুলি তাত্ক্ষণিকভাবে কম ব্যবহৃত হয়, আংশিকরূপে ssh / sftp এর সর্বস্বত্বের কারণে, তবে, উইন্ডোজের পরিবেশে sftp সার্ভারগুলি খুব কম উপস্থিত থাকে, যেখানে FTPS বেশি দেখা যায় common
Gnudiff

দেখে মনে হচ্ছে একটি প্রসারিত শ্রেণীর উত্সের সাথে পাইথন ৩.২ এ এফটিপিএস সমর্থন যুক্ত করা হয়েছে : শ্রেণি ftplib.FTP_TLS (হোস্ট = '', ব্যবহারকারীর = '', পাসডাব্লু = '', অ্যাক্ট = '', কীফাইল = কিছুই নেই, সার্টিফিল = কোনও নয়, প্রসঙ্গ = কোনওটিই নয়, সময়সীমা = কোনওটি নয়, উত্স_সংযোগ = কোনও নয়)
মাইক্রোলিনগুলি

উত্তর:


109

পরমিকো এসএফটিপি সমর্থন করে। আমি এটি ব্যবহার করেছি, এবং আমি টুইস্ট ব্যবহার করেছি। উভয়েরই জায়গা আছে তবে পরমিকো দিয়ে শুরু করা আপনার পক্ষে সহজ হতে পারে।


2
ইয়াপ্প, প্যারামিকো হ'ল উপায় (সুপার ব্যবহারের পক্ষে সহজ), পাইক্রিপ্টো এর উইন্ডোজ প্যাকেজটি খুঁজে পাওয়া কিছুটা জটিল, যা নির্ভরতা।
মৌলি

ধন্যবাদ. রিডমে ইনস্টলেশন সংক্রান্ত নির্দেশাবলীর অভাবে প্যাকেজটি কীভাবে ইনস্টল করতে হবে তা নির্ধারণ করতে আমার কিছুটা সময় লেগেছিল তবে এটি আমার প্রয়োজনের মতো ছিল!
মার্ক উইলবার

15
Bitprophet.org/blog/2012/09/29/paramiko-and-ssh দেখুন যাতে জেফ ফোরসিয়ার ব্যাখ্যা করেছেন যে ssh অপ্রচলিত এবং পরমিকো এগিয়ে যাওয়ার পথ।
ক্রিস্টোফার মাহান

2
এখানে কোড. google.com/p/pysftp যা প্যারামিকো ভিত্তিক, তবে ব্যবহার করা সহজ
franzlorenzon


76

আপনাকে পিসফ্টপ https://pypi.python.org/pypi/pysftp পরীক্ষা করা উচিত এটি প্যারামিকোর উপর নির্ভর করে, তবে বেশিরভাগ সাধারণ ব্যবহারের ক্ষেত্রে কেবল কয়েকটি লাইনের কোডগুলিকে আবৃত করে।

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
পরিচিত হোস্টগুলিতে স্বয়ংক্রিয়ভাবে নতুন এসএফপি হোস্ট যুক্ত করার কোনও বিকল্প আছে কি?
ব্যবহারকারী 443854

1
@ ব্যবহারকারী 443854 হ্যাঁ আছে pysftp.readthedocs.io/en/release_0.2.9/… তবে আমি অবশ্যই এটির সুপারিশ করব না, যদিও আপনি অন্য পরিচিত_হোস্ট ফাইল যুক্ত করতে পারেন
AsTeR

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

এখানে পাইসফ্টপ এবং একটি ব্যক্তিগত কী ব্যবহার করে একটি নমুনা দেওয়া হচ্ছে।

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

পাইসফটিপি হ'ল এসএফটিপি মডিউলটি প্যারামিকো এবং পাইক্রিপ্টো ব্যবহার করে। এটি এসফ্টপ করার জন্য একটি সাধারণ ইন্টারফেস সরবরাহ করে .. অন্যান্য জিনিস যা আপনি পাইফটিপ দিয়ে করতে পারেন যা বেশ কার্যকর:

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 বোঝানো হয়েছে। আপনার বাড়ির দির থেকে স্ক্রিপ্টটি কার্যকর করার চেষ্টা করুন এবং ফাইলটি আছে কিনা তা দেখুন।
Radtek

3

মোচড় দেওয়া আপনি যা করছেন তার সাথে আপনাকে সহায়তা করতে পারে, তাদের ডকুমেন্টেশনগুলি পরীক্ষা করে দেখুন, প্রচুর উদাহরণ রয়েছে। এছাড়াও এটির পিছনে একটি বড় বিকাশকারী / ব্যবহারকারী সম্প্রদায় সহ একটি পরিপক্ক পণ্য।



1

আরএসএ কী দিয়ে রেফার করুন এখানে এখানে করুন

স্নিপেট:

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

পাইস্টফটপ উল্লেখ করে এমন একাধিক উত্তর রয়েছে, সুতরাং আপনি যখন পিএসফটিপি-এর আশেপাশে একটি প্রসঙ্গ পরিচালককে র‌্যাপার চান, এখানে এমন একটি সমাধান রয়েছে যা ব্যবহার করার সময় নীচের মতো দেখতে শেষ হয়

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

PyFilesystem তার সঙ্গে sshfs এক বিকল্প। এটি হুডের নীচে প্যারামিকো ব্যবহার করে এবং শীর্ষে একটি ভাল পল্টফর্ম স্বতন্ত্র ইন্টারফেস সরবরাহ করে।

import fs

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

অথবা

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

-1

আপনি পেক্সপ্যাক্ট মডিউলটি ব্যবহার করতে পারেন

এখানে একটি ভাল পরিচয় পোস্ট

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

আমি এটি পরীক্ষা করিনি তবে এটি কাজ করা উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.