SSH कमांड को पासवर्ड प्रदान करने के लिए bash स्क्रिप्ट में अपेक्षा का उपयोग करें


131

उन लोगों के लिए जो उत्तर देना चाहते हैं कि मुझे SSH कुंजियों का उपयोग करना चाहिए कृपया त्याग दें

मैं SSH पासवर्ड प्रदान करने के लिए एक bash स्क्रिप्ट में उम्मीद का उपयोग करने की कोशिश कर रहा हूं। पासवर्ड प्रदान करता है, लेकिन मैं SSH सत्र में समाप्त नहीं करता हूं, जैसा कि मुझे करना चाहिए, यह स्ट्रेट टू द बैश जाता है।

मेरी स्क्रिप्ट:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n" 
EOD
echo "you're out"

मेरी स्क्रिप्ट का आउटपुट:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out

मैं अपना एसएसएच सत्र करना चाहूंगा और केवल तभी जब मैं अपनी बैश स्क्रिप्ट पर वापस जाने के लिए बाहर निकलूंगा। मैं अपेक्षा से पहले बैश का उपयोग क्यों कर रहा हूं इसका कारण यह है कि मेरे पास एक मेनू का उपयोग होता है जो मैं चुन सकता हूं कि किस इकाई को कनेक्ट करना है।

धन्यवाद


49
कृपया पहली पंक्ति देखें: उन लोगों के लिए जो उत्तर देना चाहते हैं कि मुझे SSH कुंजियों का उपयोग करना चाहिए कृपया त्याग दें
अधिकतम

54
मैं आपकी पहली पंक्ति को थोड़ा मित्रवत होने के लिए संपादित करूंगा। आप कुछ इस तरह का विचार कर सकते हैं "बाधाओं के कारण, मैं बस एसएसएच कुंजी का उपयोग नहीं कर सकता, मुझे इसे बिना किसी उम्मीद के काम करने का एक रास्ता खोजना चाहिए"। आपको उम्मीद करनी चाहिए कि लोग स्वाभाविक रूप से उत्सुक हो सकते हैं कि आप कुंजियों का उपयोग क्यों नहीं कर रहे हैं, और बस मददगार बनने की कोशिश कर रहे हैं :) @Ignacio ने सुझाव नहीं दिया कि आप उनका उपयोग करते हैं, वह बस इसे एक बाधा के रूप में पुष्टि कर रहा था और ओवरसाइट नहीं ।
टिम पोस्ट

मैं इस मामले में kermit का उपयोग करने की कोशिश करूंगा। इसकी एक बहुत मजबूत स्क्रिप्टिंग भाषा है columbia.edu/kermit/skermit.html#scripts
f3xy

जवाबों:


86

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

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

बैश के लिए नमूना समाधान हो सकता है:

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

यह इंटरएक्टिव सत्र के लिए प्रवेश और वापसी (एक पल के लिए) की प्रतीक्षा करेगा।


1
यह बहुत अच्छा काम करता है, धन्यवाद। यदि मुझे SSH के माध्यम से लॉग इन करने के बाद मैं कमांड लिखना चाहता हूं, तो मुझे क्या करने की आवश्यकता है?
मैक्स

इस स्क्रिप्ट को उपयोगकर्ता में लॉग इन के साथ निष्क्रिय खोल देना चाहिए। मैं सवाल नहीं समझता। यदि आप बिलकुल उसी स्क्रिप्ट का उपयोग करना चाहते हैं जो संपादित प्रविष्टि को देखती है।
पायोत्र क्राल

उसी तरह जब मुझे पासवर्ड भेजा जाता है, जब मुझे संकेत दिया जाता है, तो मैं एक बार लॉग इन करने के लिए सिस्टम कमांड भेजना चाहूंगा।
Max

ऊपर पोस्ट करने के लिए Samlple कोड जोड़ा गया था। निश्चित रूप से यह तब तक काम करेगा जब तक कि my_commandX प्रॉम्प्ट नहीं लौटाता है, अगर ऐसा होता है तो प्रॉम्प्ट वेरिएबल को बदल दिया जाना चाहिए।
पायोत्र क्राल

