পাইথনে স্কিপ কিভাবে?


158

পাইথনে কোনও ফাইল স্ক্রিপের সবচেয়ে অজগর উপায় কী? আমি সচেতন একমাত্র পথ

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

যা একটি হ্যাক, এবং যা লিনাক্সের মতো সিস্টেমের বাইরে কাজ করে না, এবং পাসওয়ার্ড প্রম্পটগুলি এড়ানোর জন্য যা আপনার ইতিমধ্যে পাসওয়ার্ডবিহীন এসএসএইচ দূরবর্তী হোস্টে সেট আপ না করা রয়েছে তার জন্য প্যাকপেক্ট মডিউলটির সহায়তা প্রয়োজন।

আমি টুইস্টেড সম্পর্কে সচেতন conch, তবে আমি নিম্ন স্তরের এসএসএস মডিউলগুলির মাধ্যমে নিজেকে স্কিপ প্রয়োগ করা এড়াতে পছন্দ করব।

আমি অবগত paramiko, একটি পাইথন মডিউল যা এসএসএইচ এবং এসএফটিপি সমর্থন করে; তবে এটি এসসিপি সমর্থন করে না।

পটভূমি: আমি এমন রাউটারের সাথে সংযোগ করছি যা এসএফটিপি সমর্থন করে না তবে এসএসএইচ / এসসিপি সমর্থন করে, তাই এসএফটিপি কোনও বিকল্প নয়।

সম্পাদনা : এটি এসপিপি বা এসএসএইচ ব্যবহার করে পাইথনের রিমোট সার্ভারে কোনও ফাইল কীভাবে অনুলিপি করবেন তার নকল এটি ? তবে , এই প্রশ্নটি কোনও স্কেপ-নির্দিষ্ট উত্তর দেয় না যা পাইথনের মধ্যে থেকে কীগুলি নিয়ে কাজ করে। আমি এমন ধরণের কোড চালানোর জন্য আশা করছি

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

উত্তর:


106

ব্যবহার করে দেখুন Paramiko জন্য পাইথন scp কমান্ড মডিউল । এটি ব্যবহার করা খুব সহজ। নিম্নলিখিত উদাহরণটি দেখুন:

import paramiko
from scp import SCPClient

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

তারপরে এসসিপি অপারেশনগুলি কল scp.get()বা scp.put()করতে to

( এসসিপি ক্লায়েন্ট কোড )


3
যে মডিউলটি আসলে প্যারামিকো ব্যবহার করে না - এটি প্রচুর কোড যা scpশেষ পর্যন্ত scpকমান্ড লাইনটি কল করে যা কেবল * নিক্সে কাজ করে।
নিক বেস্টিন

8
সম্মত হয়েছি, আপনি সোর্স কোডটিতে যা দেখছেন তা হ'ল দূরবর্তী কল scp -tবা scp -f('থেকে' এবং 'মোডগুলি, যা এই সার্ভার-পাশের উদ্দেশ্যে রয়েছে)। এটি মূলত স্ক্রিপ কীভাবে কাজ করে - এটি সার্ভারে বিদ্যমান স্ক্যাপের অন্য অনুলিপিটির উপর নির্ভর করে। এই নিবন্ধটি এটি খুব ভালভাবে ব্যাখ্যা করেছে: ব্লগস.অরাকল.com
জানপ

8
এই সমাধানটি আমার পক্ষে দুটি ক্যাভেটের সাথে কাজ করেছে: ১. আমি যে আমদানি বিবৃতিগুলি ব্যবহার করেছি import paramiko from scp import SCPClientএটি হ'ল : ২. এখানে scp.get () কমান্ডের একটি উদাহরণ রয়েছে:scp.get(r'/nfs_home/appers/xxxx/test2.txt', r'C:\Users\xxxx\Desktop\MR_Test')
ক্রিস নিলসেন

