SSH को पासवर्ड से स्वचालित करने के लिए कैसे?


419

SSH को पासवर्ड से स्वचालित करने के लिए कैसे? मैं अपने परीक्षण VM को कॉन्फ़िगर कर रहा हूं, इसलिए भारी सुरक्षा पर विचार नहीं किया जाता है। एसएसएच न्यूनतम विन्यास के साथ स्वीकार्य सुरक्षा के लिए चुना गया।

पूर्व)

echo password | ssh id@server

यह काम नहीं करता है।

मुझे याद है कि मैंने कुछ चालों के साथ ऐसा किया था, लेकिन किसी ने मुझे निर्देशित नहीं किया, लेकिन अब मुझे याद नहीं है कि मैंने जो चाल चली थी ...


2
FreeBSD ने पासवर्ड-कम कुंजियों को स्वीकार नहीं किया। ललचाओ मत। हालाँकि कुछ लिनक्स सर्वरों ने इसे स्वीकार कर लिया। मेरा मानना ​​है कि लिनक्स सर्वर गलत था।
Eonil

16
यह एक वैध प्रश्न है। उदाहरण के लिए, मैं एक उपयोगकर्ता को एक पासवर्ड दर्ज करने की अनुमति देना चाहता हूं, फिर उसका उपयोग करके किसी अन्य मशीन में लॉगिन करें। मैं यह नहीं मान सकता कि हमारे सभी मशीनों में वितरित ssh कुंजियाँ होंगी। अब तक के जवाब इस स्थिति में मदद नहीं करते हैं।
dfrankow


बहुत महत्वपूर्ण प्रश्न। मुझे एक उत्तर की भी आवश्यकता है, सर्वर पर कीफाइल्स डालने के लिए मेरे webspace प्रदाता ब्लॉक हैं, इसलिए मुझे बिना चाबी के के पासवे पास करना होगा।
Radon8472

जवाबों:


382

पासवर्ड का उपयोग न करें। एक पासफ़्रेज़लेस SSH कुंजी बनाएँ और इसे अपने VM में धकेलें।

यदि आपके पास पहले से ही SSH कुंजी है, तो आप इस चरण को छोड़ सकते हैं ... बस Enterकुंजी और दोनों पासफ़्रेज़ के लिए हिट करें :

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

अपनी कुंजियों को लक्ष्य सर्वर पर कॉपी करें:

$ ssh-copy-id id@server
id@server's password: 

अब मशीन में लॉग इन करने की कोशिश करें ssh 'id@server', और:

.ssh/authorized_keys

यह सुनिश्चित करने के लिए कि हमने अतिरिक्त कुंजियाँ नहीं जोड़ी हैं जिनसे आप उम्मीद नहीं कर रहे थे।

अंत में लॉग इन चेक करें ...

$ ssh id@server

id@server:~$ 

ssh-agentयदि आप अपने कुंजी को पासफ़्रेज़ के साथ सुरक्षित रखने का प्रयास करना चाहते हैं, तो आप इसका उपयोग करना चाह सकते हैं।


14
मैंने अंत में मुख्य जोड़े का उपयोग करने का फैसला किया। क्योंकि मुझे एहसास हुआ कि यह सबसे सरल तरीका है।
Eonil

9
@ ईऑनिल: पास वाक्यांश के बिना कुंजियों का उपयोग करने के लिए परीक्षा न करें। Ssh- एजेंट या पेजेंट का उपयोग करना सीखें।
user619714

119
यह एक अच्छा जवाब है, लेकिन सवाल का सही जवाब नहीं है।
जॉन हंट

74
इस प्रकार के उत्तर वास्तव में, वास्तव में मुझे परेशान करते हैं। यह सवाल नहीं था। किसी ने नहीं पूछा कि प्रमुख जोड़े का उपयोग कैसे करें।
मैट फ्लेचर

16
इस सवाल का जवाब नहीं है। यह पूरी तरह से अलग प्रश्न के लिए एक अच्छा जवाब है, लेकिन यह पूछे जाने वाले के लिए भयानक है।
श्रीचूलो

594
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
हाँ, कभी-कभी आप विभिन्न कारणों से कुंजी आधारित आधार का उपयोग नहीं कर सकते हैं .. उदाहरण के लिए अभी मैं एक plesk सर्वर पर कीआथ का उपयोग नहीं कर सकता क्योंकि बॉक्स से यह सक्षम नहीं है और मेरे पास रूट नहीं है।
जॉन हंट

17
+1! साइड नोट के रूप में, आरएसए फिंगरप्रिंट की पुष्टि करने के लिए आपको sshउपयोग sshpassकरने से पहले एक बार प्लेन चलाना होगा
user123444555621

