क्या आप स्वचालित लॉगिन की अनुमति देने के लिए .ssh / config में पासवर्ड सेट कर सकते हैं?


93

मैं Ubuntu 11.10 का उपयोग कर रहा हूं। मैं sshरोजाना कई सर्वरों से जुड़ने के लिए उपयोग कर रहा हूं , इसलिए मैंने उनके पैरामीटर .ssh/configइस तरह फाइल में डाल दिए हैं :

Host Home
User netmoon
Port 22
HostName test.com

क्या इस फ़ाइल में प्रत्येक कनेक्शन के लिए पासवर्ड डालने का एक तरीका है, ताकि, जब सर्वर पासवर्ड मांगता है, टर्मिनल अपने पासवर्ड में प्रवेश करता है और इसे सर्वर पर भेजता है?

मुझे इसकी आवश्यकता है क्योंकि कभी-कभी मैं पीसी से दूर खड़ा होता हूं और जब मैं वापस जाता हूं, तो एक पासवर्ड टाइप करें और Enterटर्मिनल को दबाएं CONNECTION CLOSED

पुनश्च मैं एक सार्वजनिक / निजी कुंजी जोड़ी का उपयोग नहीं करना चाहता।


1
मैं उसी स्थिति में हूं और मैं अपनी सार्वजनिक कुंजी अपलोड नहीं कर सकता क्योंकि मेरे पास केवल svn के लिए ssh एक्सेस है। अगर मैं ssh svnhost की कोशिश करता हूं तो मुझे "(सफलता (2 2) (संपादित करें-पाइपलाइन svndiff1 अनुपस्थित-प्रविष्टियां कमिट-रीप्रॉप्स डेप्थ लॉग-रिवप्रॉप्स आंशिक-रिप्ले)))" svnserve response और not shell
Uberto

उपयोग करके एक तरह से unix.stackexchange.com/a/83991/26493 और andre.frimberger.de/index.php/linux/… देखें SSH_ASKPASS
ओलाफ डाइटश

जवाबों:


56

सुविधा के लिए सुरक्षा बंद करने से व्यापार कभी खत्म नहीं होता ...

क्या आप पैकेज ssh-copy-idसे उपयोग कर सकते हैं openssh-client?

से man ssh-copy-id:

ssh-copy-id एक स्क्रिप्ट है जो किसी दूरस्थ मशीन में लॉग इन करने के लिए ssh का उपयोग करती है और संकेतित पहचान फ़ाइल को उस ~ ~ /। ssh / प्राधिकृत_की फ़ाइल में जोड़ देती है।


12
यदि दूरस्थ व्यवस्थापक सार्वजनिक कुंजी प्राधिकरण को अक्षम करने पर जोर देता है तो यह काम नहीं करता है ...
tomasz

2
हां, लेकिन आपके संपूर्ण प्रत्यक्ष पर्यवेक्षण और नियंत्रण के तहत प्रणालियों पर यथार्थवादी होना समझौता नहीं कर रहा है। उदाहरण के लिए, उदाहरण के लिए, बिना किसी बाहरी कनेक्शन के एक योनि आभासी मशीन पर केवल एक सीट पर विकास के प्रयोजनों के लिए उपयोग किया जाता है।
स्कॉट

36
बिना कारण के ड्रैकुअन सुरक्षा पर जोर देना भी कभी ठीक नहीं होता।
cwallenpoole

6
कभी-कभी यह अच्छी तरह से समाप्त होता है।
देव

3
IMHO, प्रमाणीकरण के लिए पासवर्ड का आग्रह अधिक जोखिम से है। मैं अक्सर वातावरण चर के रूप में ssh के लिए उपयोग किए जाने वाले पासवर्ड सेट करता हूं क्योंकि मैं मनमाने तार के एक सेट को याद करने के लिए तैयार हूं। उपयोगकर्ताओं की मांग करके उन्हें दर्ज करना बस उन्हें खराब संग्रहित करने के लिए कह रहा है।
एग्मैटर्स

26

यदि आप वास्तव में सार्वजनिक / निजी कुंजी जोड़ी का उपयोग नहीं करना चाहते हैं, तो आप expectगंतव्य पते के आधार पर स्वचालित रूप से आपके लिए पासवर्ड दर्ज करने के लिए एक स्क्रिप्ट लिख सकते हैं ।

