स्क्रिप्ट के साथ स्वचालित रूप से SSH पासवर्ड दर्ज करें


194

मुझे एक स्क्रिप्ट बनाने की ज़रूरत है जो स्वचालित रूप से OpenSSH के लिए एक पासवर्ड इनपुट करती है ssh क्लाइंट के ।

मान लें कि मुझे myname@somehostपासवर्ड के साथ SSH की आवश्यकता है a1234b

मैंने पहले ही कोशिश की है ...

#~/bin/myssh.sh
ssh myname@somehost
a1234b

... लेकिन यह काम नहीं करता है।

मैं एक स्क्रिप्ट में यह कार्यक्षमता कैसे प्राप्त कर सकता हूं?

जवाबों:


278

सबसे पहले आपको sshpass इंस्टॉल करना होगा

  • Ubuntu / डेबियन: apt-get install sshpass
  • फेडोरा / CentOS: yum install sshpass
  • आर्क: pacman -S sshpass

उदाहरण:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM

कस्टम पोर्ट उदाहरण:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400

टिप्पणियाँ:

  • sshpass-fध्वज पारित होने पर किसी फ़ाइल से पासवर्ड भी पढ़ सकता है।
    • -fपासवर्ड का उपयोग करने से पासवर्ड दिखाई देने से रोकता हैps कमांड निष्पादित किया जाता है।
    • जिस फ़ाइल में पासवर्ड संग्रहीत है उसमें सुरक्षित अनुमतियाँ होनी चाहिए।

12
यह एक्सपेक्ट का उपयोग करने से बहुत बेहतर है।
प्रति मेजल्ड रासमुसेन

5
बस इस बात का ध्यान रखें कि जैसे ही sshpass आपके पासवर्ड को कमांड्स से ब्लॉक करता है ps -aux, आपको सामान्य रूप से अपना पासवर्ड टाइप करके कमांड नहीं चलाना चाहिए क्योंकि उसी कंप्यूटर पर अन्य उपयोगकर्ता पासवर्ड चलाकर देख सकते हैं ps -aux। यदि व्यावहारिक है, तो आप इसके बजाय सार्वजनिक कुंजी प्रमाणीकरण का उपयोग करना चाहते हैं, जैसा कि अन्य उत्तर में बताया गया है। यह आपको अपनी स्क्रिप्ट से प्रमाणीकरण जानकारी को अलग करने की अनुमति देता है ताकि आप अपनी स्क्रिप्ट को दूसरों के साथ चिंता मुक्त साझा कर सकें, और बाद में अपने स्क्रिप्ट को एन्क्रिप्ट किए बिना अपने ~ / .ssh फ़ोल्डर में एन्क्रिप्शन को सक्षम करने का निर्णय लें।
अलेक्जेंडर टेलर

2
दुर्भाग्य से यह मेरे लिए एक कस्टम ssh पोर्ट वाले सर्वर पर काम नहीं कर रहा है ... ssh सिर्फ हमें कमांड लाइन में पासवर्ड डालने का विकल्प क्यों नहीं दे सकता है?
एंडी

2
कस्टम पोर्ट काम करने के लिए कमांड के अंत में "-p पोर्ट-नंबर" जोड़ने के लिए
Ye Lwin Soe


95

महीनों तक सवाल का जवाब तलाशने के बाद, आखिरकार मुझे एक बेहतर समाधान मिला: एक सरल स्क्रिप्ट लिखना।

#!/usr/bin/expect

set timeout 20

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

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

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

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

किया हुआ!


2
इस जवाब को और अधिक वोट मिलना चाहिए, यह एक महान आवरण है। बस कुछ सामान्य ऑपरेशन की कोशिश की जैसे विभिन्न झंडे और रिमोट कमांड निष्पादन के साथ rsyncing और यह हर बार काम किया। उपयोगी स्क्रिप्ट के मेरे टूलबॉक्स में जोड़ा गया, धन्यवाद @damn_c!
user2082382

7
हो सकता है कि लोगों ने इसकी उम्मीद न की हो, क्योंकि इसने और अधिक वृद्धि नहीं की है?
स्पष्ट करें

7
इसका कारण यह है कि IMO एक बहुत अच्छा जवाब नहीं है क्योंकि पासवर्ड स्क्रिप्ट में लिखा है जो अब तक की सबसे कम सुरक्षित विधि है ...
पियरे

8
पासवर्ड मशीन पर ps चलाने वाले को दिखाई देगा।
डैनियल पर्सन

22
"assword" अद्भुत है :-)
Ciro Santilli 冠状 amazing amazing amazing

71

सार्वजनिक कुंजी प्रमाणीकरण का उपयोग करें: https://help.ubuntu.com/community/SSH/OpenSSH/Keys