এটি কেবল দুর্দান্ত কাজ করে না, তবে এসএসএইচ কীগুলির বিদ্যমান থাকলে তাদের সুবিধাও নেয়।
মার্সেল উইলসন

নোট করুন যে আপনি pip install scpপিআইপিআই থেকে এই লিবিটি ইনস্টল করতে পারেন: এই লিখন হিসাবে 0.10.2 সংস্করণে।
অ্যান্ড্রু বি।

15

আপনি পেক্সপ্যাক্ট ( উত্স কোড ) চেষ্টা করে দেখতে আগ্রহী হতে পারেন । এটি আপনাকে আপনার পাসওয়ার্ডের জন্য ইন্টারেক্টিভ প্রম্পটগুলির সাথে ডিল করতে দেয়।

মূল ওয়েবসাইট থেকে উদাহরণস্বরূপ ব্যবহারের একটি স্নিপ এখানে রয়েছে (ftp এর জন্য):

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

11

আপনিও পরমিকো পরীক্ষা করে দেখতে পারেন । কোনও স্ক্রিপ মডিউল নেই (এখনও), তবে এটি সম্পূর্ণরূপে এসএফটিপি সমর্থন করে।

[সম্পাদনা] দুঃখিত, আপনি যে পংক্তিটি প্যারামিকোর উল্লেখ করেছেন তা মিস করেছেন। নিম্নলিখিত মডিউলটি কেবল প্যারামিকোর জন্য স্কিপ প্রোটোকলের একটি বাস্তবায়ন। আপনি যদি প্যারামিকো বা শঙ্খ ব্যবহার করতে না চান (পাইথনের জন্য আমি জানি একমাত্র ssh বাস্তবায়ন), আপনি পাইপ ব্যবহার করে নিয়মিত ssh অধিবেশন চালানোর জন্য এটি পুনরায় কাজ করতে পারেন।

parapiko জন্য scp.py


আপনি কি বলছেন যে সংযুক্ত সমাধানটি sshd চলমান কোনও মেশিনে নিরাপদে ফাইল স্থানান্তর করবে? ঠিক এটিই আমি যা খুঁজছি, তবে আমি আপনার মন্তব্য থেকে বলতে পারছি না যে এটি কেবল স্কেপ্ট-এর মতো মুখোমুখিভাবে এসফ্টপটি আবৃত করে whether
মাইকেল গুন্ডল্যাচ

2
এটি sshd চলমান যে কোনও মেশিনের সাথে ফাইলগুলি স্থানান্তর করবে, যা PATH- এ স্ক্রিপ রয়েছে (scp এসএসএস স্পেকের অংশ নয়, তবে এটি মোটামুটি সর্বব্যাপী)। এটি সার্ভারে "scp -t" কে আহ্বান করে এবং ফাইল স্থানান্তর করতে scp প্রোটোকল ব্যবহার করে, যার এসফটিপির সাথে কোনও সম্পর্ক নেই।
জিমবি

1
দয়া করে মনে রাখবেন যে আমি স্ক্যান্ডের ওপেনশার প্রয়োগটিকে মডেল হিসাবে ব্যবহার করেছি, সুতরাং এটি অন্যান্য সংস্করণগুলির সাথে কাজ করার গ্যারান্টিযুক্ত নয়। Sshd এর কিছু সংস্করণে scp2 প্রোটোকলও ব্যবহার করা যেতে পারে যা মূলত sftp এর মতো।
জিমবি

