शेल स्क्रिप्ट से ssh- एजेंट चलाना


19

मैं एक शेल स्क्रिप्ट बनाने की कोशिश कर रहा हूं, जो अन्य चीजों के अलावा, ssh-agent को शुरू करता है और एजेंट के लिए एक निजी कुंजी जोड़ता है। उदाहरण:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

इस समस्या के साथ ssh- एजेंट जाहिरा तौर पर $ SHELL का एक और उदाहरण निकालता है (मेरे मामले में, bash) और स्क्रिप्ट के दृष्टिकोण से यह सब कुछ निष्पादित किया गया है और ssh-add और इसके नीचे कुछ भी कभी नहीं चलाया जाता है।

मैं अपने शेल स्क्रिप्ट से ssh-agent कैसे चला सकता हूं और इसे कमांड की सूची में आगे बढ़ाता रहूं?

जवाबों:


8

ssh-agent एक सत्र शुरू करने वाला है और जब यह खत्म हो जाता है तो उपयोगकर्ता सत्र समाप्त हो जाता है। तो ssh- एजेंट के बाद किसी भी कमांड को लॉगऑफ के बाद संभवतः निष्पादित किया जाएगा।

आप जो चाहते हैं वह session-scriptइस तरह से आपके सत्र कमांड हैं:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

फिर शुरू करें ssh-agent session-script


धन्यवाद! एक अलग स्क्रिप्ट का निर्माण किया और स्क्रिप्ट को समाप्त करने की exitकोशिश की।
दान

2
सत्र-लिपि क्या है?
अलेक्जेंडर मिल्स

15

अपनी स्क्रिप्ट के शीर्ष पर निम्नलिखित रखें:

eval `ssh-agent`

आपकी स्क्रिप्ट इस तरह दिखनी चाहिए:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

व्याख्या

चारों ओर के बैकटिक्स ssh-agentइसके आउटपुट को इकट्ठा करते हैं। evalउस आउटपुट को इकट्ठा करता है, इसे एक ही कमांड में सम्मिलित करता है, और फिर कमांड निष्पादित करता है। फिर आप ssh-addअपनी प्रमुख साख प्रदान करने के लिए उपयोग कर सकते हैं ।


9
यह वही है जो मुझे चाहिए था, धन्यवाद, हालांकि यह इंगित करने के लायक है कि बैकटिक्स बाहर के रास्ते पर हैं। नए बैश रूप में, यह होना चाहिएeval $(ssh-agent)
sibaz

यह समाधान मेरे लिए तब तक काम नहीं आया जब तक मैंने bash -iस्क्रिप्ट के अंत में नहीं रखा ।
अडोल्फ़ो कोरीया

6

मैं लिपियों में कुछ ऐसा करने की कोशिश करता हूं जिसमें एक एजेंट की आवश्यकता होती है।

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

मूल रूप से पहली बात यह है कि स्क्रिप्ट यह देखने के लिए जांचती है कि क्या एक एजेंट चल रहा है। यदि यह निष्पादित नहीं होता है, तो इसका उपयोग स्क्रिप्ट के स्थान पर एक नई प्रक्रिया शुरू करने के लिए किया जाता है। एजेंट शुरू किया जाता है, चाबियाँ जोड़ी जाती हैं, और आखिरकार, स्क्रिप्ट को फिर से कहा जाता है (देखें $0)।


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

3
आप उपयोग कर सकते हैं .. "ssh-add ; $0 $*", या .. "ssh-add ; $0 $@"इसके बजाय, जो काम कर सकते हैं। जो सही नहीं होगा, लेकिन निश्चित रूप से कई मामलों में काम करेगा। सबसे अच्छा समाधान लगभग हमेशा है कि आपके एजेंट को किसी भी चीज़ से पहले चल रहा है, यह सिर्फ कुछ है जो अस्पष्ट मामलों में उपयोगी हो सकता है।
Zoredache

6

मुझे यह काम मेरे लिए मिला।

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

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


4

इस मामले में किचेन का उपयोग करना बेहतर है

Debian / Ubuntu:

apt-get install keychain

RHEL / फेडोरा / CentOS

yum install keychain

अपने .bashrc में निम्नलिखित जोड़ें:

eval `keychain --eval id_rsa`

बेहतर? यह बेहतर क्यों है?
JFlo

इसमें @JFlo "बेहतर", यह env चरों को $ HOME / .keychain / <file> में सेव करेगा। यदि वह अभी भी चल रहा है तो उस कमांड को फिर से मौजूदा ssh- एजेंट पिक करेगा। इसके बाद गोले / लिपियों के बीच पुन: उपयोग किया जा सकता है। कुछ परिदृश्यों में जो सुपर सेफ नहीं है, इसलिए आपको वह कॉल करना होगा। मेरे लिए, यह एक ही कार्य को पूरा करने के लिए लिखी गई कुछ लिपियों में सुधार है
स्कॉट कार्लसन

2

मैंने Zoredache के समाधान के साथ पाया, कुंजी किसी भी शेल के लिए उपलब्ध होगी जो उसी ssh-agent को शेल के रूप में साझा करने के लिए होती है जिसे स्क्रिप्ट कहा जाता है। मैं ऐसी स्क्रिप्ट से बचना चाहता था जिसमें स्पष्ट सुरक्षा कारणों से रिमोट मशीन के लिए रूट एक्सेस की आवश्यकता हो।

मैंने स्क्रिप्ट कार्य के शीर्ष पर निम्नलिखित शेबंग को रखा है:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

मैंने कोशिश की है और बहुत कुछ है और समाधान जो अंततः काम करता है, मेरे पासफ्रेज़ को एक खाली स्ट्रिंग के साथ बदल रहा है।

ssh-keygen -p

यह बहुत असुरक्षित अभ्यास है। क्यों परेशान ssh का उपयोग कर? यदि आप अपनी निजी कुंजी की सुरक्षा नहीं करते हैं, तो आप स्पष्ट पाठ में बात कर सकते हैं।
JFlo

@JFlo: यदि आपका क्लाइंट सिस्टम पर्याप्त रूप से सुरक्षित नहीं है, तो यह हो सकता है। खासकर यदि आप (और कर सकते हैं) ACL, SELinux, या समान को जोड़ सकते हैं, जो एक स्थिर फ़ाइल के साथ आसान है, लेकिन ssh- एजेंट के यादृच्छिक सॉकेट के साथ कम है। यह कहा कि मैं आमतौर पर पहली पसंद के रूप में यह सिफारिश नहीं करेंगे।
dave_thompson_085

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