SSH कुंजी पासफ़्रेज़ के लिए एक बार और केवल जरूरत पड़ने पर कैसे प्राप्त करें?


15

(मैंने इस साइट पर कई सवाल पढ़े हैं जो संबंधित हैं और मेरा मानना ​​है कि यह वास्तव में एक नया प्रश्न है।)

मेरे पास बहुत सारे सर्वरों पर बहुत सारी चाबियाँ हैं और वे सभी पासफ़्रेज़ के साथ संरक्षित हैं।

मैं पासफ़्रेज़ में प्रवेश करना पसंद करता हूं, जितना मुझे पासवर्ड दर्ज करना पसंद है - यह एक वास्तविक उत्पादकता नाली है।

  • ssh-agent + ssh-add कमांड का उपयोग लॉगिन शेल पर किया जा सकता है, मतलब यह है कि लॉगिन करने के बाद आपको केवल अपना पासफ़्रेज़ दर्ज करना होगा

  • किचेन का उपयोग लॉगआउट से परे एक ssh- एजेंट को जीवित रखने के लिए किया जा सकता है, इसलिए उदाहरण के लिए आपके पास यह हो सकता है इसलिए आपको केवल एक बार बूट में पासफ़्रेज़ दर्ज करना होगा, या आप इसे एक-एक घंटे तक जीवित रख सकते हैं।

मेरे पास समस्या यह है कि इन दोनों समाधानों को आम तौर पर एक शेल लॉगिन में आरंभ किया जाता है (उदाहरण के लिए .zshrc) जब मैं लॉग इन करता हूं तो मुझे अपने पासफ़्रेज़ में प्रवेश करने पर भरोसा होता है, भले ही मुझे इसकी आवश्यकता नहीं हो। (मैं एक एजेंट को अनिश्चित काल तक जीवित रखने में किचेन से खुश नहीं हूं।)

मैं चाहूंगा कि केवल जरूरत पड़ने पर पासफ़्रेज़ (एजेंट के लिए) के लिए संकेत दिया जाए ।

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

मैं ध्यान देता हूं कि यह Gnome जैसे चित्रमय डेस्कटॉप पर संभव है - जैसे ही आप ssh करने की कोशिश करते हैं, वैसे ही आपको अपनी निजी कुंजी अनलॉक करने के लिए पासफ़्रेज़ के लिए एक पॉप-अप प्राप्त होता है। तो यह वही है जो मैं बाद में हूं, लेकिन एक कंसोल से।


बिना पासफ़्रेज़ के सिर्फ ssh-keys क्यों नहीं बनाते? यदि आप वैसे भी इस सारी परेशानी से गुजरने वाले हैं?
देवनुल २०'१५

1
यदि कोई अंदर जाता है और पासवर्ड-कम कुंजियाँ (या एक सक्रिय ssh एजेंट) है, तो वे कई अन्य सर्वरों तक भी पहुँच बना सकते हैं। इसके अलावा पासफ़्रेज़-कम कुंजियों को चुराया और कहीं और इस्तेमाल किया जा सकता है।
Artfulrobot

जहां तक ​​मुझे पता है, सुरक्षा के कुछ स्तर का त्याग किए बिना आप जो चाहते हैं, वह करने का कोई तरीका नहीं है, जो आपको लगता है कि आप ऐसा नहीं करना चाहते हैं। यहाँ थॉमस निमन द्वारा एक गहराई से उत्तर दिया गया था जो कई संभावनाओं में जाता है यदि आपने इसे पहले ही नहीं पढ़ा है: unix.stackexchange.com/a/90869/82289 । मैं एक मध्यवर्ती सर्वर के उपयोग से अपनी कंपनी में इसे प्राप्त करता हूं जो Tmux के साथ ssh सत्र का प्रबंधन करता है।
देवनुल २०'१५

@DevNull अजीब लगता है कि आप इसे डेस्कटॉप के साथ कर सकते हैं लेकिन टर्मिनल के साथ नहीं? निश्चित रूप से यह सिर्फ एजेंट को टैटी में कूदने की जरूरत है अगर कोई कुंजी नहीं जोड़ी गई है? यह वही होना चाहिए जिस तरह से गुई काम करते हैं?
आर्टफ्लोरोबोट

आप यहाँ मेरे जवाब पर एक नज़र डाल सकते हैं: unix.stackexchange.com/a/184160/89706 (प्रश्न का लिंक: unix.stackexchange.com/questions/90853/… )
जॉनी

जवाबों:


16

अपने किसी भी शेल स्टार्टअप स्क्रिप्ट में कुछ भी न जोड़ें, यह अनावश्यक हैकरी है।

इसके बजाय, जोड़ें

AddKeysToAgent yes

आपके .ssh / config के लिए

इस तरह, ssh-add स्वचालित रूप से पहली बार ssh को किसी अन्य बॉक्स में चलाया जाता है। आपको केवल अपनी कुंजी फिर से दर्ज करनी होगी जब वह ssh- एजेंट से समाप्त हो जाए या आपके द्वारा रिबूट होने के बाद।


