ssh-under-cron OS X 10.7 लायन में काम करना बंद कर देता है


12

बस स्नो लेपर्ड से शेर में अपग्रेड किया गया, और मेरे क्रॉन जॉब्स जो ssh का उपयोग करते हैं, ने काम करना बंद कर दिया है। ऐसा प्रतीत होता है कि ssh-agent अब अपेक्षित रूप से कार्य नहीं कर रहा है।

यहाँ मेरे तथाकथित-से-क्रोन लिपि का एक झुका हुआ संस्करण है जो स्नो लेपर्ड के तहत बहुत अच्छा काम करता है:

#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs    
eval `ssh-agent`
ssh -vvv REMOTESERVER ls

जब कमांड प्रॉम्प्ट से चलाया जाता है, तो यह स्क्रिप्ट अपेक्षित रूप से काम करती है।

क्रोन से चलाने पर, यह काम नहीं करता है। Ssh- एजेंट आउटपुट सामान्य दिखता है:

SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150

लेकिन ssh -vvvआउटपुट से पता चलता है कि निजी कुंजी को पढ़ने पर यह सही विफल हो जाती है:

debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key

दूसरे शब्दों में, यह मुझे उम्मीद कर रहा है कि मैं पासफ़्रेज़ में टाइप करूं ~/.ssh/id_dsa, जो निश्चित रूप से क्रॉन नौकरियों में काम नहीं करता है।

यह सब स्नो लेपर्ड में काम करता था।

ध्यान दें कि मैं कीचेन पहुंच सेटअप मिल गया है ताकि ssh, ssh-agentहै, और ssh-addमेरी के लिए मेरे पदबंध को पढ़ने के लिए अनुमति दी जाती है .ssh/id_dsaफ़ाइल - एक परिणाम मैंने कभी अपने पदबंध दर्ज किए बिना एक टर्मिनल शीघ्र से SSH कर सकते हैं।

क्या यह समस्या है कि मुझे ssh-addअपनी लॉगिन प्रक्रिया में कुछ बिंदु पर चलने की आवश्यकता है ? मानक बैश प्रॉम्प्ट से इसे चलाने से क्रोन जॉब करने में मदद नहीं मिलती है (हालांकि, अजीब तरह से, यह मुझे मेरे पासफ़्रेज़ के लिए संकेत देता है ... जो मुझे लगता है कि किचेन एक्सेस कॉन्फ़िगरेशन का आवश्यक बी / सी नहीं है)।

नोट 1 - मुझे पुनर्निर्देशित करने से पहले - मुझे पता है कि यहाँ एक समान प्रश्न है ( Mac OS X Lion और sshpass ) लेकिन यह विशेष रूप से एक ऐसे कार्यक्रम के बारे में है sshpassजिसका मैं उपयोग नहीं करता (हालाँकि मेरा मानना ​​है कि प्रश्न का उत्तर इस एक के रूप में दिया जाएगा) )।

नोट 2 - मुझे एहसास है कि पासफ़्रेज़-कम एसएसएच चाबियाँ मेरी समस्या को हल करेंगी; हालाँकि मैं इस मार्ग पर नहीं जाना चाहूँगा।


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

3
शेर में अभी भी क्रोन चलता है ... लेकिन आप सही हैं, मुझे यह कदम उठाना चाहिए। Crontab के एक लाइन के काम करने के लिए एक 10+ लाइन XML फ़ाइल हालांकि, बहुत लंगड़ा है। हो सकता है कि 10 साल में वे प्लॉट की फाइलों को JSON में बदल देंगे, और बहुत आनन्दित होंगे, और 10 साल बाद वे कॉस्टैब पर वापस जाएंगे, और बीएसडी ग्रेबर्ड्स हँसेंगे। मुझे लगता है कि मैं तब तक एक BSD ग्रेबर्ड रहूंगा ...
जॉन हार्ट

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

JSON निश्चित रूप से कई मामलों में XML पर चमकता है, लेकिन संभावना से पहले आने वाले सभी plists ने इस मुद्दे को मजबूर किया। मुझे बस गुदगुदी है कि हमारे पास एकीकृत, कुशल, संरचित डेटा आधारित प्रतिस्थापन है। क्रोन और यकीन है कि हमें उम्र के लिए अच्छी तरह से सेवा की!
bmike

