पाइथन में स्कैप कैसे करें?


158

पायथन में किसी फ़ाइल को स्कैन करने का सबसे पाइथोनिक तरीका क्या है? मुझे पता है कि एकमात्र मार्ग है

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

जो एक हैक है, और जो लिनक्स जैसी प्रणालियों के बाहर काम नहीं करता है, और जिसे पासवर्ड प्रॉम्प्ट से बचने के लिए Pexpect मॉड्यूल से मदद की ज़रूरत है जब तक कि आपके पास पहले से ही दूरस्थ होस्ट के लिए पासवर्ड रहित SSH न हो।

मुझे ट्विस्टेड के बारे में पता है conch, लेकिन मैं खुद को निम्न-स्तरीय ssh मॉड्यूल के माध्यम से scp को लागू करने से बचना पसंद करूंगा।

मैं paramikoएक पायथन मॉड्यूल से अवगत हूँ , जो SSH और SFTP का समर्थन करता है; लेकिन यह एससीपी का समर्थन नहीं करता है।

पृष्ठभूमि: मैं एक ऐसे रूटर से कनेक्ट कर रहा हूं जो SFTP का समर्थन नहीं करता है, लेकिन SSH / SCP का समर्थन करता है, इसलिए SFTP एक विकल्प नहीं है।

EDIT : यह SCP या SSH का उपयोग करके पायथन में किसी दूरस्थ सर्वर पर फ़ाइल की प्रतिलिपि बनाने का तरीका है? हालाँकि , यह प्रश्न एक विशिष्ट विवरण नहीं देता है जो कि पायथन के भीतर की चाबियों से संबंधित है। मैं तरह तरह के कोड चलाने के लिए उम्मीद कर रहा हूँ

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()एससीपी ऑपरेशन करें।

( SCPClient कोड )


3
सिवाय इसके कि मॉड्यूल वास्तव में paramiko का उपयोग नहीं करता है - यह कोड का एक बहुत कुछ है जो अंत में scpवास्तव में scpकमांड लाइन को कॉल करता है जो केवल * nix पर काम करता है।
निक बैस्टिन

8
सहमति, क्या आप स्रोत कोड में देख रहे हैं करने के लिए दूरस्थ कॉल है scp -tया scp -f(मोड है, जो इस सर्वर साइड उद्देश्य के लिए मौजूद हैं '' से '' और)। यह अनिवार्य रूप से कैसे scp काम करता है - यह सर्वर पर मौजूद scp की एक और प्रति पर निर्भर करता है। यह लेख इसे बहुत अच्छी तरह से समझाता है: blogs.oracle.com/janp/entry/how_the_scp_protocol_works
laher

8
इस समाधान ने मेरे लिए दो कैविटीज़ के साथ काम किया: 1. ये मेरे द्वारा उपयोग किए गए आयात विवरण हैं: import paramiko from scp import SCPClient2. यहाँ scp.get () कमांड का एक उदाहरण है:scp.get(r'/nfs_home/appers/xxxx/test2.txt', r'C:\Users\xxxx\Desktop\MR_Test')
क्रिस नीलसन

यह न केवल महान काम करता है, बल्कि एसएसएच कीज़ का भी लाभ उठाता है यदि वे मौजूद हैं।
मार्सेल विल्सन

ध्यान दें कि आप इस दायित्व को PyPI से भी स्थापित कर सकते हैं: pip install scpइस लेखन के रूप में संस्करण 0.10.2 पर।
एंड्रयू बी।

15

आपको Pexpect ( स्रोत कोड ) आज़माने में रुचि हो सकती है । यह आपको अपने पासवर्ड के लिए इंटरैक्टिव संकेतों से निपटने की अनुमति देगा।

