Bash script से पासवर्ड के साथ sftp कमांड कैसे चलाएं?


173

मुझे लिनक्स होस्ट से sftp का उपयोग करके लॉग फ़ाइल को दूरस्थ होस्ट में स्थानांतरित करना होगा । मुझे अपने परिचालन समूह से उसी के लिए क्रेडेंशियल प्रदान किए गए हैं। हालाँकि, अन्य होस्ट पर मेरा नियंत्रण नहीं है, इसलिए मैं RSA कुंजी को अन्य होस्ट के साथ उत्पन्न और साझा नहीं कर सकता।

तो क्या क्रॉन जॉब के sftpमाध्यम से बैश स्क्रिप्ट के अंदर से कमांड (उपयोगकर्ता नाम / पासवर्ड प्रदान किया गया) चलाने का कोई तरीका है ?

मुझे एक समान स्टैक ओवरफ्लो प्रश्न मिला, एक बैश स्क्रिप्ट में sftp के लिए पासवर्ड निर्दिष्ट करें , लेकिन मेरी समस्या का कोई संतोषजनक उत्तर नहीं था।

जवाबों:


178

आपके पास सार्वजनिक कुंजी प्रमाणीकरण का उपयोग करने के अलावा कुछ विकल्प हैं:

  1. किचेन का उपयोग करें
  2. Sshpass का उपयोग करें (कम सुरक्षित लेकिन शायद आपकी आवश्यकता को पूरा करता है)
  3. अपेक्षा का उपयोग करें (कम से कम सुरक्षित और अधिक कोडिंग की आवश्यकता)

यदि आप sshpass को यहां मौका देना चाहते हैं तो ऐसा करने के लिए एक काम करने वाली स्क्रिप्ट स्निपेट है:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

3
मैक पर इसका उपयोग करने के लिए: stackoverflow.com/questions/9102557/…
anubhava

18
मुझे लगता है कि निर्यात करने की कोई जरूरत नहीं है। SSHPASS=password sshpass -e ...करना चाहिए।
जेन्स

9
मैं एक लॉग फ़ाइल को डाउलोड करने के लिए एक-लाइनर करने में सक्षम था:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
बादल कारीगर

6
@gorus: वन-लाइनर बहुत ही शांत है, लेकिन मैं बढ़ाया स्नूपिंग जोखिमों के कारण कमांड लाइन पर पासवर्ड का उपयोग नहीं करना चाहता था।
शुभ

8
-oBatchMode=noमेरे लिए महत्वपूर्ण गायब टुकड़ा था।
रीचर्डकैमिलर

99

एक और तरीका यह होगा कि lftp का उपयोग किया जाए:

lftp sftp://user:password@host  -e "put local-file.name; bye"

इस पद्धति का नुकसान यह है कि कंप्यूटर पर अन्य उपयोगकर्ता पासवर्ड को टूल जैसे उपकरणों से पढ़ सकते हैं psऔर यह पासवर्ड आपके शेल इतिहास का हिस्सा बन सकता है।