स्रोत होस्ट में इसे केवल एक बार चलाएँ:

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost

बस इतना ही, उसके बाद आप बिना पासवर्ड के ssh कर पाएंगे।


21
समझा। लेकिन मुझे पासवर्ड के साथ ssh करने की आवश्यकता है। ऐसा इसलिए है, क्योंकि "I" में एक अंगूठे की ड्राइव पर स्क्रिप्ट हो सकती है और इसे किसी भी कंप्यूटर से चलाने की आवश्यकता हो सकती है; पासवर्ड की आवश्यकता को अक्षम नहीं करते हुए।
user1467855

3
@ user1467855, मुझे लगता है कि आपको अपनी आवश्यकताओं को बेहतर ढंग से समझाने की आवश्यकता है। कोई भी यह सुझाव नहीं दे रहा है कि आपके पास एक असुरक्षित नेटवर्क है। सार्वजनिक-कुंजी दृष्टिकोण में, उपयोगकर्ताओं के लिए पासवर्ड के साथ लॉग इन करना संभव होगा। लेकिन आप अपने अंगूठे की ड्राइव पर निजी कुंजी की नकल करेंगे, जिसका अर्थ है कि अंगूठे की ड्राइव एकमात्र ऐसी चीज होगी जो पासवर्ड के बिना लॉग इन कर सकती है।
एरोन मैकडैड

5
दुर्भाग्य से, मैं ओपी स्थिति में हूं, क्योंकि sysadmin rsa / dsa कुंजियों द्वारा प्रमाणीकरण को रोक देता है और पासवानों की आवश्यकता होती है। आप क्या करने वाले है।
कारेल बिलेक

26
डाउनवोट किया गया क्योंकि यह पूछे गए वास्तविक प्रश्न का उत्तर देने की कोशिश भी नहीं करता है।
पार्थियन शॉट 18

2
यह अभी भी पहले लॉगिन के लिए संकेत देता है और एक स्क्रिप्ट में उपयोग नहीं किया जा सकता है!
मेहरदाद मिर्ज़ा

29

आप एक उम्मीद की स्क्रिप्ट का उपयोग कर सकते हैं। मैंने काफी समय में एक नहीं लिखा है, लेकिन यह नीचे की तरह दिखना चाहिए। आपको स्क्रिप्ट के साथ शीर्ष करने की आवश्यकता होगी#!/usr/bin/expect

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:" 
send "username\r"
expect "Password:"
send "password\r"
interact

जैसा कि आपने सुझाव दिया था, लेकिन निम्न त्रुटियां प्राप्त /bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found
हुईं

मेरे उत्तर को सही करने के लिए धन्यवाद हारून। उम्मीद करने के लिए सही रास्ता खोजने के लिए आपको नीचे दिए गए आदेश को चलाने की आवश्यकता हो सकती है। which expect
लिपोंगो

1
आप इस #!/usr/bin/env expect
शबंग

1
मैंने interactअंत में जोड़ा इसलिए ssh सत्र वास्तव में इंटरैक्टिव है
कारेल बिलेक

-1 एक स्क्रिप्ट में एक सादे पाठ पासवर्ड रखने के भारी सुरक्षा जोखिम के लिए।
आरोन डिगुल्ला

21

वेरिएंट I

sshpass -p PASSWORD ssh USER@SERVER

वेरिएंट II

#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact

-pझंडा एक पोर्ट संख्या निर्दिष्ट करने के लिए है।
कूकरस

4
सं sshpass ssh नहीं है। SYNOPSIS sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
रेमीजॉफ्लेक्स

Linux CentOS में sshpass चलाने के लिए आपको yum -y install epel-releaseऔर उसके बादyum -y install sshpass
Junior Mayhé

इस डेटा के संदर्भ में नजरअंदाज किया जा सकता है
RemiZOffAlex

जबकि मुझे पता है कि यह एक पुरानी पोस्ट है, यह ध्यान देने योग्य है कि वैरिएंट II विधि सत्र के लिए दिए गए पासवर्ड को बैश इतिहास में असुरक्षित छोड़ देगी, जिससे यह बहुत ही असावधान हो जाएगा।
किर्कलैंड

10

sshpass + autossh

पहले से ही उल्लेख किया गया sshpassका एक अच्छा बोनस यह है कि आप इसका उपयोग कर सकते हैं autossh, और साथ ही साथ इंटरेक्टिव अक्षमता को भी समाप्त कर सकते हैं ।

sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com

यदि आपके लैपटॉप को बंद करने से आपकी वाईफाई बाधित हो जाती है, तो यह ऑटोरिक्कनेक्ट की अनुमति देगा।


