मैं अपने SSH पब की कुंजी को सर्वर की सूची में अपना पासवर्ड टाइप किए बिना कैसे प्रचारित कर सकता हूं?


26

मुझे हाल ही में सर्वरों की एक सूची में उपयोगकर्ता नाम / पासवर्ड का उपयोग दिया गया था और मैं इन सर्वरों के लिए अपनी SSH सार्वजनिक कुंजी का प्रचार करना चाहता हूं, ताकि मैं और अधिक आसानी से लॉगिन कर सकूं।

ताकि यह स्पष्ट हो:

  • दूरस्थ सर्वर पर कोई भी पहले से मौजूद सार्वजनिक कुंजी नहीं है जिसे मैं इसे स्वचालित करने के लिए उपयोग कर सकता हूं
  • यह पहली बार है जब मैं इन सर्वरों में प्रवेश कर रहा हूँ, और मुझे लगातार उन तक पहुँचने के लिए अपने क्रेडेंशियल्स टाइप नहीं करने होंगे।
  • न ही मैं अपने पासवर्ड ssh-copy-idको लूप में उपयोग करने के लिए बार-बार टाइप करना चाहता हूं ।

1
यह सभी सर्वरों के लिए एक ही उपयोगकर्ता नाम और पासवर्ड है?
रोएमा

@ मर्यादा - यप! उस विवरण ने मुझे आश्चर्यचकित किया, लेकिन यह है कि यह विशेष डेटा सेंटर सेटअप कैसा है और वे इसे कैसे करते हैं।
SLM

@ ott-- - डबल जांचें Q. मैं स्पष्ट रूप से बताता हूं कि मैं ssh-copy-idअपने पासवर्ड को बार-बार पंप करके, लूप के लिए नहीं करना चाहता ।
SLM


2
यह विन्यास प्रबंधन के लिए एक आदर्श उपयोग मामला है। कठपुतली, महाराज, आंसू या नमक को देखो।
spuder

जवाबों:


31

अपने पासवर्ड को कई बार टाइप करने के बजाय आप एक बार psshउसके -Aलिए संकेत करने के लिए और उसके स्विच का उपयोग कर सकते हैं , और फिर एक सूची में सभी सर्वरों को पासवर्ड फ़ीड कर सकते हैं।

नोट: इस पद्धति का उपयोग करने से आप इसका उपयोग नहीं कर सकते ssh-copy-id, हालाँकि, आपको अपनी SSH पब की फ़ाइल को अपने दूरस्थ खाते की ~/.ssh/authorized_keysफ़ाइल में जोड़ने के लिए अपनी स्वयं की विधि को रोल करना होगा ।

उदाहरण

यहाँ एक उदाहरण है जो काम करता है:

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

उपर्युक्त स्क्रिप्ट आम तौर पर इस तरह संरचित है:

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

उच्च स्तरीय psshविवरण

  • cat <pubkey> सार्वजनिक कुंजी फ़ाइल को आउटपुट करता है pssh
  • pssh-ISTDIN के माध्यम से डेटा निगलना करने के लिए स्विच का उपयोग करता है
  • -l <remote user> रिमोट सर्वर का खाता है (हम मान रहे हैं कि आपके पास आईपी फ़ाइल में सर्वरों में समान उपयोगकर्ता नाम है)
  • -Apsshअपने पासवर्ड के लिए पूछने के लिए कहता है और फिर इसे उन सभी सर्वरों के लिए पुन: उपयोग करता है जो इसे जोड़ता है
  • -ipsshफ़ाइलों में स्टोर करने के बजाय STDOUT में कोई भी आउटपुट भेजने के लिए कहता है (इसका डिफ़ॉल्ट व्यवहार)
  • '...cmds to add pubkey...'- यह जो चल रहा है उसका सबसे मुश्किल हिस्सा है, इसलिए मैं इसे खुद से नीचे तोड़ दूंगा (नीचे देखें)

रिमोट सर्वर पर चलाए जा रहे कमांड