@pietrushnic क्या आप थोड़ा सा समझा सकते हैं कि "इंटरैक्शन -o -nobuffer -re $ प्रॉम्प्ट रिटर्न" का उपयोग करने के बजाय "उम्मीद $ शीघ्र" करें? बाद वाला आमतौर पर अधिक इस्तेमाल किया जाता है ..
रिचर्ड

53

सबसे आसान तरीका है sshpass का उपयोग करना । यह उबंटू / डेबियन रिपोस में उपलब्ध है और आपको बैश के साथ एकीकृत उम्मीद के साथ सौदा नहीं करना है।

एक उदाहरण:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

उपरोक्त कमांड को बैश स्क्रिप्ट के साथ आसानी से एकीकृत किया जा सकता है।

नोट: सुरक्षा निहितार्थों की पूरी समझ के लिए कृपया सुरक्षा संबंधी विचार अनुभाग पढ़ें man sshpass


मुझे नहीं पता कि यह एक अच्छा समाधान है, लेकिन यह निश्चित रूप से बहुत सरल करता है। धन्यवाद
erikbwork

9
सुरक्षा के दृष्टिकोण से बहुत खतरनाक है - सिस्टम पर किसी अन्य प्रक्रिया द्वारा कमांड-लाइन तर्कों को पढ़ा जा सकता है। उन्हें अधिलेखित करना संभव है, और उम्मीद sshpassहै कि ऐसा होता है, लेकिन फिर भी एक अवधि है जब यह अभी भी शुरू हो रहा है इससे पहले कि यह करने में सक्षम है कि पासवर्ड किसी भी / हर प्रक्रिया को देखने के लिए उपलब्ध है।
चार्ल्स डफी

1
@CharlesDuffy बेशक, आप सही हैं। sshpassएक ऐसे परिदृश्य में उपयोग किया जाता है जहां आपके पास सरल परीक्षण स्क्रिप्ट होती हैं जो स्थानीय नेटवर्क वातावरण में निष्पादित होती हैं जहां सुरक्षा सर्वोच्च चिंता नहीं है। वास्तव में, एक ऐसा खंड है, man sshpassजहां सुरक्षा विचारों पर एक पूरा खंड समझाया गया है। यह जवाब देने के लिए जोड़ा गया, धन्यवाद।
बिंदास

@ erikb85 आमतौर पर, एक पैकेज आपके लिए सभी गंदे सामान करता है, लेकिन, सभी मामलों में, ये स्क्रिप्ट केवल उस उपयोग के लिए बनाई गई हैं, फिर अपना सामान जोड़ने की तुलना में बेहतर होगा। इस टिप्पणी के बारे में पहिया को मजबूत नहीं है। यदि कोई लोगों ने अभी तक इसके साथ सौदा नहीं किया है, तो केवल कठिन सामान से निपटें। sshpass यह एक अच्छा कार्य है।
m3nda

2
पूर्णता के लिए, मैं उल्लेख करता हूं कि "मैन sshpass" भावी उपयोगकर्ता के लिए उपयुक्त सुरक्षा चेतावनी देता है, बताता है कि "-p" इसका उपयोग करने के लिए सबसे कम सुरक्षित तरीका है, और पर्यावरण चर के माध्यम से पासवर्ड लेने के लिए "-e" विकल्प प्रदान करता है। , जो कम से कम इसे कमांड लाइन से दूर रखता है।
रॉन बुर्क

22

अपने ईओडी के ठीक पहले 'इंटरेक्ट' उम्मीद कमांड जोड़ें:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send "$PWD\n" 
interact
EOD
echo "you're out"

जब तक आप लॉगआउट नहीं करते हैं, तब तक आपको दूरस्थ मशीन से इंटरैक्ट करना चाहिए। फिर आप बैश में वापस आएंगे।


यह अंदर चला जाता है और तुरंत वापस चला जाता है। "आप बाहर हैं" मुद्रित है।
इमैनुएल

8
मैंने "इंटरेक्ट" और "ईओडी" को "उम्मीद ईओफ़" से बदल दिया है और यह मेरे लिए काम करता है। यह एक मैक पर है।
इमैनुएल

2
इस पृष्ठ पर किसी भी उत्तर ने मेरे लिए काम नहीं किया लेकिन @ इमैनुएल ने expect eofइस मुद्दे को हल करने का सुझाव दिया ।
मॉर्टेल