2
ध्यान दें कि आप -fइस संयोजन में ऑटॉश का विकल्प नहीं जोड़ सकते , क्योंकि when used with autossh, ssh will be *unable* to ask for passwords or passphrases. harding.motd.ca/autossh/README.txt भी superuser.com/questions/1278583/…
allenyllee

9

sshpass बेहतर सुरक्षा के साथ

मैं इस धागे पर लड़खड़ाया हुआ एक दलदल से नीचे सर्वर में रास्ता खोजने की कोशिश कर रहा था - SSH कनेक्शन के प्रयास को संसाधित करने में एक मिनट से अधिक समय लगा, और इससे पहले कि मैं पासवर्ड दर्ज कर पाता। इस मामले में, मैं तुरंत अपने पासवर्ड की आपूर्ति करने में सक्षम होना चाहता था संकेत मिलने पर था।

(और अगर यह स्पष्ट रूप से स्पष्ट नहीं है: इस राज्य में एक सर्वर के साथ, सार्वजनिक कुंजी लॉगिन सेट करने में बहुत देर हो चुकी है)

sshpassबचाव के लिए। हालांकि, इस बारे में जाने के लिए बेहतर तरीके हैंsshpass -p

मेरा कार्यान्वयन सीधे इंटरैक्टिव पासवर्ड प्रॉम्प्ट पर जाता है (यदि सार्वजनिक कुंजी विनिमय हो सकता है, तो यह देखने में कोई समय बर्बाद नहीं होता है), और सादे पाठ पर पासवर्ड का खुलासा नहीं करता है।

#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh $@"

# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS 
export SSHPASS

# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"

# clear the exported variable containing the password
unset SSHPASS

1
स्वयं पर ध्यान दें: trapctrl-C को SSHPASSवैरिएबल लीक करने से रोकने के लिए स्क्रिप्ट का उपयोग करने के लिए अपडेट करें
इयान

1
मैंने पाया कि PreferredAuthentications=keyboard-interactiveकाम नहीं किया था, लेकिन इसे बदलने के साथ PreferredAuthentications=passwordकाम किया।
माइक पार्टरिज

8

इस तरह से मैं अपने सर्वर में लॉगिन करता हूं।

ssp <server_ip>
  • उपनाम उपनाम = '/ घर / मायूस / दस्तावेज / ssh_script.sh'
  • cat /home/myuser/Documents/ssh_script.sh

#! / Bin / bash

sshpass -p mypassword ssh रूट @ $ 1

और इसीलिए...

ssp server_ip

5
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1

# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh root@owned.com -p 22

संदर्भ: https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card


3
मुझे लगता है कि यह लेख सिर्फ व्यंग्यात्मक है!
यान फोटो

5

मुझे नहीं लगता कि मैंने किसी को यह सुझाव दिया है और ओपी ने सिर्फ "स्क्रिप्ट" कहा है ...

मुझे उसी समस्या को हल करने की आवश्यकता थी और मेरी सबसे आरामदायक भाषा पायथन है।

मैंने पैरामिको लाइब्रेरी का इस्तेमाल किया। इसके अलावा, मुझे उन कमांड्स को भी जारी करने की आवश्यकता है जिनके लिए मुझे उपयोग की जाने वाली अनुमतियों की आवश्यकता होगी sudo। यह पता चला है कि sudo "-S" झंडे के माध्यम से अपना पासवर्ड स्वीकार कर सकता है! निचे देखो:

import paramiko

ssh_client = paramiko.SSHClient()

# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)

# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"

ssh_client.connect(hostname="my.host.name.com",
                       username="username",
                       # Uncomment one of the following...
                       # password=password
                       # pkey=pkey
                       )

# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)

# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)

exit_status = chan.recv_exit_status()

if exit_status != 0:
    stderr = chan.recv_stderr(5000)

# Note that sudo's "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.

    logger.error("Uh oh")
    logger.error(stderr)
else:
    logger.info("Successful!")

आशा है कि यह किसी की मदद करता है। मेरा उपयोग मामला एक समय के रूप में ~ 300 सर्वरों पर निर्देशिका, भेजने और अनट्रेगिंग फाइलें बनाने और प्रोग्राम शुरू करने का था। जैसे, स्वचालन सर्वोपरि था। मैंने कोशिश की sshpass, expectऔर फिर इस के साथ आया।


2

मुझे यह निम्नानुसार काम कर रहा है

.ssh / config को हां / नो प्रॉम्प्ट को खत्म करने के लिए संशोधित किया गया था - मैं एक फ़ायरवॉल के पीछे हूँ इसलिए मुझे स्पूफ एसएफ कीज़ के बारे में चिंता नहीं है

host *
     StrictHostKeyChecking no

उम्मीद के लिए एक प्रतिक्रिया फ़ाइल बनाएँ। answer.expect