मैं अतिरिक्त वेब संसाधनों के लिए उच्च और निम्न खोज रहा हूं, लेकिन मैं हमेशा इस पद पर वापस रहता हूं। निश्चित रूप से चर्चा में योगदान देने के लिए किसी और के पास है? मैंने अपनी शेल स्क्रिप्ट को चलाने के लिए एक साधारण प्लिस्ट का उपयोग करने की कोशिश की है, लेकिन फिर mailx मेरी सूचनाएँ नहीं भेजता है। मुझे अभी भी क्रोन पसंद है और मैं इसे हर समय उबंटू में इस्तेमाल करता हूं। मैं 10.6 पर वापस नहीं जाना चाहता लेकिन यह मुद्दा मुझे मार रहा है। मुझे लॉन्चर का उपयोग करने के लिए मजबूर किया जाना पसंद नहीं है और यह जानने के लिए कि मूल रूप से शेल स्क्रिप्ट को स्वचालित करने के लिए एक बहुत विस्तृत ढांचे की तरह मुझे क्या महसूस होता है। किसी को कोई नई अंतर्दृष्टि है?

जवाबों:


10

जो कोई भी इस पृष्ठ पर समाप्त होता है, मुझे लगा कि मुझे उत्तर पोस्ट करना चाहिए:

क्रोन के बजाय लॉन्चड का उपयोग वास्तव में प्राधिकरण की समस्या को ठीक करता है। आपके उपयोगकर्ता ने लॉन्च की गई नौकरियां (जो केवल तभी लॉग की जाती हैं जब आप लॉग इन होते हैं) सही ढंग से SSH एजेंट की जानकारी का उपयोग करते हैं जो आपके किचेन के माध्यम से लॉगिन के भाग के रूप में अनलॉक किया गया था (मानक ओएस एक्स कुंजी प्रबंधन के भाग के रूप में, किसी अन्य सॉफ़्टवेयर की आवश्यकता नहीं)।

लॉन्च के साथ अपनी बातचीत को कम करने के लिए, मैंने एक एकल लॉन्च कार्य बनाया जो बैश स्क्रिप्ट कहता है। इस तरह मैं केवल लॉन्च से निपटने के बिना स्क्रिप्ट को संपादित कर सकता हूं।

यहाँ लॉन्च फ़ाइल है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.mycron.hourly</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/john/bin/cron.hourly</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>3600</integer> <!-- start every X seconds -->

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

मैंने फ़ाइल को इसमें सहेजा ~/Library/LaunchAgents/com.mycron.hourly.plist, और फिर इसे इसके साथ लोड किया:

launchctl load ~/Library/LaunchAgents/com.mycron.hourly.plist

एक बार लोड होने के बाद, यह तुरंत चलेगा और फिर हर 60 मिनट में फिर से।

