Crontab में शेल स्क्रिप्ट का उपयोग करके दूरस्थ मशीन में ssh करने में सक्षम नहीं है


11

नीचे वह स्क्रिप्ट है जिसे मैं चलाने की कोशिश कर रहा हूं, जो बिना किसी मुद्दे के चलती है

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

लेकिन एक बार जब मैं इसे crontab में जोड़ता हूं, तो यह मुझे उपयोगकर्ता नहीं देता है।

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

कृपया अपने विचार दें .....

क्रोन दानव चल रहा हो सकता है, इसलिए हमें कुछ बायनेरिज़ को शामिल करने की आवश्यकता है ...?


1
अनुमति अस्वीकृत (publickey, gssapi-keyex, gssapi-with-mic, पासवर्ड)। अनुमति अस्वीकृत (publickey, gssapi-keyex, gssapi-with-mic, पासवर्ड)। अनुमति अस्वीकृत (publickey, gssapi-keyex, gssapi-with-mic, पासवर्ड)।

इसके साथ आपके क्या इरादे हैं? आप क्या हासिल करने का प्रयास कर रहे हैं। बस इतना है कि आप जानते हैं कि हम किसी भी दुर्भावनापूर्ण गतिविधि पर सहायता नहीं कर सकते हैं यदि वह आपका तनाव है
तीमुथियुस

जवाबों:


14

आप क्रॉन सत्र के भीतर ssh कनेक्शन कर सकते हैं। पासवर्डलेस एक्सेस करने के लिए आपको एक सार्वजनिक कुंजी प्रमाणीकरण सेटअप करने की आवश्यकता है। यह काम करने के लिए, आपको PubkeyAuthentication yesप्रत्येक दूरस्थ सर्वर में होना चाहिए sshd_config

आप पासफ़्रेज़ के साथ या उसके बिना एक निजी / सार्वजनिक कुंजी जोड़ी बना सकते हैं। यदि आप एक पासफ़्रेज़ (पुनःप्राप्त) का उपयोग करते हैं तो आपको ssh-Agent भी शुरू करना होगा। पासफ़्रेज़ के बिना, आप केवल पैरामीटर जोड़ना -i your_identity_fileकरने के लिए sshकमांड लाइन। डिफ़ॉल्ट के रूप में sshउपयोग करेगा $HOME/.ssh/id_rsa

मैंने पासफ़्रेज़ के साथ एक प्रमुख जोड़ी का उपयोग करके आपके उदाहरण को दोहराया। यहाँ है कि मैं यह कैसे किया।

1) पासफ़्रेज़ के साथ प्रमुख जोड़ी बनाई गई। के रूप में निजी कुंजी को सहेजा ~/.ssh/id_rsa_test, जिसमें डिफ़ॉल्ट रूप से सही अनुमतियाँ होनी चाहिए। हम एक का उपयोग नहीं करने के लिए एक खाली पासफ़्रेज़ दर्ज कर सकते हैं।

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) सर्वर के लिए सार्वजनिक कुंजी भेजा, उन सभी के लिए भी यही किया। याद रखें कि उन्हें PubkeyAuthenticationसक्षम होना चाहिए।

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

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

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) हमारे वर्तमान परिवेश में ऊपर लोड किया गया ताकि हम ssh-addअपनी निजी कुंजी को जोड़ने के लिए उपयोग कर सकें ssh-agent। ऊपर से पासफ़्रेज़।

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) सत्यापित यह जोड़ा गया है।

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

6) जो स्क्रिप्ट मैंने इस्तेमाल की, वह आपकी तुलना में थोड़ी संशोधित थी। ध्यान दें कि मैंने कोष्ठक में ssh कमांड को संलग्न नहीं किया था और बैकटिक्स का उपयोग नहीं कर रहा था $(), जो कमांड प्रतिस्थापन के लिए एक बेहतर विकल्प है (यह bashसंगत है, आपने उल्लेख नहीं किया है कि आप किस शेल का उपयोग कर रहे हैं)। मैंने आपके समान सटीक ssh कमांड का उपयोग किया।

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) मेरा कोंट्राब (ध्यान दें कि मेरा shवास्तव में है bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) आउटपुट

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

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


अद्भुत - धन्यवाद। मैं अब के लिए रिबूट के बाद कोई स्वचालित पुनरारंभ के साथ नहीं रह सकता, कम से कम।
पीटर मॉस

अपने SSH कुंजी को उजागर किए बिना सर्वर को सुरक्षित करने के लिए अनुसूचित SSH कनेक्शन सेट करने के लिए ssh-cron का उपयोग करें, लेकिन SSH एजेंट का उपयोग करके। unix.stackexchange.com/questions/8903/…
लुकास्टीन