काश लोग वोटिंग के दौरान टिप्पणी करते। अगर यह सही नहीं है तो हमें पता है कि यह सही क्यों नहीं है। पोस्ट करने के लिए धन्यवाद, आपके पास अपने सुझाव को आजमाने का समय नहीं है।
Artfulrobot

मुझे भी आश्चर्य हुआ, शायद मेरे क्रॉस-पोस्ट्स के कारण?
टोबी

यह मेरे लिए काम करता है। हालाँकि यह ओपेनश (7.2) के लिए एक बहुत ही हालिया जोड़ है। मामले में यह किसी की मदद करता है, ओपनशिन 7.3 डेबियन सिड में उपलब्ध है।
Artfulrobot

@artfulrobot: अजीब बात है, क्योंकि मेरे पास यह बहुत ही व्यवहार था (ssh के पहले कॉल पर ऑटो-ssh-add) सालों से काम कर रहा था, जब तक कि यह कुछ समय पहले बंद नहीं हो गया। कारण की खोज करते हुए, मैंने AddKeysToAgent को ढूंढ लिया और यह मान लिया कि इसका कारण यह था कि दुर्घटना से मैंने अपने .ssh / config और AddKeysToAgent को साफ किया होगा। अब मुझे आश्चर्य है कि ओपनएसएसएच 7.2 जारी होने से पहले यह क्यों काम कर रहा था? मैं इस बात की कल्पना नहीं कर रहा हूं :-)
टॉबी

@ यह ठीक वही है जो मुझे चाहिए। दुर्भाग्य से, ssh- एजेंट kubuntu में स्वचालित रूप से शुरू नहीं होता है, इसलिए यह अगली बात है जिसे मुझे हल करने की आवश्यकता है।
ओगादे

7

Zsh में एक preexecहुक होता है जो कमांडलाइन पर दर्ज कमांड निष्पादित होने से पहले एक फ़ंक्शन को निष्पादित करता है। यहां एक हुक है जो sshआपकी कमांड लाइन में दिखता है और यदि पाया जाता है, तो ssh एजेंट के अस्तित्व की जांच करता है। अगर वह नहीं मिला, तो वह चाबी का गुच्छा चलाता है।

तो इस तरह, चाबी का गुच्छा केवल ssh कमांड से पहले चलाया जाता है, और उसके बाद ही यदि आवश्यक हो।

इसे अपने में रखें ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

जब भी कोई कमांड टाइप की जाती है तो यहां क्या होता है, check_sshकमांड निष्पादित होने से पहले कहा जाता है।

फ़ंक्शन की पहली पंक्ति sshZsh regex का उपयोग करने के लिए विस्तारित कमांड की जांच करती है । दोनों ओर sshशब्द सीमाएँ होनी चाहिए \b। यदि यह नहीं मिलता है, तो फ़ंक्शन वापस आ जाता है।

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

अंत में हम चाबी का गुच्छा शुरू करते हैं, एजेंट को एक घंटे तक जीवित रखने के लिए।

यह अभी भी, जैसे एम्बेडेड ssh सामग्री के बारे में समस्या छोड़ देता है gitया rsyncया scpके रूप में है कि समारोह ट्रिगर नहीं करेगा (आप रेगुलर एक्सप्रेशन से करने के लिए इन जोड़ सकते हैं)।


इसके बिना भी zsh, एक ही प्रभाव के साथ एक छोटी स्क्रिप्ट बना सकता है और PATHवास्तविक sshग्राहक के सामने रख सकता है । हो सकता है कि वे rsyncएट अल के साथ भी काम करें , अगर वे सीधे PATHदौड़ने के बजाय पढ़ते /usr/bin/sshहैं।
इल्काचू

2

Zsh के लिए, मैंने उपयोगिताओं और रैपरों का एक सेट लिखा है जो आप चाहते हैं कि कम से कम: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

वास्तव में यह और भी अधिक है क्योंकि करता है, ssh-agentसभी प्रवेश सत्र द्वारा साझा किया जाएगा (डेस्कटॉप या SSH के माध्यम से, और GNU स्क्रीन भी समर्थित है, तो उसे अपने साथ, जैसे से लॉगिन गोले शुरू shell -zshमें ~/.screenrcफ़ाइल), और यह करने के बाद ही बंद हो जाएगा अंतिम सत्र समाप्त

नोट: मैं अपनी सभी कुंजियों के लिए केवल एक पासफ़्रेज़ का उपयोग करता हूं। मैं विभिन्न पासफ़्रेज़ के लिए व्यवहार के बारे में निश्चित नहीं हूँ; कुछ परिवर्तनों की आवश्यकता हो सकती है।


वाह, यह काफी कोड है। अच्छा काम और साझा करने के लिए धन्यवाद। मुझे लगता है कि मुझे कुछ सरल चाहिए - एसएसएच मेरे लिए एक बहुत ही महत्वपूर्ण उपकरण है।
Artfulrobot
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.