निकालें 'से usr@$myhost.example.com'और यह काम करना चाहिए। और शायद आप प्रतिस्थापित करने की आवश्यकता \nके साथ \rYMMV, लेकिन
टीनो

20

महीनों तक प्रश्न के उत्तर की तलाश करने के बाद, मैं अंत में एक बहुत अच्छा समाधान ढूंढता हूं: एक सरल स्क्रिप्ट लिखना।

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "Password:"
send "$password\r";
interact

इसे रखो /usr/bin/exp, तो आप उपयोग कर सकते हैं:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

किया हुआ!


expect "assword:"क्या आपका मतलब था expect "password:"?
उपयोगकर्ता

1
@user "assword"दोनों का मिलान करेगा Passwordऔर password
फर्डिनेंड.क्राफ्ट

8

इसका भी इस्तेमाल ज़रूर करें

send -- "$PWD\r" 

इसके बजाय, क्योंकि डैश (-) से शुरू होने वाले पासवर्ड अन्यथा विफल होंगे।

उपरोक्त अभिप्राय कमांड भेजने के विकल्प के रूप में डैश के साथ शुरू होने वाले स्ट्रिंग की व्याख्या करता है।


8

एक साधारण उम्मीद की स्क्रिप्ट

Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh $user@$ip
    expect "password"
    send "$password\r"
    interact

उदाहरण:

    ./Remotelogin.exp <ip> <user name> <password>

7

सहायक उपकरण का उपयोग करें fd0ssh(hxtools से, नहीं pmt), यह ssh कार्यक्रम से एक विशेष संकेत की उम्मीद किए बिना काम करता है।


यह भी खूब रही! इसे चलाने के लिए थोड़ा मुश्किल है (कम से कम ubuntu सर्वर में), लेकिन आसानी से काम करता है! हमने जो echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port user@yourserver.com & कॉन्फिगरेशन बनाया है: धन्यवाद!
जेपी इलनेस ने

1
कमांड लाइन पर पासवर्ड को पास करने की तुलना में अधिक सुरक्षित sshpassहै।
चार्ल्स डफी

5

एक और तरीका है कि मैं एक bash स्क्रिप्ट से एक छोटी सी उम्मीद की स्क्रिप्ट का उपयोग करने के लिए उपयोगी पाया निम्नानुसार है।

...
bash-script start
bash-commands
...
expect - <<EOF 
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...

यह काम करता है क्योंकि ...If the string "-" is supplied as a filename, standard input is read instead...


आपको -यहां जरूरत नहीं है, जैसा कि आप डिफ़ॉल्ट रूप से expectपढ़ते हैं stdinयदि आप बिना तर्क के इसे लागू करते हैं। हालाँकि यह उपयोगी है यदि आप इसे बिना कमांड प्रॉम्प्ट ( expectबनाम expect -) के संवादात्मक रूप से चलाना चाहते हैं या यदि आप ऐसा कुछ करते हैं expect -f "$@"जहाँ पहला तर्क एक फाइल होगा, भले ही यह एक विकल्प जैसा लगे (साथ शुरू होता है -)। उस स्थिति में, यदि $1(दी गई फ़ाइल) -यह से पढ़ता है stdin
तिनो

1

sshpassयदि आप इसे मेकफाइल के अंदर सबलाइम टेक्स्ट बिल्ड टारगेट के अंदर उपयोग करने का प्रयास करते हैं, तो उसे तोड़ दिया जाता है। इसके बजाय sshpassआप उपयोग कर सकते हैं passh: https://github.com/clarkwang/passh

sshpassतुम्हारे साथ होगा:

sshpass -p pa$$word ssh user@host

passhतुम्हारे साथ होगा:

passh -p pa$$word ssh user@host

नोट: उपयोग करने के लिए मत भूलना -o StrictHostKeyChecking=no, अन्यथा कनेक्शन पहली बार आपके द्वारा उपयोग किए जाने पर लटका होगा। उदाहरण के लिए:

passh -p pa$$word ssh -o StrictHostKeyChecking=no user@host

संदर्भ:

  1. Ssh कनेक्शन में अपेक्षित स्क्रिप्ट का उपयोग करके पासवर्ड के लिए कमांड भेजें
  2. /ubuntu/87449/how-to-disable-strict-host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
  4. /server/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.