set timeout 20
set node [lindex $argv 0]
spawn ssh root@node service hadoop-hdfs-datanode restart

expect  "*?assword {
      send "password\r"   <- your password here.

interact

अपनी बैश स्क्रिप्ट बनाएं और फ़ाइल में बस कॉल की उम्मीद करें

#!/bin/bash
i=1
while [$i -lt 129]    # a few nodes here

  expect answer.expect hadoopslave$i

  i=[$i + 1]
  sleep 5

done

नए कॉन्फ़िगरेशन के साथ ताज़ा किए गए 128 हडॉप डैटानॉड्स हो जाते हैं - मान लेते हैं कि आप हडूप / गोपनीय फ़ाइलों के लिए एनएफएस माउंट का उपयोग कर रहे हैं

आशा है कि यह किसी की मदद करता है - मैं एक विंडोज़ अंकक हूं और मुझे यह पता लगाने में लगभग 5 घंटे लगते हैं!


"मैं एक फ़ायरवॉल के पीछे हूँ इसलिए मुझे स्पूफ की कीज़ के बारे में चिंता नहीं है"। एक फ़ायरवॉल इस मामले में बिल्कुल कुछ नहीं करता है। HostKeyCheck है ताकि आप दूसरे छोर पर होस्ट को सत्यापित कर सकें कि ट्रोजन होस्ट नहीं है। यानी एक वह है जो आप से जुड़ना चाहते हैं। यदि आप किसी अज्ञात होस्ट से कनेक्ट करते हैं, और कुछ संवेदनशील करते हैं, जैसे कि एक फ़ाइल लिखें जिसमें क्रेडेंशियल या टोकन हो या पासवर्ड दर्ज करें, तो वह जानकारी अब प्रभावी रूप से सार्वजनिक ज्ञान है। आप एक फ़ायरवॉल के पीछे होने के कारण अप्रासंगिक हैं।
JCGB

2

यदि आप विंडोज सिस्टम पर ऐसा कर रहे हैं, तो आप प्लंक (पुटी का हिस्सा) का उपयोग कर सकते हैं।

plink your_username@yourhost -pw your_password


1

@Abbotto का जवाब मेरे काम नहीं आया, कुछ चीजें अलग तरह से करनी पड़ीं:

  1. yum इंस्टॉल sshpass बदलकर - rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
  2. sshpass का उपयोग करने के लिए कमांड - sshpass -p "पास" ssh उपयोगकर्ता @ mysite -p 2122 में बदल गया


0

उदाहरण bellow में मैं उस समाधान को लिखूंगा जिसका मैंने उपयोग किया था:

परिदृश्य: मैं sh स्क्रिप्ट का उपयोग कर सर्वर से फ़ाइल की प्रतिलिपि बनाना चाहता हूं:

#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp userName@server-name:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")

echo "$my_script"

-2

स्क्रिप्ट के भीतर इस स्क्रिप्ट का उपयोग करें, पहला तर्क होस्टनाम है और दूसरा पासवर्ड होगा।

#!/usr/bin/expect
set pass [lindex $argv 1]
set host [lindex $argv 0]
spawn ssh -t root@$host echo Hello
expect "*assword: " 
send "$pass\n";
interact"

मौजूदा उत्तरों के शीर्ष पर यह क्या दर्शाता है? विशेष रूप से damn_c, Lipongo या RemiZOffAlex और अन्य लोगों द्वारा ...
मार्टिन Prikryl

ssh #! / usr / bin / उम्मीद सेट पास [lindex $ argv 1] सेट होस्ट [lindex $ argv 0] spawn ssh -t root @ $ host sh /tmp/anyscript.sh उम्मीद "" assword: "के साथ स्क्रिप्ट निष्पादन "$ पास \ n" भेजें; बातचीत "
शिवम मेहरोत्रा

-3

शेल स्क्रिप्ट के माध्यम से रिमोट मशीन कनेक्ट करने के लिए, कमांड के नीचे उपयोग करें:

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS

जहां IPADDRESS, USERNAMEऔर PASSWORDइनपुट मान हैं जो स्क्रिप्ट में प्रदान करने की आवश्यकता है, या यदि हम रनटाइम उपयोग "रीड" कमांड में प्रदान करना चाहते हैं।


5
मौजूदा उत्तरों के शीर्ष पर यह उत्तर क्या दर्शाता है? + कभी भी किसी को StrictHostKeyChecking=noपरिणाम की व्याख्या किए बिना उपयोग करने का सुझाव न दें ।
मार्टिन प्रिक्रील

-5
sudo ssh username@server_ip_address -p port_number

प्रेस कुंजी दर्ज करें और फिर अपने सिस्टम का पासवर्ड दर्ज करें और फिर अंत में अपना सर्वर पासवर्ड दर्ज करें

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