21
-1 कमांड में पासवर्ड का उपयोग करने के लिए। यह .bash_historyआपकी मशीन पर सादे पाठ में पासवर्ड लॉग करता है ।

15
@MisterDood आप history -rअपने इतिहास को मिटाने के लिए आदेश के बाद चला सकते हैं । हालांकि अच्छी बात है।
न्यूक्लियरपेयन

20
प्रो टिप: यदि आप एक विशिष्ट कमांड को .bash_history में दिखाना नहीं चाहते हैं, तो एक स्थान के साथ कमांड को उपसर्ग करें। यह सिर्फ काम करता है। हालांकि, इस कमांड के उपयोगकर्ताओं को अधिक चिंतित होना चाहिए कि सिस्टम पर गैर-विशेषाधिकार प्राप्त उपयोगकर्ता पीएस के साथ पूर्ण कमांड-लाइन देख सकते हैं, जो निश्चित रूप से पासवर्ड शामिल करता है। चूंकि ssh सत्र लंबे समय तक चलते हैं, यह एक सुरक्षा मुद्दा है।
क्यूबिकलसॉफ्ट

71

जबकि आपके प्रश्न का सही उत्तर sshkey है , लेकिन अधिक सुरक्षित तरीका है - SSH कुंजियाँ। आप समाधान से सिर्फ तीन आसान कदम दूर हैं:

एक rsa कीपर उत्पन्न करें :

# ssh-keygen

फिर इसे सर्वर पर एक साधारण कमांड से कॉपी करें :

# ssh-copy-id userid@hostname

अब आप बिना पासवर्ड के लॉग इन कर सकते हैं :

# ssh userid@hostname

1
डिफ़ॉल्ट मानों के साथ ठीक काम करता है। प्रयास करते समय ~ / rsa4live.pub का उपयोग करना मेरे लिए कारगर नहीं था ssh-copy-id
सेस टिम्मरमैन

1
यदि आप विभिन्न उपयोगकर्ताओं के लिए काम करना चाहते हैं, तो 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
मेरे लिए यह थाssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
गेब्रियल मेले

21
यह सवाल का जवाब नहीं है।
स्टीव बेनेट

2
तथा? जवाब है, ऊपर है sshpass ...
lzap

40

उम्मीद का उपयोग करें:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

उदाहरण:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
इसने काम किया लेकिन यह रिमोट मशीन के स्टडआउट को प्रिंट नहीं कर सकता है।
Eonil

यह कुछ मशीन के लिए अच्छी तरह से काम करता है अग्रिम में कुंजी नहीं डाल सकता है क्योंकि आईपी पते को हर बार बदल दिया जाता है।
लैरीकाई

4
-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullssh कमांड के लिए जोड़ने के लिए अच्छा होगा कि मशीन को ज्ञात_होस्ट में स्वीकार करने से बचें
लैरीकैकाई

B .. b लेकिन
मुह

इस स्क्रिप्ट का अधिक विस्तृत उदाहरण आप यहाँ देख सकते हैं: linuxaria.com/howto/… यहाँ इस उदाहरण को दूरस्थ कमांड के साथ भी काम करना चाहिए
Radon8472

16

यह आपके लिए कोई उपयोग नहीं हो सकता है, लेकिन आप इसे पर्ल के साथ कर सकते हैं:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

2
इसी तरह, आप इस रूबी github.com/net-ssh/net-ssh
EnabrenTane

15

मुझे आश्चर्य है कि उबंटू में पैकेज plinkसे किसी का उल्लेख नहीं किया गया है putty-tools:

plink user@domain -pw mypass  [cmd]

यह विंडोज पर भी उपलब्ध है और सिंटैक्स अधिकतर ओपनश क्लाइंट के साथ संगत है।


खिड़कियों के लिए आपका उत्तर अच्छा है, अनावश्यक रूप से लिनक्स / यूनिक्स उपयोगकर्ता आमतौर पर
पलक

2
यह putty-toolsपैकेज में है
eadmaster

10

SSH एकल साइन-ऑन आमतौर पर सार्वजनिक कुंजी प्रमाणीकरण और प्रमाणीकरण एजेंट के साथ प्राप्त किया जाता है। आप आसानी से अपने परीक्षण VM कुंजी को मौजूदा स्रोत एजेंट में जोड़ सकते हैं (नीचे उदाहरण देखें)। अन्य तरीके जैसे कि gssapi / kerberos मौजूद हैं, लेकिन अधिक जटिल हैं।

sshpass

उन स्थितियों में जहाँ passwordकेवल प्रमाणीकरण विधि उपलब्ध है, sshpass का उपयोग स्वतः पासवर्ड दर्ज करने के लिए किया जा सकता है। कृपया मैन पेज की SECURITY CONSIDERATIONS अनुभाग पर विशेष ध्यान दें । सभी तीन विकल्पों में, पासवर्ड किसी बिंदु पर प्लेनटेक्स्ट में दिखाई या संग्रहीत होता है :

