ssh परमिशन क्रोन जॉब में ही मना कर दिया


13

बहुत अजीब समस्या है। मैंने एक छोटी सी bash स्क्रिप्ट बनाई है जो ssh (पब्लिक की ऑथेंटिकेशन का उपयोग करके) के माध्यम से एक रिमोट होस्ट पर कमांड चलाता है।

जब मैं इस स्क्रिप्ट को कमांड लाइन से मैन्युअल रूप से चलाता हूं तो यह ठीक काम करता है, लेकिन जब /etc/cron.hourly में रखा जाता है तो यह Permission denied, please try again.त्रुटि के साथ विफल हो जाता है।

  • मैं स्पष्ट रूप से स्क्रिप्ट का उपयोग करके कुंजी सेट करता हूं ssh -i /root/.ssh/id_rsa user@remote "command";
  • स्क्रिप्ट रूट के रूप में चल रही है (मैंने echo `id` > /tmp/whoami.logडबल-चेक में एक जोड़ा ); तथा
  • ssh कुंजी पासवर्ड संरक्षित नहीं है ...

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

किसी भी विचार यह क्यों हो रहा है या इसे कैसे ठीक किया जाए ??

अपडेट करें

बाहर मैं बदल जाता है गलत था, और ssh कुंजी था पासवर्ड से सुरक्षित (कीचेन लोडिंग के साथ ssh-एजेंट), इसलिए कारण है कि यह एक स्क्रिप्ट से विफल रही है लेकिन नहीं जब बैश सत्र से चल रहा है। . ~/.keychain/$HOSTNAME-shमेरी स्क्रिप्ट में जोड़ने से समस्या हल हो गई (@grawity का धन्यवाद जिन्होंने मुझे सही दिशा में बताया और एक व्यापक उत्तर प्रदान किया)।


क्या आप सुनिश्चित हैं कि इसे मैन्युअल रूप से चलाने से उस विशेष कुंजी का उपयोग होता है? परेशान SSH_AUTH_SOCKऔर KRB5CCNAMEपर्यावरण चर के बाद फिर से परीक्षण करें ।
14:16 पर user1686

सलाह के लिये धन्यवाद। यकीन नहीं है कि मैं आपको पूरी तरह से समझता हूं। मुझे पूरा यकीन है कि यह उस विशेष कुंजी का उपयोग कर रहा है, क्योंकि मैं रिमोट होस्ट पर मैन्युअल रूप से चलने पर एक कमांड कनेक्ट / चलाने में सक्षम हूं। उन चरों को परेशान करने के बाद मुझे फिर से क्या परीक्षण करना चाहिए?
योव एनर

इसके अलावा - मैं ssh- एजेंट का उपयोग नहीं कर रहा हूं, इसलिए यह सुनिश्चित नहीं है कि SSH_AUTH_SOCKसंबंधित कैसे है (हालांकि मैं कुछ भी करने की कोशिश करके खुश हूं)। मैं सीधे कुंजी फ़ाइल तक पहुँच रहा हूँ, और कुंजी फ़ाइल पासवर्ड से सुरक्षित नहीं है। के रूप में KRB5CCNAMEएक त्वरित खोज के लिए यह Kerberos के साथ कुछ करने के लिए दिखाया गया है। फिर से - इस समस्या का कनेक्शन नहीं देखें, लेकिन शायद मैं यहाँ कुछ याद कर रहा हूँ ...
योअव अनर

अपनी स्क्रिप्ट का परीक्षण करें, अवश्य। जब तक आप ऐसा नहीं करते हैं, तब तक आप "यह सुनिश्चित नहीं कर सकते हैं कि यह उस विशेष कुंजी का उपयोग कर रहा है", क्योंकि क्रोन जॉब्स इंटरैक्टिव कमांड की तुलना में एक अलग वातावरण में चलते हैं। यह बेहतर होगा यदि आप -vउस sshकमांड में एक विकल्प
जोड़ते हैं

लेकिन मैं ऐसा करता हूं। मैं स्पष्ट रूप ssh -iसे दोनों मामलों में कमांड का उपयोग करके कुंजी का उपयोग करता हूं ... मैं स्क्रिप्ट में उन चर को परेशान करने की कोशिश करता हूं और देखता हूं। जोड़ने के लिए अच्छा सुझाव -v- मैं इसे भी जोड़ दूंगा।
योव एनर

जवाबों:


11

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

  • यदि कोई SSH एजेंट चल रहा है, तो sshक्लाइंट हमेशा किसी भी स्पष्ट रूप से निर्दिष्ट कुंजी का उपयोग करने से पहले एजेंट कुंजियों की कोशिश करता है ।

  • यदि नेटवर्क Kerberos का उपयोग करता है और एक Kerberos TGT मौजूद है, तो OpenSSH सार्वजनिक-कुंजी प्रमाणीकरण की कोशिश करने से पहले इसका उपयोग करेगा ।

मैं आपके पर्यावरण के बारे में कुछ नहीं जानता, लेकिन इन दोनों संभावनाओं को जांचना आसान है:

  1. कमांड से पहले जोड़ें unset SSH_AUTH_SOCKऔर फिर मैन्युअल रूप से संशोधित स्क्रिप्ट चलाएँ।unset KRB5CCNAMEssh

    यह स्क्रिप्ट को एजेंट या करबरोस टिकट देखने से रोकेगा, और केवल स्पष्ट रूप से निर्दिष्ट कुंजी का उपयोग करेगा।

  2. का -vविकल्प जोड़ें ssh। यह प्रमाणीकरण कैसे होता है, इस पर अधिक विवरण प्रदर्शित करेगा।

आप यह भी जोड़ सकते हैं -oIdentitiesOnly=yesकरने के लिए sshआदेश; यह इसे निर्दिष्ट कुंजी का उपयोग करने के लिए मजबूर करेगा ।


और अगर आप एजेंट को क्रोन से एक्सेस करने की युक्तियां जोड़ते हैं - और भी बेहतर

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

आपने "किचेन" का उल्लेख किया है - क्या यह ओएस एक्स प्रोग्राम है, या लिनक्स स्क्रिप्ट है? (मैं मैक ओएस एक्स की वास्तुकला के बारे में ज्यादा नहीं जानता, लेकिन एएफएआईके ने इसे क्रोनजोब से उपयोगकर्ता के एसश-एजेंट तक पहुंचने के लिए बहुत कठिन बना दिया है ...)


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

5

इस समस्या का एक और समाधान स्थानीय बॉक्स में ssh पर सेट किया गया है, बदले में ssh कमांड को चलाने के बजाय फ़ाइल या कमांड को उसके स्थानीय, निरपेक्ष पथ से चलाने के लिए। यह KRB5CCNAME को कैश करता है और जहां / पाथ / कमांड काम नहीं करता है।

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

1

आप अपने SSH कुंजियों को उजागर किए बिना सर्वरों को सुरक्षित करने के लिए अनुसूचित SSH कनेक्शन सेट करने के लिए ssh-cron का उपयोग कर सकते हैं , लेकिन SSH एजेंट का उपयोग करके।


होमब्रे पर निर्भरताएं उपलब्ध नहीं हैं, इसलिए इंस्टॉल करना जटिल लगता है। पासवर्ड रहित कुंजी मुझे लगता है ...: - /
चार्ली गोरीचनज

-1

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

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

या

0 * * * * bash -c -l "ssh root @ yourhost 'गूंज $ HOSTNAME'"


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