ये आदेश हैं जो psshप्रत्येक सर्वर पर चलेंगे:

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'
क्रम में:
  • दूरस्थ उपयोगकर्ता के umask को 077 पर सेट करें, ऐसा इसलिए है कि जो भी निर्देशिका या फाइलें हम बनाने जा रहे हैं, उनकी अनुमतियाँ इस प्रकार निर्धारित होंगी:

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
  • ~/.sshयदि यह पहले से ही है तो निर्देशिका बनाएं और हमें अनदेखा करें

  • $afileप्राधिकृत_की फ़ाइल के पथ के साथ एक चर सेट करें
  • cat - >> $afile - एसटीडीआईएन से इनपुट लें और अधिकृत_की फाइल में जोड़ें
  • sort -u $afile -o $afile - विशिष्ट रूप से अधिकृत_की फ़ाइल को सॉर्ट करता है और उसे बचाता है

नोट: यह अंतिम बिट उस मामले को संभालने के लिए है जहां आप एक ही सर्वर के खिलाफ कई बार ऊपर चलाते हैं। यह आपके प्यूबिक को कई बार जोड़ देने से खत्म कर देगा।

एकल टिक्स नोटिस!

इस तथ्य पर भी विशेष ध्यान दें कि ये सभी कमांड सिंगल कोट्स के अंदर नेस्टेड हैं। यह महत्वपूर्ण है, क्योंकि हम $afileदूरस्थ सर्वर पर निष्पादित होने के बाद तक मूल्यांकन नहीं करना चाहते हैं ।

'               \
   ..cmds...    \
'

मैंने ऊपर विस्तार किया है इसलिए यहाँ पढ़ना आसान है, लेकिन मैं आम तौर पर इसे एक ही लाइन पर चलाता हूँ:

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

बोनस सामग्री

का उपयोग करके psshआप फ़ाइलों के निर्माण के लिए और या तो का उपयोग कर डायनामिक कंटेंट प्रदान होने छोड़ कर सकते हैं -h <(...some command...)या आप का एक और का उपयोग कर आईपी की एक सूची बना सकते हैं psshके स्विच, -H "ip1 ip2 ip3"

उदाहरण के लिए:

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

ऊपर मेरी ~/.ssh/configफ़ाइल से IPs की एक सूची निकालने के लिए इस्तेमाल किया जा सकता है । आप निश्चित printfरूप से गतिशील सामग्री भी उत्पन्न करने के लिए उपयोग कर सकते हैं:

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

उदाहरण के लिए:

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

तुम भी seqस्वरूपित संख्या अनुक्रम उत्पन्न करने के लिए उपयोग कर सकते हैं!

संदर्भ और इसी तरह के उपकरण pssh

यदि आप उपयोग नहीं करना चाहते हैं psshतो मैंने ऊपर किया है तो कुछ अन्य विकल्प उपलब्ध हैं।


2
तीन मामूली जोड़: (1) psshपायथन लिपि है, और इसके साथ स्थापित किया जा सकता है pip install pssh। (2) आप यह भी उत्पन्न कर सकते हैं sshएक साथ चल द्वारा सभी सर्वरों पर कुंजियों ssh-keygenके माध्यम से pssh। (३) कुंजियाँ उत्पन्न करने के बाद आप सभी सार्वजनिक कुंजियों को लूप में स्थानीय मशीन पर authorized_keysकॉपी करके, उन्हें एक आम में असेंबल करके, और प्रत्येक मशीन में कॉपी करके "ऑल-टू-ऑल" वितरित कर सकते हैं। ssh_agent/ ssh_addपासवर्ड की मदद ले सकते हैं।
lcd047

@ lcd047 - धन्यवाद, मैं "एक में उन आज बाद में शामिल करेंगे!
SLM

1
मुझे लगता है कि यह स्क्रिप्ट catपुरस्कार के बेकार उपयोग के लिए योग्य है (पुराने की): किसी फ़ाइल की सामग्री के साथ एक पाइपलाइन शुरू करने के लिए, आप बस उस फ़ाइल से इनपुट को पुनर्निर्देशित कर सकते हैं।
मार्क वैन लीउवेन