संपादित करें: मेरा मतलब है कि आपके पास एक स्क्रिप्ट हो सकती है, जो एक ओर, expectआपके लिए पासवर्ड दर्ज करने के लिए उपयोग करती है और दूसरी ओर, किसी दिए गए उपयोगकर्ता के लिए पासवर्ड पढ़ती है और कॉन्फ़िगरेशन फ़ाइल से होस्ट करती है। उदाहरण के लिए, निम्नलिखित अजगर स्क्रिप्ट धूप के दिन के परिदृश्य के लिए काम करेगी:

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

और विन्यास फाइल प्रारूप इस प्रकार होगा:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

नोट: जैसा कि समझाया गया है, अजगर स्क्रिप्ट को ssh और सभी संभावित URL से सभी संभावित त्रुटियों और प्रश्न संदेशों को संभालने के लिए और अधिक जटिल होने की आवश्यकता होगी (उदाहरण में यह माना जाता है कि यह कुछ ऐसा होगा user@host, लेकिन उपयोगकर्ता हिस्सा isn है] टी ज्यादातर समय का उपयोग किया जाता है), लेकिन मूल विचार अभी भी वही होगा। कॉन्फ़िगरेशन फ़ाइल के बारे में, आप एक अलग कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं या .ssh/configउस फ़ाइल को पार्स करने के लिए अपना कोड लिख सकते हैं और किसी दिए गए उपयोगकर्ता और होस्ट के लिए पासवर्ड प्राप्त कर सकते हैं।


क्या आप आगे बता सकते हैं?
नेटमून

@ नेटमून मैंने अपने उत्तर के लिए एक छोटा सा उदाहरण जोड़ दिया।
जुलैलाडो

यह कैसे .ssh / config फ़ाइल में पासवर्ड डालने के सवाल का जवाब नहीं देता है
एरिक वुड्रूफ़

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

19

उसके लिए भी sshpassकार्यक्रम है। कैसे इस्तेमाल करे: sshpass -p MyPa55word ssh me@myservor.com


29
जब तक आप अपने कमांड को एक स्थान के साथ पेश नहीं करते हैं, ( sshpassइसके बजाय sshpass), आपने अपने पासवर्ड ("MyPa55word") को अपने शेल इतिहास फ़ाइल में संग्रहीत किया है।
वाल्टिनेटर

1
@waltinator अच्छा बिंदु
इगोर

3
खैर सवाल पूछने वाला इसके साथ ठीक था .ssh/config, शेल इतिहास में भी क्यों नहीं?
डार एग्रीशियस

यह आधिकारिक तौर पर Homebrew पर नहीं है, लेकिन आप किसी तृतीय-पक्ष रेपो से इंस्टॉल कर सकते हैं brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb। अधिक: gist.github.com/arunoda/7790979
याकूब फोर्ड

read -s password; sshpass -p "$password" ssh me@myservor.com। यह पासवर्ड को इतिहास में दिखाने से रोक देगा
अलेक्जेंडर बर्ड

19

कैसे ProxyCommand के बारे में:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

आप ssh -Wइसके बजाय उपयोग कर सकते हैं nc:

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

यह -Wविकल्प के साथ अपेक्षित के रूप में काम नहीं करेगा । क्या आपके पास कोई वर्कअराउंड है?
तोन गुयेन

2
यह अभी भी मुझसे इस प्रॉक्सी कमांड के साथ पासवर्ड मांगता है ...
विक्टर पायसबॉक्स

1
मुझे यह भी लगता है कि यह अभी भी एक पासवर्ड के लिए पूछता है। यह सब करने के लिए test.comएक पासवर्ड की Homeआवश्यकता होती है एक पासवर्ड की आवश्यकता से समस्या को स्थानांतरित करने के लिए लगता है । क्या बात है? यह काम करने के लिए क्या चाल है?
मार्टिन ब्रैमवेल

15

नहीं, यह संभव नहीं है मुझे डर है।

एकमात्र वास्तविक विकल्प निजी कुंजी का उपयोग करना है, लेकिन आपने कहा है कि आप नहीं चाहते हैं (क्यों नहीं?)।


7
क्योंकि मुझे सर्वर पर दूसरी कुंजी लगाने की अनुमति नहीं है।
नेटमून

2
@ नेटमून: यदि आप लॉग इन कर सकते हैं, तो आप एक कुंजी जोड़ सकते हैं, है ना? आपको केवल अपने घर की निर्देशिका तक लिखने की आवश्यकता है, जब तक कि सिसादमिन अजीब तरह से चीजों को सेट न करें।
स्कॉट सीवियरेंस

4
@ScottSeverance मुझे लगता है कि यह प्रश्न जिस स्थिति को संदर्भित करता है। कुंजी जोड़ने की क्षमता नहीं है। हां यह अजीब है, लेकिन अक्सर ऐसा होता है।
user239558

