शेल स्क्रिप्ट का उपयोग करके स्वचालित रूप से scp फ़ाइल स्थानांतरण


83

मैं अपने यूनिक्स सिस्टम पर एक निर्देशिका में कुछ एन फाइलों की संख्या है। क्या एक शेलस्क्रिप्ट लिखने का एक तरीका है जो उन सभी फ़ाइलों को एक निर्दिष्ट दूरस्थ सिस्टम में scp के माध्यम से स्थानांतरित करेगा। मैं स्क्रिप्ट के भीतर पासवर्ड निर्दिष्ट करूँगा, ताकि मुझे प्रत्येक फ़ाइल के लिए इसे दर्ज न करना पड़े।


2
क्या आप मुझे बता सकते हैं कि क्या rsync के साथ शेल स्क्रिप्ट में पासवर्ड का उपयोग किया गया है या यदि आपने कोशिश की है? धन्यवाद।

जवाबों:


88

शेल स्क्रिप्ट में हार्डकोडिंग पासवर्ड के बजाय, SSH कुंजी, इसके आसान और सुरक्षित का उपयोग करें।

$ scp -i ~/.ssh/id_rsa *.derp devops@myserver.org:/path/to/target/directory/

यह मानते हुए कि आपकी निजी कुंजी चालू है ~/.ssh/id_rsaऔर आप जिन फ़ाइलों को भेजना चाहते हैं, उन्हें फ़िल्टर किया जा सकता है*.derp

सार्वजनिक / निजी कुंजी जोड़ी बनाने के लिए:

$ ssh-keygen -t rsa

उपरोक्त 2 फाइलें उत्पन्न करेगा, ~/.ssh/id_rsa(निजी कुंजी) और ~/.ssh/id_rsa.pub(सार्वजनिक कुंजी)

सेटअप करने के लिए उपयोग के लिए SSH कुंजियों (एक बार काम): कॉपी की सामग्री ~/.ssh/id_rsa.pubऔर की एक नई लाइन में पेस्ट ~devops/.ssh/authorized_keysमें myserver.orgसर्वर। अगर~devops/.ssh/authorized_keys मौजूद नहीं है, तो इसे बनाने के लिए स्वतंत्र महसूस करें।

एक आकर्षक कैसे गाइड यहाँ उपलब्ध है


1
इन निर्देशों का पालन करने के बाद भी, मुझे अभी भी पासवर्ड के लिए संकेत दिया जाता है ... क्या कोई अन्य मापदंड है जो मुझे याद आ रहा है?
स्कूटीसेयुस

@ScottScooterWeidenkopf कुछ चीजें हो सकती हैं जो गलत हो सकती हैं, जैसे कि .sh dir या अधिकृत_की फाइलें सही अनुमतियाँ (700) नहीं हो सकती हैं।
प्रदीप पति

2
@ प्रदीपपति मैंने अपनी समस्या समझ ली। आप सही हैं, समस्या अनुमतियाँ थीं। आपके द्वारा दिए गए लिंक में, लेखक ने कुछ अनुमति परिवर्तनों का उल्लेख किया है। मैंने वे बदलाव किए, और अब सब कुछ काम करता है।
स्कूटीसेज़स

1
बस इस समाधान के कॉपी-पेस्ट उपयोग के साथ भ्रम से बचने में मदद करने के लिए, वर्तमान में यह उत्तर दूरस्थ से स्थानीय को स्थानांतरित करने के लिए लगता है - जो कि ओपी को देखने के लिए विपरीत है।
सिआब्रोस

@ कैबोरोस का अच्छा कैच! मैंने जवाब अपडेट किया। धन्यवाद!
प्रदीप पति

42
#!/usr/bin/expect -f

# connect via scp
spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "PASSWORD\r"
  }
}
interact

http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command


विंडोज उपयोगकर्ताओं के लिए ध्यान दें: expectMSYS2 में पैक किया गया पूरे आउटपुट के खिलाफ मेल खाता है, इसलिए 1 नियम हमेशा मेल खाता होगा। यदि आप दोनों नियमों के क्रम का आदान-प्रदान करते हैं, तो आपको वांछित व्यवहार मिलता है।
fzbd