1
@MarcvanLeeuwen - मैं सहमत होना चाहूंगा, लेकिन मैं चाहता था कि यह किसी के लिए भी आसान हो जो भविष्य की खोजों के माध्यम से इस बात को स्पष्ट रूप से समझ सके कि कैसे प्यूब्स को पास किया जा रहा है pssh
SLM

1
@MarcvanLeeuwen: यह अब बेकार है अगर आप इसे इस तरह से कार्य करें: cat ~/.ssh/*.pub | ...। हालांकि इस स्थिति में आप जो चाहते हैं वह हो सकता है या नहीं।
lcd047

7

वैकल्पिक उपयोग xargs, sshpassऔर ssh-copy-id:

अपने क्रेडेंशियल को क्रेडेंशियल में रहते हुए मान लें । प्रारूप में user:password@server:

$ cat credentials.txt
root:insecure@192.168.0.1
foo:insecure@192.168.0.2
bar:realsecure@192.168.0.3

तुम यह कर सकते थे:

tr ':@' '\n' < credentials.txt \
| xargs -L3 sh -c 'sshpass -p $1 ssh-copy-id $0@$2'

नोट: उपयोग के बाद क्रेडेंशियल्स को हटाने के लिए याद रखें ।


2
और अगर यह सभी सर्वरों के लिए एक ही उपयोगकर्ता नाम और पासवर्ड है, तो आप इसे सीधे हार्डकोड कर सकते हैं और केवल आईपी-एड्रेस की एक सूची पढ़ सकते हैं :-)
फाल्को

6

क्लस्टरस्टरएच आपको प्रत्येक मशीन पर एक विंडो देता है और सभी विंडो को नियंत्रित करने के लिए एक सामान्य विंडो के साथ।

अगर हम 10 मशीनों की बात कर रहे हैं तो यह काम करेगा। अगर हम 100 मशीनों की बात कर रहे हैं, तो कई खिड़कियां होंगी।

क्लस्टरस्टरएच की सुंदरता यह है कि यदि एक मशीन बाकी की तरह 100% नहीं है, तो आप बस खिड़की पर क्लिक कर सकते हैं, और सभी मशीनों में कीस्ट्रोक्स भेजने से पहले वापस केवल उस मशीन पर कीस्ट्रोक्स भेज सकते हैं।


6

Ansible का उपयोग करना काफी सरल है। बस <USER>असली लॉगिन नाम के साथ बदलें

$ cd /path/to/public/key

$ cat<<END > hosts
  host1.example.com
  10.10.10.10
  END

$ ansible -i hosts all --ask-pass -u <USER> -m authorized_key \
      -a "user=<USER> key='$(cat id_rsa.pub)'"        

0

संभावित रूप से बिल फिट हो सकने वाली चीजों के जोड़े:

जैसा कि अन्य उत्तरों में बताया गया है, sshpassसंभवतः सबसे आसान समाधान है।


-1

आपके पास दो विकल्प हैं:

  • आप सभी सर्वरों के आईपी पते के साथ एक फ़ाइल बना सकते हैं, फिर नीचे करें

    while read -r ip;do
      ssh-copy-id -i .ssh/id_rsa.pub $ip
    done < servers.txt

मान servers.txtलेना IP / होस्टनाम के साथ फ़ाइल है।

  • आप अपने सभी आईपी / होस्टनाम को एक लूप में रख सकते हैं, और ssh-copy-idनीचे की तरह चला सकते हैं:

    for i in hostname1 hostname2
      do ssh-copy-id -i .ssh/id_rsa.pub $i
    done

जो पूरी तरह से ओपी आवश्यकताओं के खिलाफ जाता है: "और न ही मैं अपने पासवर्ड ssh-copy-idको एक लूप में उपयोग करके बार-बार टाइप करना चाहता हूं ।"
ओल्डमिमर

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