5
मेरे पास साझा होस्टिंग वातावरण का बहुत ही सामान्य अनुभव है जहां सार्वजनिक कुंजी पहुंच अक्षम है, इसलिए भले ही आप चाबियाँ जोड़ सकते हैं, उनका उपयोग नहीं किया जाता है। यह हाँ के कारण के खिलाफ जाता है, लेकिन जिस तरह से कई होस्टिंग प्रदाताओं ने अपने सर्वर स्थापित किए हैं
बिलोन्हा

1
ऐसे उत्तर हैं जो बताते हैं कि यह संभव है
एरिक वुड्रूफ़

8

आप / usr / स्थानीय / बिन में एक साधारण ssh स्क्रिप्ट प्रतिस्थापन बना सकते हैं:

#!/bin/bash

host=$1
password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

और फिर आपकी ~ / .ssh / config फाइल में आप उपयोग कर सकते हैं

Host foohost
    User baruser
    #Password foobarpassword

4

मैं VanDyke Software के एक एप्लिकेशन का उपयोग करता हूं जिसे SecureCRT कहा जाता है ।

http://www.vandyke.com/products/securecrt/

यह मुफ़्त नहीं है, लेकिन बहुत उचित कीमत है। मैंने इसे रिमोट एक्सेस, टर्मिनल इम्यूलेशन और (छितरी हुई) नेटवर्क मैनेजमेंट के लिए सालों (विंडोज पर चलने, या वाइन का इस्तेमाल करने) के लिए इस्तेमाल किया है। उन्होंने अंततः 2011 की शुरुआत में इसका एक देशी लिनक्स संस्करण जारी किया।

इसमें जटिल लॉगिन सेटिंग्स (या स्क्रिप्ट), संग्रहीत पासवर्ड (या प्रमाण पत्र), कई सत्रों के टैब, आदि का समर्थन है।

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

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

यदि आप रिमोट एक्सेस का उपयोग कर रहे हैं (आपकी मुख्य भूमिका का हिस्सा), तो यह एप्लिकेशन उपयोग के पहले महीने में इसके खर्च को उचित ठहराएगा।


क्षमा करें, मुझे समझ नहीं आया क्या तुम समझा सकते हो ?
नेटमून

1
आपके लिए फिर से तैयार ..
david6

2
उपरोक्त प्रतिक्रिया की पोस्टिंग के बाद से SecureCRT के कई पुनरावृत्तियों को शामिल किया गया है, जिसमें दिसंबर 2013 की शुरुआत में जारी किया गया नवीनतम वनडाइक भी शामिल है। प्रत्येक पुनरावृत्ति कार्यक्रम को और अधिक बहुमुखी बनाने में सुधार कर रहा है। इसमें एक समृद्ध एपीआई भी है जो कार्यक्रम को पायथन / वीबी लिपियों के साथ नियंत्रित / बाधित करने की अनुमति देता है। SecureCRT एक अच्छे दशक के लिए मेरे मुख्य टूलकिट का हिस्सा रहा है, और मैं इसकी अत्यधिक अनुशंसा करता हूं।
विले

माना। मैं प्रत्येक नई रिलीज़ को बीटा-परीक्षण करना जारी रखता हूं, और उबंटू में पोर्टिंग के लिए शुरुआती परीक्षण में भारी रूप से शामिल था ।
david6

2

आपके द्वारा पूछे गए प्रश्न का उत्तर देते हुए, नहीं, ssh config फाइल में डिफ़ॉल्ट पासवर्ड को कॉन्फ़िगर करना संभव नहीं है।

लेकिन अगर वास्तव में, जैसा कि आप कहते हैं, यह "क्योंकि कभी-कभी मैं पीसी से दूर खड़ा होता हूं और जब मैं वापस जाता हूं, तो एक पासवर्ड टाइप करें और Enterटर्मिनल दबाएं CONNECTION CLOSED" , फिर सत्र को बंद करने के बजाय क्यों नहीं रोकना चाहिए? SSH आपके लिए कनेक्शन जिंदा रख सकता है।

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2

1

धन्यवाद, प्रेरणा के लिए Arek ...

एक और शेल प्रक्रिया को चलाने के बजाय, यह सिर्फ एक फ़ंक्शन है जो वर्तमान बैश शेल में चल रहा है। यह एक चलाता awkकॉन्फ़िग फ़ाइल को पार्स करने और यह पता लगाने की अगर यह (के साथ एक खोल चर से या ssh कॉन्फ़िग फ़ाइल में पासवर्ड लिखा क्लियर से पासवर्ड लेना चाहिए आदेश awkएक में evalकरने के बजाय describeमुद्दों मैं का उपयोग कर मारा की वजह से describe)।