एक अधिक सुरक्षित विकल्प जो LFTP 4.5.0 के बाद से उपलब्ध है, LFTP_PASSWORDपर्यावरण चर सेट कर रहा है और इसके साथ lftp निष्पादित कर रहा है --env-password। यहाँ एक पूर्ण उदाहरण है:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP में एक शांत मिररिंग सुविधा भी शामिल है (पुष्टि हस्तांतरण के बाद डिलीट को शामिल कर सकते हैं --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9
एक विकल्प सुझाने के लिए +1 लेकिन क्या हम कमांड लाइन पर पासवर्ड सप्लाई करने से बच सकते हैं?
शुभ

1
एक ही कंप्यूटर पर किसी को भी पासवर्ड दिखाने के लिए डाउनवोट किया गया
आरोन डिगुल्ला

10
आप lftp के लिए स्क्रिप्ट फ़ाइल बना सकते हैं, इस तरह आपको कमांड लाइन में पासवर्ड प्रदान नहीं करना होगा। एक फ़ाइल बनाएँ put-script: open sftp://user:password@host; put local-file.name; exit चलाने के लिए lftp -f put-script इस तरह से आपके पास कमांड लाइन में उपयोगकर्ता नाम और पासवर्ड नहीं होना चाहिए और आपकी स्क्रिप्ट फ़ाइल पर प्रतिबंधात्मक अनुमतियाँ सेट कर सकता है।
obranovsky

@obaranovsky यह एक अच्छा विचार है। मुझे आश्चर्य है कि अगर मैं इसे अपने पर्यावरण चर को उपनाम या एक फ़ंक्शन के रूप में जोड़ता हूं, तो क्या इसे अन्य उपयोगकर्ताओं से छिपाना सुरक्षित और संभव होगा?
sdkks

1
दूर के lftpसाथ खिलवाड़ करना आसान है sftpऔर sshpass। अच्छा उत्तर।
मतलब

53

उम्मीद का उपयोग करने के लिए एक महान कार्यक्रम है।

उबंटू के साथ इसे स्थापित करें:

sudo apt-get install expect

एक CentOS मशीन पर इसे स्थापित करें:

yum install expect

कहते हैं कि आप एक sftp सर्वर से संबंध बनाना चाहते हैं और फिर अपनी स्थानीय मशीन से दूरस्थ sftp सर्वर पर एक स्थानीय फ़ाइल अपलोड करें

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

यह सर्वर पर आपके पासवर्ड के साथ एक sftp कनेक्शन खोलता है।

फिर यह उस निर्देशिका में जाता है जहाँ आप अपनी फ़ाइल अपलोड करना चाहते हैं, इस स्थिति में "logdirectory"

यह स्थानीय निर्देशिका से एक लॉग फ़ाइल अपलोड करता है, जो / var / log / में पाया जाता है और फाइल का नाम file.log के साथ रिमोट सर्वर पर "logdirectory" के रूप में होता है।


आपके उत्तर के लिए धन्यवाद, मुझे इस कार्य को प्राप्त करने के लिए मेरे एक विकल्प के रूप में उम्मीद थी।
शुभ

धन्यवाद। मुझे आपका उत्तर एक खोज के माध्यम से मिला, इसका उपयोग किया और उम्मीद के साथ एक स्क्रिप्ट का सफलतापूर्वक निर्माण किया। बस पोटरिटी के लिए स्क्रिप्ट पोस्ट की गई
rezizter

उत्तर देने के लिए आपका बहुत-बहुत धन्यवाद, मैंने पहले ही इसे
उतार

मैं ssh निजी कुंजी के लिए पासफ़्रेज़ दर्ज करने के लिए इसका उपयोग कर रहा हूँ। सभी सर्वरों पर समान सार्वजनिक कुंजी डालना और समय-समय पर निजी कुंजी पासफ़्रेज़ को घुमाना उचित है।
sdkks

24

आप एक शेल स्क्रिप्ट में इंटरेक्टिव रूप से लैफ़्टप का उपयोग कर सकते हैं ताकि पासवर्ड को .bash_history या इसी तरह से सहेजा न जा सके:

vi test_script.sh

अपनी फ़ाइल में निम्न जोड़ें:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

और अपनी सम्पादन फ़ाइल टाइपिंग के लिए होस्ट, उपयोगकर्ता, पास और निर्देशिका को संपादित करने के बाद vi संपादक को लिखें / छोड़ दें। :wqफिर अपनी स्क्रिप्ट को निष्पादन योग्य बनाएं chmod +x test_script.shऔर इसे निष्पादित करें ./test_script.sh


2
मौजूदा फ़ाइल को अधिलेखित करने के लिए, "सेट xfer: clobber on" को Lftp के बाद जोड़ें << END_SCRIPT
बालाजी नटराजन

17

सर्वर के बीच फ़ाइल ट्रांसमिशन को सुरक्षित करने के लिए मुझे हाल ही में ftp से sftp पर स्विच करने के लिए कहा गया था। हम टेक्टिया एसएसएच पैकेज का उपयोग कर रहे हैं, जिसमें --passwordकमांड लाइन पर पासवर्ड पास करने का विकल्प है।

उदाहरण : sftp --password="password" "userid"@"servername"

बैच उदाहरण:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

मुझे लगा कि मुझे यह जानकारी साझा करनी चाहिए, क्योंकि मैं मदद कमांड ( sftp -h) चलाने से पहले विभिन्न वेबसाइटों को देख रहा था , और मुझे पासवर्ड विकल्प देखकर आश्चर्य हुआ।


9
आपके लिए अच्छा सुझाव। हालाँकि इसके लिए आपको कमांड लाइन पर पासवर्ड पास करना होगा और सिस्टम पर कमांड करने वाला कोई भी व्यक्ति psआपका पासवर्ड देख सकेगा।
शुभ

4
मुझे लगता है कि कोशिश की, मुझे मिल गयाunknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200

1
@ मुझे शायद इसलिए कि आपको टेकिया एसएसएच की जरूरत है , ओपनएसएसएच की नहीं
क्रिस मैर 22'18

17

आप पासवर्ड कम प्रमाणीकरण सक्षम करके ओवरराइड कर सकते हैं। लेकिन आपको उसके लिए जाने से पहले चाबियाँ (पब, निजी) स्थापित करनी चाहिए।

स्थानीय सर्वर पर निम्न आदेश निष्पादित करें।

Local $> ssh-keygen -t rsa 

सभी विकल्पों के लिए ENTER दबाएँ। कोई मान टाइप करने की आवश्यकता नहीं है।

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

निम्नलिखित कमांड का उपयोग करके दूरस्थ सर्वर से कनेक्ट करें

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

दूरस्थ सर्वर पर निम्न आदेश निष्पादित करें

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

पासवर्ड-कम प्रमाणीकरण का परीक्षण करने के लिए स्थानीय सर्वर पर निम्न आदेश निष्पादित करें। इसे बिना पासवर्ड के जोड़ा जाना चाहिए।

$> ssh user@targetmachine

1
आपके उत्तर के लिए +1 लेकिन सवाल सार्वजनिक / निजी कुंजी के बिना करने के बारे में था।
शुभ

उफ़ .. बस कुंजी साझा करने पर प्रतिबंध देखा :)
SriniV