4

पासवर्ड किसे कहते हैं? क्रॉन जॉब आपके ssh- एजेंट को नहीं मिल सकता है, इसलिए सार्वजनिक कुंजी काम नहीं करेगी।

आपको sshएक कुंजी फ़ाइल के साथ स्पष्ट रूप से आपूर्ति करने की आवश्यकता है ( -iविकल्प देखें ), क्योंकि यह एक एजेंट को क्वेरी नहीं कर सकता है; और उस कुंजी के पास एक खाली पासफ़्रेज़ होना चाहिए


उपयोगकर्ता नाम और पासवर्ड भी पास करने की कोशिश की - ssh -t -t -o ConnectTimeout = 60 उपयोगकर्ता @ मशीन $ 1 उंगली | पूंछ -1 | awk '{प्रिंट $ 1}' </ होम / यूजर / पासवार्ड ---- मेरा मतलब है कि होम डायरेक्टरी एनएफएस पर है, इसलिए यह एवरीमैचिन को मापता है

यदि ssh का कोई अर्थ है, तो यह /dev/ttyपासवर्ड को पढ़ने के बजाय उपयोग करने के लिए है stdin; यह क्रोन से काम नहीं करेगा।
जाइकोसर

देने की कोशिश की -i विकल्प लेकिन भाग्य नहीं! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/ogn_hosts मशीन $ 1 उंगली | पूंछ -1 | awk '{print $ 1}' ------ चेतावनी: UNIVTECTED PRIVATE KEY FILE! 0640 '/home/user/.ssh/ogn_hosts' के लिए अनुमतियाँ बहुत खुली हैं। यह अनुशंसा की जाती है कि आपकी निजी कुंजी फाइलें दूसरों द्वारा सुलभ न हों। इस निजी कुंजी को अनदेखा किया जाएगा। खराब अनुमतियाँ: कुंजी को अनदेखा करें:

इसकी शिकायत क्यों है known_hosts? लेकिन हां, आपको अनुमतियों के लिए देखना होगा - निजी कुंजी फ़ाइल आपके द्वारा स्वामित्व में 0600 या 0400 होनी चाहिए। यदि आपको कुछ अन्य उपयोगकर्ता की आवश्यकता है, तो इसे भी उपयोग करने में सक्षम होने के लिए, आपको POSIX ACL या इसी तरह की चीज़ों को देखना होगा।
गीकॉउसर्स

यह सोचने के लिए आइए, मैंने देखा कि जीएसएसएपीआई को वहां पेश किया जा रहा है, इसलिए एक और संभावना है कि एक केटैब प्राप्त किया जाए और इसे kinitक्रॉन जॉब के अंदर इस्तेमाल किया जाए । यह कहा गया है, कीटैब को भी अनुमतियों में समान देखभाल की आवश्यकता होती है; लेकिन sshकम से कम उनके बारे में शिकायत नहीं करेंगे।
गीकॉउसर्स

1

बजाय एक अस्थायी फाइल को स्टोर करने के बजाय जैसे कि फोर्सफेक ने findसक्रिय एजेंट को खोजने के लिए उपयोग करना पसंद किया ।

एक स्क्रिप्ट के विषय पर ssh-agent, जिसकी मुझे आवश्यकता है :

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

यह ssh-agentसॉकेट को खोजता है और पहले वाला रिटर्न देता है। यह केवल वर्तमान उपयोगकर्ता तक ही सीमित है, इसलिए आप गलती से किसी अन्य उपयोगकर्ता का उपयोग करने की अनुमति नहीं देंगे और अनुमति अस्वीकृत त्रुटि प्राप्त कर सकते हैं। आपको पहले से ही एक सक्रिय के साथ लॉग इन करना होगा ssh-agent। (जीयूआई शुरू होने पर उबंटू एक एजेंट शुरू करता है)।

यदि आप इसे किसी अन्य स्क्रिप्ट में रखते हैं, तो आपको इसे कॉल करना होगा sourceया .क्योंकि इसे SSH_AUTH_SOCKचर सेट करने की आवश्यकता है ।


0

उपयोग ssh-क्रॉन आपकी SSH कुंजियां उजागर, लेकिन SSH एजेंट का उपयोग किए बिना सुरक्षित सर्वर के लिए निर्धारित SSH कनेक्शन स्थापित करने के लिए।


0

आप अपनी स्क्रिप्ट या कमांड को crontab में चला सकते हैं जैसे:

0 * * * * bash -c -l "/home/user/sshscript.sh"

या

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.