अनाम पाइप (sshpass द्वारा अनुशंसित)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

यकीनन यह काफी बोझिल है, यकीनन प्रोग्रामिंग लैंग्वेजेज से आसान है। पासवर्ड लिखे जाने से पहले एक और प्रक्रिया आपके पाइप / एफडी से जुड़ी हो सकती है। अवसर की खिड़की आपकी प्रक्रियाओं या रूट तक काफी कम और सीमित है।

वातावरण विविधता

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

जब आप sshpass चल रहा होता है तब आप और रूट आपकी प्रक्रिया के पर्यावरण चर (यानी आपका पासवर्ड) पढ़ सकते हैं cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=। अवसर की खिड़की बहुत लंबी है लेकिन फिर भी आपकी स्वयं की प्रक्रियाओं या जड़ तक ही सीमित है, अन्य उपयोगकर्ताओं के लिए नहीं।

कमांड-लाइन तर्क (कम से कम सुरक्षित)

 sshpass -p my_secret_password ssh user@host

यह सुविधाजनक लेकिन कम सुरक्षित है जैसा कि मैन पेज में वर्णित है। कमांड लाइन तर्क सभी उपयोगकर्ताओं (जैसे ps -ef | grep sshpass) को दिखाई देते हैं । sshpass तर्क को छिपाने का प्रयास करता है, लेकिन अभी भी एक विंडो है, जिसके दौरान सभी उपयोगकर्ता आपके पासवर्ड को तर्क द्वारा पारित देख सकते हैं।

पक्षीय लेख

अपने बैश सेट HISTCONTROL चर करने के लिए ignorespaceया ignorebothऔर एक अंतरिक्ष के साथ अपने संवेदनशील आदेशों लगा दें। वे इतिहास में सहेजे नहीं जाएंगे।


SSH सार्वजनिक कुंजी प्रमाणीकरण

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

पासफ़्रेज़ बहुत महत्वपूर्ण है। निजी कुंजी फ़ाइल प्राप्त करने वाला कोई भी व्यक्ति पासफ़्रेज़ के बिना इसका उपयोग नहीं कर सकेगा।

SSH प्रमाणीकरण एजेंट सेट करें

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

हमेशा की तरह कनेक्ट करें

ssh user@host

लाभ यह है कि आपकी निजी कुंजी एन्क्रिप्ट की गई है और आपको केवल एक बार (इसके अलावा सुरक्षित इनपुट विधि के माध्यम से) अपना पासफ़्रेज़ दर्ज करने की आवश्यकता है।


8

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


3
पासवर्ड के बिना SSH कुंजी का उपयोग करना फ़ाइल में पासवर्ड का उपयोग करने की तुलना में केवल थोड़ा अधिक सुरक्षित है।
यॉनजेन

10
@ यूएनजन गलत। मुख्य प्रमाणीकरण आपको मित-हमलों से बचाता है, भले ही आप मेजबान कुंजी को नहीं जानते हों। एक हमलावर सर्वर को प्रतिरूपित कर सकता है, लेकिन वास्तविक सर्वर से कभी नहीं जुड़ता है। पासवर्ड प्रमाणीकरण के साथ आप जिस भी सर्वर से जुड़ेंगे (वैध है या नहीं) पासवर्ड देखेंगे। उन कारणों के लिए पासवर्ड के बिना एक ssh कुंजी एक फ़ाइल में पासवर्ड को संग्रहीत करने की तुलना में बहुत अधिक सुरक्षित है।
कास्परड

14
यह कोई उत्तर नहीं है।
स्टीव बेनेट

@SteveBennett यह स्वीकार किए गए उत्तर के समान है और इसके पहले पोस्ट किया गया था, हालांकि इसका विवरण कम है।
माइकल हैम्पटन

3
खैर, मैं कहूंगा कि स्वीकृत उत्तर एक सवाल का एक सभ्य जवाब है जो नहीं पूछा गया था। यह कुछ भी नहीं है।
स्टीव बेनेट

4

आपकी स्वचालन आवश्यकताओं के आधार पर, शायद आपके लिए एक उपयुक्त फिट होगा। यह पासवर्ड के लिए संकेत देने, sudo पासवर्ड के लिए संकेत देने, उपयोग के विभिन्न तरीकों को बदलने, सुरक्षित रूप से एन्क्रिप्टेड रहस्यों (वॉल्ट) का उपयोग करने जैसी चीजों को अच्छी तरह से प्रबंधित कर सकता है।

यदि यह उपयुक्त नहीं है, तो मैं अपेक्षा करूंगा, जैसा कि एक अन्य उत्तर में सुझाया गया है।

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