18

आप यह कोशिश क्यों नहीं करते?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

1
#! / Usr / bin / उम्मीद -f के लिए अच्छा विकल्प
TH_

16

आप rsync का उपयोग भी कर सकते हैं। ऐसा लगता है कि scp IMHO की तुलना में कई फाइलों के लिए यह बेहतर काम करता है।

rsync -avzh / path / to / dir / user @ रिमोट: / path / to / रिमोट / dir /

अपडेट करें

आप '-ई' स्विच जोड़कर ss के माध्यम से rsync का उपयोग कर सकते हैं:

rsync -avzh -e ssh / path / do / dir / user @ रिमोट: / पाथ / टू / रिमोट / डायर /

3
Scp ist के बारे में अच्छी बात यह है कि यह एक सुरक्षित चैनल का उपयोग करता है। rsync नहीं करता है।

3
आप sssh का उपयोग करने के लिए rsync को बाध्य कर सकते हैं: 'rsync -avz -e ssh Remoteuser @ Remotehost: / Remote / dir / this / dir /'

@flokra। धन्यवाद, मैं उस अपडेट को जोड़ने के बीच में सही था और विचलित हो गया।
12

9
यह अभी भी एक इंटरेक्टिव पासवर्ड संकेत देगा। मेरा मानना ​​है कि ओपी
टॉम ऑगर

@Dimitri scp -r प्रतियां पुनरावर्ती रूप से फाइल करता है। इसका स्क्रिप्ट के भीतर पासवर्ड स्टोर करने और इसे bash स्क्रिप्ट के माध्यम से scp कॉल में भेजने से कोई लेना-देना नहीं है! मैं वास्तव में आपकी टिप्पणी नहीं समझता।
टॉम ऑगस्टर

9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

उम्मीद है कि rsync के लिए इस्तेमाल किया जा सकता है? मैं कुछ करने की कोशिश कर रहा हूं और मेरी आरएसए कुंजी विधि काम नहीं कर रही है। यह मुझसे रिमोट मशीन का पासवर्ड पूछता रहता है।

5

वाइल्डकार्ड या कई फाइलों के बारे में क्या?

scp file1 file2 more-files* user@remote:/some/dir/

4

rsync एक ऐसा प्रोग्राम है जो उसी तरह से व्यवहार करता है जैसे कि rcp करता है, लेकिन कई और विकल्प हैं और गंतव्य फ़ाइल को अपडेट किए जाने पर फ़ाइल स्थानांतरण में तेजी लाने के लिए rsync रिमोट-अपडेट प्रोटोकॉल का उपयोग करता है।

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


फ़ोल्डर को एक स्थान से दूसरे स्थान पर कॉपी करना

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  

3

यदि आप स्क्रिप्ट के प्रत्येक रन के लिए एक बार अपना पासवर्ड दर्ज करने के लिए ठीक हैं, तो आप एसएसएच मास्टर कनेक्शन का उपयोग करके आसानी से कर सकते हैं।

#!/usr/bin/env bash

USER_AT_HOST="user@host"  # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"

# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"

# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy

# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"

# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"

2

आप इसे केवल ssh सार्वजनिक / निजी कुंजी के साथ कर सकते हैं। या पोटीन का उपयोग करें जिसमें आप पासवर्ड सेट कर सकते हैं। scp कमांड लाइन में पासवर्ड देने का समर्थन नहीं करता है।

आप सार्वजनिक / निजी कुंजी के लिए निर्देश यहां देख सकते हैं: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml


1

यह काम करेगा:

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact

1

एक .pem कुंजी फ़ाइल के साथ SCP के लिए यहाँ bash कोड है। बस इसे script.sh फ़ाइल में सहेजें और फिर 'sh script.sh' के साथ चलाएँ

का आनंद लें

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";

0

लिफ्ट की कोशिश करो

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--

-1

कमांड scpका उपयोग पारंपरिक UNIX की तरह किया जा सकता है cp। यदि आप करते हैं तो:

scp -r myDirectory/ mylogin@host:TargetDirectory

काम करेगा


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