2008-10-30 8 views
122

पायथन में फ़ाइल को स्कैन करने का सबसे आसान तरीका क्या है? केवल मार्ग मैं के बारे में पता कर रहा हूँपायथन में कैसे स्किप करें?

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

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

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

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

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

EDIT: यह How to copy a file to a remote server in Python using SCP or 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') 

उत्तर

-2

मैं वहाँ किसी भी एक मॉड्यूल है कि आप आसानी से SCP लागू करने के लिए डाउनलोड कर सकते हैं है नहीं लगता कि कोड तरह चलाने के लिए आशा करती हूं कि, हालांकि आप इस सहायक हो सकते हैं: http://www.ibm.com/developerworks/linux/library/l-twist4.html

4

अगर आप Win32 पर पुटी स्थापित करते हैं तो आपको एक पीएससीपी (पुटी एसपीपी) मिलता है।

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

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


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

+0

एकमात्र कारण 'निक्स एक काम करता है, आपके पास पथ पर एससीपी है; ब्लूउहर बताते हैं, यह ठीक करना मुश्किल नहीं है। +1 – ojrac

12

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

यहां मुख्य वेबसाइट से उदाहरण के उपयोग (एफ़टीपी के लिए) के एक स्निप है:

 
    # 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 ('[email protected]') 
    child.expect ('ftp> ') 
    child.sendline ('cd pub') 
    child.expect('ftp> ') 
    child.sendline ('get ls-lR.gz') 
    child.expect('ftp> ') 
    child.sendline ('bye') 
1

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

8

आप paramiko भी देख सकते हैं। कोई scp मॉड्यूल नहीं है (अभी तक), लेकिन यह पूरी तरह से sftp का समर्थन करता है।

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

scp.py for paramiko

+0

क्या आप कह रहे हैं कि संलग्न समाधान किसी भी मशीन को sshd चलाने वाली फ़ाइलों को सुरक्षित रूप से स्थानांतरित कर देगा, भले ही यह sftpd नहीं चल रहा हो? यही वही है जो मैं ढूंढ रहा हूं, लेकिन मैं आपकी टिप्पणी से नहीं कह सकता कि क्या यह सिर्फ एक scp-like facade में sftp लपेटता है। –

+2

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

+1

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

76

मॉड्यूल paramiko_scp की कोशिश करो। इसका उपयोग करना बहुत आसान है। निम्नलिखित उदाहरण देखें:

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

+0

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

+2

@ निक बास्टिन, लिनक्स और विंडोज दोनों पर मेरे लिए बहुत अच्छा काम किया –

+7

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

2

fabric पर एक नज़र डालें। एक उदाहरण here पाया जा सकता है।

+2

क्या आप अधिक विशिष्ट हो सकते हैं? –

1

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

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

+0

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

0

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

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

यह काफी देर के बाद से यह सवाल पूछा गया था कर दिया गया है, और इस बीच, एक और पुस्तकालय है कि इस है संभाल कर सकते हैं ऊपर काटी: आप copy समारोह Plumbum लाइब्रेरी में शामिल का उपयोग कर सकते हैं:

import plumbum 
r = plumbum.machines.RemoteMachine("example.net", 
user="username", keyfile=".ssh/some_key") 
fro = plumbum.local.path("some_file") 
to = r.path("/path/to/destination/") 
plumbum.path.utils.copy(fro, to) 
+0

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

+0

@ekta: आपको कमांड लाइन पर इसके लिए संकेत दिया जाएगा। यदि आप इसे अपने कोड से प्रदान करना चाहते हैं, तो मुझे नहीं लगता कि प्लंबम का एपीआई इसका समर्थन करता है। लेकिन प्लंबम की 'एसशमैचिन' के पास 'एसएसएच-एजेंट' तक पहुंच है, इसलिए यदि आप इसे हर समय टाइप करना टालना चाहते हैं, तो ऐसा करने का एक तरीका है। आप प्लंबम के जीथब पेज पर फीचर अनुरोध भी दर्ज कर सकते हैं। – pmos

4

एक सीधा जवाब नहीं मिला, और यह "scp.Client" मॉड्यूल मौजूद नहीं है। इसके बजाय, this मुझे सूट:

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

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

from subprocess import call 

cmd = "scp [email protected]:files [email protected]:files" 
call(cmd.split(" ")) 
+1

प्रश्नकर्ता द्वारा उल्लिखित आधार मामले से यह काफी अलग कैसे है? हां, उपप्रोसेस os.system से बेहतर है, लेकिन दोनों मामलों में, यह लिनक्स-जैसी प्रणालियों के बाहर काम नहीं करता है, पासवर्ड संकेतों के साथ समस्याएं हैं आदि। – Foon

संबंधित मुद्दे