আপনি দয়া করে এই প্রশ্ন দেখতে পাবেন যায়নি: stackoverflow.com/questions/20111242/... আমি paramiko ব্যবহারসমূহ subprocess অবাক হচ্ছি বা সকেট মত অন্য comething। ক্লোন / কাঁটা সমস্যার কারণে আমি সাবপ্রোসেস.সেক_আউটপুট ('ssh blah@blah.com "বিড়াল / ডেটা / ফাইল *") ব্যবহার করে মেমরির সমস্যাগুলি নিয়ে আসছি এবং ভাবছি যে পরমিকোতে একই সমস্যা থাকবে কিনা?
পল

1
@ পল: প্যারামিকোতে একই সমস্যা হবে না, কারণ এটি সাবপ্রসেস ব্যবহার করে না।
জিমবি

9

সরল উত্তর খুঁজে পাওয়া যায় নি, এবং এই "scp.Client" মডিউলটি বিদ্যমান নেই। পরিবর্তে, এটি আমার অনুসারে:

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

যদি আপনি win32 এ পুটি ইনস্টল করেন তবে আপনি একটি পিএসএসপি পাবেন (পুটি স্কিপ)

সুতরাং আপনি win32 এও os.sstm হ্যাক ব্যবহার করতে পারেন।

(এবং আপনি কী-ম্যানেজমেন্টের জন্য পুট্টি-এজেন্ট ব্যবহার করতে পারেন)


দুঃখিত এটি কেবল একটি হ্যাক (তবে আপনি এটি একটি অজগর শ্রেণিতে আবদ্ধ করতে পারেন)


'নিক্স ওয়ান' কাজ করার একমাত্র কারণ, আপনার পথে এসসিপি রয়েছে; যেমন ব্লাউহর দেখায়, এটি ঠিক করা খুব বেশি কঠিন নয়। +1
ওজরাক

6

শেল থেকে scp কমান্ডটি ব্যবহার করতে আপনি প্যাকেজ সাবপ্রসেস এবং কমান্ড কলটি ব্যবহার করতে পারেন।

from subprocess import call

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

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

5

আজকের হিসাবে, সম্ভবত সেরা সমাধান সম্ভবত AsyncSSH

https://asyncssh.readthedocs.io/en/latest/#scp-client

async with asyncssh.connect('host.tld') as conn:
    await asyncssh.scp((conn, 'example.txt'), '.', recurse=True)

1
ওহে. আপনি AsyncSSH সেরা হওয়া সম্পর্কে একটি দাবি করেছেন তবে আপনি কি এই দাবির পক্ষে সমর্থন দিতে কোনও বিবৃতি বা 2 জবাব দিতে পারবেন? হতে পারে এটিকে scp () থেকে আলাদা করুন, বা এটি আপনার ব্যবহারের ক্ষেত্রে কীভাবে গুরুত্বপূর্ণ। (এটি বলেছে, এটি যথেষ্ট কম কোড - কমপক্ষে আপনার উদাহরণে)
স্কট প্রাইভ

2
@ ক্রসফিট_আর_ বিয়ার হ্যালো তাই আমি বলেছিলাম "সম্ভবত সেরা", আমি কারও কাছে রায় দেব :) এসইএনএসএসএইচকে অন্যান্য লাইব্রেরির সাথে তুলনা করার জন্য আমার এখনই খুব বেশি সময় নেই। তবে খুব তাড়াতাড়ি: এটি ব্যবহার করা সহজ, এটি অবিচ্ছিন্ন, এটি রক্ষণাবেক্ষণ করা হয়েছে এবং মেনটেনারটি খুব সুন্দর এবং সহায়ক, এটি বেশ সম্পূর্ণ এবং খুব ভাল নথিভুক্ত।
Loïc

5

কটাক্ষপাত আছে fabric.transfer

from fabric import Connection

with Connection(host="hostname", 
                user="admin", 
                connect_kwargs={"key_filename": "/home/myuser/.ssh/private.key"}
               ) as c:
    c.get('/foo/bar/file.txt', '/tmp/')

2
আপনি আরো নির্দিষ্ট হতে পারে?
নিক টি

4

এই প্রশ্নটি জিজ্ঞাসা করার পরে বেশ কিছুক্ষণ হয়ে গেছে, এবং এরই মধ্যে, অন্য একটি গ্রন্থাগার এটি পরিচালনা করতে পারে: আপনি প্লাম্বাম লাইব্রেরিতে অন্তর্ভুক্ত অনুলিপিটি ব্যবহার করতে পারেন :