जिज्ञासा से बाहर यह आदेश होगा lftp -p ${port} -u ${login_id},${password} ${ip_number}जब एक शेल स्क्रिप्ट से आह्वान उन्हें कुछ कहाँ मुद्रित करता है? आपने sshpass के अलावा कैसे हल किया?
सीनिवि

मेरे पास मैक और लिनक्स दोनों lftpपर निर्भर नहीं है sshpass
शुभ

शुद्ध सोना। धन्यवाद! :)
निकोले टसेनकोव

7

लॉक-डाउन क्रेडेंशियल फ़ाइल के साथ sshpass को संयोजित करें और, व्यवहार में, यह कुछ भी उतना ही सुरक्षित है - यदि आपने क्रेडेंशियल फ़ाइल को पढ़ने के लिए बॉक्स पर रूट किया है, तो वैसे भी सभी दांव बंद हैं।


5

बैश प्रोग्राम के लिए sftp की प्रतीक्षा करने के लिए पासवर्ड मांगने के लिए फिर उसे साथ भेजें:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

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


+1 लेकिन मुझे लगता है कि आप स्पष्ट रूप से बता सकते हैं कि इस दृष्टिकोण से क्या समस्याएं हैं।
20

5

आप इसके लिए sshpass का उपयोग कर सकते हैं। नीचे चरण हैं

  1. Ubuntu के लिए sshpass स्थापित करें - sudo apt-get install sshpass
  2. दूरस्थ आईपी को अपनी ज्ञात-होस्ट फ़ाइल में जोड़ें अगर यह पहली बार उबंटू के लिए है -> ssh उपयोगकर्ता @ आईपी -> 'हां' दर्ज करें
  3. इसके लिए scp और sshpass की संयुक्त कमांड दें। नीचे दूरस्थ टॉमकैट के लिए युद्ध का मुकाबला करने के लिए एक नमूना कोड है sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.