यदि आप उसी प्रक्रिया का पालन करते हैं, तो आप अपनी स्क्रिप्ट के लिए सही प्रोग्राम के साथ `ProgramArguments 'स्ट्रिंग को बदलना चाहेंगे।


2
दरअसल, कम से कम शेर में क्रोन को निकाला जाता है। उत्तर खोजने के लिए कुडोस - लॉन्चक्टल को शुरू में तोड़ना मुश्किल हो सकता है।
जुवेर्डीज

7

निम्नलिखित कोड को अपने बैश शेल स्क्रिप्ट में जोड़ने से समस्या ठीक हो जाएगी:

declare -x SSH_AUTH_SOCK=$( find /tmp/launch-*/Listeners -user your_user -type s | head -1 )

your_userअपने स्वयं के उपयोगकर्ता नाम के साथ बदलें ।

यह कोड उस सूचना के लिए सही मूल्य निर्धारित SSH_AUTH_SOCKकरता है sshया शेल स्क्रिप्ट के शुरू होने के समय के scpसाथ संवाद करने के तरीके के बारे ssh-agentमें cron


इसने इस समस्या को हल कर दिया कि मैं जहां स्कैप एक स्क्रिप्ट में लॉन्च के माध्यम से काम नहीं करूंगा, भले ही वह नियमित कमांड लाइन (iTerm या टर्मिनल) के माध्यम से ठीक काम कर रहा हो। बहुत बढ़िया टिप।
टीजे लुओमा

सिर्फ रिकॉर्ड के लिए, एल कैप्टन 10.11.2 पर:zsh: no matches found: /tmp/launch-*/Listeners
इवान

1

मैं सैंडबॉक्स जैसी बढ़ी हुई सुरक्षा की उम्मीद करूंगा और चीजों को 64 बिट तक ले जाने के लिए परिवर्तन अप्रत्याशित दुःख का कारण बन रहा है।

यह एक जवाब नहीं है, प्रति se, लेकिन लॉन्चड इन दिनों सेब से सभी प्यार मिल रहा है।

यह क्रोन मुद्दे को ठीक नहीं कर रहा है, लेकिन अधिक स्थिर होने के साथ-साथ अधिक लोग इसकी मदद कर सकते हैं।


वहाँ बहुत अच्छा जवाब । इसे पोस्ट करने के लिए धन्यवाद।
bmike

1

अब इसे खोजने वाले किसी के लिए भी एल कैपिटन में इस काम को करने की कोशिश की जा रही है, और अभी भी अपनी एक-लाइन क्रॉन की नौकरी को एक लॉन्च स्क्रिप्ट में बदलने के लिए अनिच्छुक है, वर्नर एंटवाइलर का जवाब अभी भी काम करता है लेकिन रास्ता बदल गया। नीचे मेरे लिए काम किया:

declare -x SSH_AUTH_SOCK=$(find /var/folders/*/*/*/*/agent.* -user your_user -type s | head -1)

नोट : अपने उपयोगकर्ता नाम के साथ अपने_युजर को बदलने के लिए याद रखें!

यह मुझे उसके जवाब पर एक टिप्पणी के रूप में प्रस्तुत नहीं करने देगा क्योंकि मुझे प्रतिष्ठा की कमी है लेकिन मैं इसे अपडेट किए बिना उसे छोड़ना नहीं चाहता था क्योंकि इससे निश्चित रूप से मुझे अंततः इसे स्थापित करने में मदद मिली।

संपादित करें: ३० मार्च २०१६

थोड़ी देर के लिए यह परीक्षण करने के बाद, मुझे यह जोड़ना होगा कि यह केवल उस लॉगिन के दौरान कम से कम एक बार एजेंट का उपयोग करने के बाद काम करता है। एक ssh कनेक्शन शुरू करने या मैन्युअल रूप से ssh-agent चलाने के लिए पर्याप्त है। यदि आप इसे स्वचालित रूप से चलाना चाहते हैं तो एक स्टार्टअप स्क्रिप्ट का भी उपयोग किया जा सकता है। मैंने एक स्टार्टअप बनाया। यह केवल ssh- एजेंट चलाता है और फिर निम्नलिखित के साथ एक .app को बचाने के लिए स्क्रिप्ट एडिटर का उपयोग किया और परिणामी ऐप को मेरे लॉगिन आइटम में जोड़ा:

do shell script "/path/to/startup.sh"

मैं अभी इसे हल कर रहा हूं, और यह सबसे अच्छा तरीका नहीं है। लॉन्चड जाहिरा तौर पर जाने का रास्ता है, लेकिन क्रोन के लिए, आप अपने किचेन में अपनी ssh कुंजी (पासफ़्रेज़ के साथ) सेट करना चाहते हैं। एक बार जब आप ऐसा कर लेते हैं, तो बस मैक में लॉग इन करना सब कुछ सेट कर देता है। आपके द्वारा पोस्ट किया गया सॉकेट पथ वह स्थान है जहां वे रखे जाते हैं यदि आप मैन्युअल रूप से ssh-Agent चलाते हैं (और मैन्युअल रूप से अपना पासफ़्रेज़ टाइप करें)। एल कैप पर, एक बार चाबी का गुच्छा लोड हो जाने पर, सॉकेट को इसके माध्यम से ढूंढें ls /private/tmp/com.apple.launchd.*/Listeners। आपको मैक में लॉगिन को छोड़कर कुछ भी करने की आवश्यकता नहीं है।
जो

लॉन्चड निश्चित रूप से ऐसा करने का "आधिकारिक" तरीका है लेकिन जो लोग क्रोन का उपयोग जारी रखना चाहते हैं, उनके लिए यह व्यवहार्य कार्य है। मेरे परीक्षण में, केवल लॉग इन करना क्रोन के माध्यम से कार्य करने के लिए कीचिन-सेव की गई कुंजी का कारण बनने के लिए पर्याप्त नहीं था। आपके द्वारा सूचीबद्ध पथ हालांकि मौजूद है। यदि आप लॉग इन करते ही उत्पन्न हो जाते हैं और फिर भी क्रोन के लिए काम करते हैं, तो संभव है कि मैं लिस्टेड स्टार्टअप स्क्रिप्ट विधि को छोड़ने में सक्षम होने के लिए पर्याप्त हो। निश्चित रूप से कम से कम परीक्षण के लायक - धन्यवाद!
पेटी

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