import plumbum
r = plumbum.machines.SshMachine("example.net")
   # this will use your ssh config as `ssh` from shell
   # depending on your config, you might also need additional
   # params, eg: `user="username", keyfile=".ssh/some_key"`
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)

প্লাম্বামের সাথে কীভাবে আমি ব্যক্তিগত কীটির পাসফ্রেজ প্রবেশ করতে পারি? পি
একতা

@ এেকটা: আপনাকে কমান্ড লাইনে অনুরোধ করা হবে। আপনি যদি এটি নিজের কোড থেকে সরবরাহ করতে চান তবে আমার মনে হয় না প্লাম্বামের এপিআই এটি সমর্থন করে। তবে প্লাম্বামের SshMachineঅ্যাক্সেস রয়েছে ssh-agent, সুতরাং আপনি যদি প্রতিবার এটি টাইপ করা এড়াতে চান তবে এটি করার এক উপায়। আপনি প্লাম্বামের গিথব পৃষ্ঠায় একটি বৈশিষ্ট্য অনুরোধও ফাইল করতে পারেন।
20:53


2
import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

client.connect('<IP Address>', username='<User Name>',password='' ,key_filename='<.PEM File path')

#Setup sftp connection and transmit this script 
print ("copying")

sftp = client.open_sftp() 
sftp.put(<Source>, <Destination>)


sftp.close()

আপনি যদি আপনার উত্তরের জন্য কিছু মন্তব্য যুক্ত করে থাকেন তবে কেন আপনার সমাধানটি ভাল। এবং আপনার অন্যান্য সমাধানের সাথে পাঠকদের এটি তুলনা করতে সহায়তা করবে। স্রেফ পোস্টিং কোডটি সবসময় শিখনকে কীভাবে আরও ভাল সমাধানগুলি সনাক্ত করতে হয় তা জানতে সহায়তা করে না।
ব্রায়ান টম্পसेट -

এটি এসসিটিপি, এসসিপি নয়।
মার্টিন প্রিক্রিল

1

হুঁ, সম্ভবত অন্য বিকল্পটি হবে এসএসএফএসের মতো কিছু ব্যবহার করা ( ম্যাকের জন্য সেখানে একটি এসএসএফও আছে )। আপনার রাউটারটি মাউন্ট হয়ে গেলে আপনি কেবল ফাইলগুলি এককভাবে অনুলিপি করতে পারেন। এটি আপনার নির্দিষ্ট অ্যাপ্লিকেশনটির জন্য কাজ করে কিনা আমি নিশ্চিত নই তবে এটি সহজ রাখার একটি দুর্দান্ত সমাধান।


1

আমি যখন আগে আমি পাইথন এসসিপি অনুলিপি স্ক্রিপ্ট একসাথে রেখেছিলাম যা পরামিকোর উপর নির্ভর করে। এটিতে পাসওয়ার্ড প্রমাণীকরণের ফ্যালব্যাক সহ একটি ব্যক্তিগত কী বা এসএসএইচ কী এজেন্টের সাথে সংযোগগুলি পরিচালনা করার কোড অন্তর্ভুক্ত রয়েছে।

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


লিঙ্কটির জন্য এবং পরমাইকো ব্যবহারের ভাল উদাহরণ প্রকাশ করতে সময় দেওয়ার জন্য ধন্যবাদ।
পিটার এম - মনিকা

-2

আমি মনে করি না যে কোনও একটি মডিউল রয়েছে যা আপনি সহজেই স্কিপ বাস্তবায়নের জন্য ডাউনলোড করতে পারেন তবে আপনি এটি সহায়ক মনে করতে পারেন: http://www.ibm.com/developerworks/linux/library/l-twist4.html

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