यहाँ मुख्य वेबसाइट से उदाहरण उपयोग (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

तुम भी paramiko बाहर की जाँच कर सकते हैं । वहाँ कोई एसपीपी मॉड्यूल (अभी तक) है, लेकिन यह पूरी तरह से sftp का समर्थन करता है।

[संपादित करें] क्षमा करें, उस पंक्ति से चूक गए जहाँ आपने पैरामिको का उल्लेख किया था। निम्नलिखित मॉड्यूल बस paramiko के लिए scp प्रोटोकॉल का एक कार्यान्वयन है। यदि आप paramiko या conch (केवल ssh कार्यान्वयन जो मुझे अजगर के बारे में पता है) का उपयोग नहीं करना चाहते हैं, तो आप पाइप का उपयोग करके नियमित ssh सत्र चलाने के लिए इसे फिर से काम कर सकते हैं।

scam.py paramiko के लिए


क्या आप कह रहे हैं कि संलग्न समाधान सुरक्षित रूप से किसी भी मशीन पर sshd को फाइल ट्रांसफर करेगा, भले ही वह sftpd नहीं चल रहा हो? ठीक यही मैं देख रहा हूँ, लेकिन मैं आपकी टिप्पणी से नहीं बता सकता कि क्या यह एक स्केप जैसे पहलू में sftp लपेटता है।
माइकल गुंडलाच

2
यह किसी भी मशीन को चलाने वाले sshd के साथ फाइल ट्रांसफर करेगा, जिसमें PATH में scp है (scp ssh स्पेक का हिस्सा नहीं है, लेकिन यह काफी सर्वव्यापी है)। यह सर्वर पर "scp -t" को आमंत्रित करता है, और फ़ाइलों को स्थानांतरित करने के लिए scp प्रोटोकॉल का उपयोग करता है, जिसका sftp से कोई लेना-देना नहीं है।
जिम डे

1
कृपया ध्यान दें कि मैंने मॉडल के रूप में ओपनश का कार्यान्वयन कार्यान्वित किया है, इसलिए यह अन्य संस्करणों के साथ काम करने की गारंटी नहीं है। Sshd के कुछ संस्करण भी scp2 प्रोटोकॉल का उपयोग कर सकते हैं, जो मूल रूप से sftp के समान है।
जिमबाक डेस

क्या आप कृपया इस प्रश्न को देख सकते हैं: stackoverflow.com/questions/20111242/… अगर मैं सोच रहा हूँ कि paramiko उपप्रकार का उपयोग करता है या अन्य सॉकेट की तरह आता है। मैं स्मृति मुद्दों का उपयोग कर रहा हूँ subprocess.check_output ('ssh blah@blah.com "cat / data / file *") क्लोन / कांटा मुद्दों के कारण और सोच रहा हूँ कि क्या paramiko में समान मुद्दे होंगे या नहीं?
पॉल

1
@Paul: paramiko में समान मुद्दे नहीं होंगे, क्योंकि यह एक उपप्रकार का उपयोग नहीं करता है।
जिमब

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 पर पोटीन स्थापित करते हैं तो आपको pscp (पोटीन scp) मिलता है।

तो आप win32 पर भी os.system हैक का उपयोग कर सकते हैं।

(और आप कुंजी-प्रबंधन के लिए पोटीन-एजेंट का उपयोग कर सकते हैं)


क्षमा करें यह केवल एक हैक है (लेकिन आप इसे अजगर वर्ग में लपेट सकते हैं)


केवल एक कारण 'निक्स एक काम करता है, आप रास्ते पर एससीपी है; ब्लौहर बताते हैं कि इसे ठीक करना बहुत मुश्किल नहीं है। +1
ojrac

6

आप शेल से कमांड कमांड का उपयोग करने के लिए पैकेज उपप्रकार और कमांड कॉल का उपयोग कर सकते हैं।

from subprocess import call

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

2
यह प्रश्नकर्ता द्वारा उल्लेखित आधार मामले से काफी अलग कैसे है? हाँ, उपप्रक्रिया os.system की तुलना में बेहतर है, लेकिन दोनों ही मामलों में, यह काम नहीं करता बाहर लिनक्स सिस्टम की तरह, पासवर्ड संकेत, आदि के साथ मुद्दे हैं
टेलीफोन

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
@Crossfit_and_Beer नमस्ते। तो मैंने कहा "शायद सबसे अच्छा", मैं किसी को भी निर्णय लेने दूंगा :) अभी मुझे AsyncSSH की तुलना अन्य पुस्तकालयों से करने के लिए ज्यादा समय नहीं है। लेकिन बहुत जल्दी: यह उपयोग करने के लिए सरल है, यह अतुल्यकालिक है, इसे बनाए रखा गया है और मेनटेनर बहुत अच्छा और सहायक है, यह काफी पूर्ण और बहुत अच्छी तरह से प्रलेखित है।
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)

मैं प्लंबम के साथ निजी कुंजी के लिए पासफ़्रेज़ कैसे दर्ज कर सकता हूं? p
ekta

@ekta: कमांड लाइन पर आपको इसके लिए प्रेरित किया जाएगा। यदि आप इसे अपने स्वयं के कोड से प्रदान करना चाहते हैं, तो मुझे नहीं लगता कि साहसी एपीआई इस का समर्थन करता है। लेकिन साहुल की SshMachineपहुँच होती है ssh-agent, इसलिए यदि आप हर बार इसे टाइप करने से बचना चाहते हैं, तो यह एक तरीका है। आप प्लंब के जीथब पृष्ठ पर एक सुविधा अनुरोध भी दर्ज कर सकते हैं।
pmos

2

यदि आप * nix पर हैं तो आप sshpass का उपयोग कर सकते हैं

sshpass -p password scp -o User=username -o StrictHostKeyChecking=no src dst:/path

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

हम्म , शायद एक और विकल्प होगा sshfs ( जैसे मैक के लिए एक sshfs भी) का उपयोग करने के लिए। एक बार जब आपका राउटर माउंट हो जाता है तो आप फ़ाइलों को एकमुश्त कॉपी कर सकते हैं। मुझे यकीन नहीं है कि अगर यह आपके विशेष अनुप्रयोग के लिए काम करता है, लेकिन यह काम रखने के लिए एक अच्छा समाधान है।


1

मैंने पहले ही एक साथ एक अजगर एससीपी कॉपी स्क्रिप्ट को रखा था जो पैरामिको पर निर्भर करता है। इसमें एक निजी कुंजी के साथ कनेक्शन को संभालने के लिए कोड या पासवर्ड प्रमाणीकरण के लिए एक कमबैक के साथ SSH कुंजी एजेंट शामिल है।

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


लिंक के लिए धन्यवाद और परमिको का उपयोग करने का अच्छा उदाहरण प्रकाशित करने के लिए समय लेने के लिए।
पीटर एम। का मतलब मोनिका

-2

मुझे नहीं लगता कि कोई एक मॉड्यूल है जिसे आप आसानी से स्कैप को लागू करने के लिए डाउनलोड कर सकते हैं, हालांकि आपको यह मददगार लग सकता है: http://www.ibm.com/developerworks/linux/library/l-twist4.html

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