मैंने ProxyCommand का उपयोग करके sshpassसीधे एक sshकॉन्फ़िगर फ़ाइल में उपयोग करने के कई तरीकों की कोशिश की , लेकिन जब मैं RSA के माध्यम से एक बॉक्स में लॉग इन कर सकता था, सिवाय इसके कि उम्मीद के मुताबिक काम नहीं कर रहा था। लेकिन तब मुझे अपनी एन्क्रिप्टेड निर्देशिका को खोलने के लिए एक पासवर्ड भेजने की आवश्यकता थी। हालाँकि, नीचे मेरा कार्य मेरे लिए सभी मामलों में, यहां तक ​​कि सिग्विन के लिए भी काम करता है।

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

तब एक ~/.ssh/configखंड इस तरह दिखता है:

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

यदि #Passvar कॉन्फ़िगरेशन अनुभाग में मौजूद है तो यह ओवरराइड करता है #Password
$MYPASS_ENVVARपर्यावरण चर आपके पासवर्ड को पकड़े हुए है।

का आनंद लें!


1

करने के लिए @BrunoPereira का जवाब इस सवाल का स्पष्ट रूप से एक पासवर्ड दर्ज हैं और ssh कुंजी से बचने के बिना कनेक्ट करने के लिए एक वैकल्पिक पद्धति को दर्शाता है।

आप ~/.bashrcजल्दी से उस कमांड को निष्पादित करने के लिए एक स्क्रिप्ट, एक उपनाम या अपने में एक फ़ंक्शन बना सकते हैं ।

जाहिर है, सुरक्षा दृष्टिकोण हैं जिन्हें आपको इस दृष्टिकोण के साथ ध्यान में रखना चाहिए।


यह बहुत अच्छा है कि आप किसी समाधान से जुड़ते हैं - हालाँकि, आगे बढ़ना और यहाँ समाधान पोस्ट करना भी अच्छा अभ्यास है। इस तरह, यदि लिंक कभी भी हटा दिया जाता है (जैसा कि कभी-कभी स्टैक एक्सचेंज पर होता है) तो यहां अभी भी एक उपयोगी जवाब है।
पॉल

0

यहाँ मेरे ArekBurdach के उत्तर पर विस्तृत विवरण दिया गया है। यह निम्नलिखित एक्सटेंशन प्रदान करता है:

  • मेजबान में कहीं भी हो सकता sshकमांड लाइन; यानी यह ssh <args> <host> <commands>सिंटैक्स का भी समर्थन करता है
  • पथ को हार्ड-कोड नहीं करता है ssh
  • अधिक मजबूत पार्सिंग ssh_config
  • बोनस: के लिए आवरण scp, भी

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

स्थापना

अपने में उपनामों को परिभाषित करें ~/.bashrc:

alias ssh=ssh-wrapper
alias scp=scp-wrapper

विन्यास

IgnoreUnknownनिर्देश के साथ , sshएक नए शुरू किए गए Passwordनिर्देश के बारे में शिकायत नहीं करता है , इसलिए (@ ArekBurdach के उत्तर के विपरीत), हम इसे "वास्तविक" कॉन्फ़िगरेशन के रूप में प्रदर्शित कर सकते हैं। यदि आपको यह पसंद नहीं है, तो स्क्रिप्ट को वापस कमेंट-आउट करने के लिए तुच्छ है।

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword

0

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

इसे करने का तरीका @Eric Woodruff के ProxyCommand के अलावा कुंजी का उपयोग करके आपके पासवर्ड को एन्क्रिप्ट करने का है

गठबंधन करने का एक तरीका पाइप का उपयोग कर रहा है:

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

कहाँ पे

Host real-destination
    Hostname test.com
    User netmoon

0

ब्लॉग में वर्णित तरीका है कि कैसे उपयोग sshpass किया जा सकता है, इसका एक मामूली रूप है । यह देखते हुए कि आपके पास एक gpg एन्क्रिप्टेड पासवर्ड है (यह ओ.टी. कैसे ब्लॉग में वर्णित है) फ़ाइल आप इस तरह से कुछ कर सकते हैं:

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

और बस अपने आप में एक उपनाम के रूप में उस आदेश को बचाओ .bashrc

यदि आप उस कनेक्शन के माध्यम से सुरंग बनाना चाहते हैं तो आप कुछ ऐसा कर सकते हैं

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.