2008-12-01 15 views
17

एक बैश स्क्रिप्ट में मैं ssh के माध्यम से रिमोट मशीन पर एक कमांड निष्पादित करता हूं। यदि उपयोगकर्ता Ctrl + C दबाकर स्क्रिप्ट को तोड़ता है तो यह केवल स्क्रिप्ट को रोकता है - यहां तक ​​कि एसएसएच क्लाइंट भी नहीं। इसके अलावा यदि मैं एसएसएच क्लाइंट को मारता हूं तो रिमोट कमांड अभी भी चल रहा है ...जब मैं एसएसएच को बाधित करता हूं तो रिमोट प्रक्रिया को मारने के लिए एसएसएच कैसे बनाया जाए?

स्थानीय एसएसएच क्लाइंट को मारने और क्रेटल + सी पर रिमोट कमान आमंत्रण को कैसे रोक सकता है?

एक साधारण स्क्रिप्ट:

#/bin/bash 
ssh -n -x [email protected] 'mysqldump db' -r file.sql 

उत्तर

17

अंततः मुझे लगता है कि जैसे एक समाधान पाया:

#/bin/bash 
ssh -t -x [email protected] 'mysqldump db' -r file.sql 

तो - मैं का उपयोग करने के बजाय '-n' के 'आयकर'। '-n' को हटाने, या रूट से अलग उपयोगकर्ता का उपयोग करने से मदद नहीं मिलती है।

+5

मुझे इसे काम करने के लिए -t -t (दो बार) की आवश्यकता थी। – gravitation

1
trap "some_command" SIGINT 

स्थानीय स्तर पर some_command निष्पादित करेंगे जब आप Ctrl + C दबाएं। help trap आपको इसके अन्य विकल्पों के बारे में बताएगा।

ssh समस्या के बारे में, मुझे एसएसएच के बारे में बहुत कुछ पता नहीं है। शायद आप दूरस्थ आदेश को मारने के लिए some_command के बजाय ssh -n -x [email protected] 'killall mysqldump' पर कॉल कर सकते हैं?

2

क्या आप जानते हैं कि आप एसएसएच के पास क्या विकल्प पारित कर रहे हैं? मैं अनुमान लगा रहा हूँ। -n विकल्प/dev/null से इनपुट को रीडायरेक्ट करता है, इसलिए आप दूरस्थ होस्ट पर चल रहे प्रक्रिया को शायद Ctrl-C से SIGINT नहीं देख रहे हैं।

अब, चलो कितना बुरा एक विचार यह दूरदराज के रूट लॉगिन अनुमति देने के लिए है के बारे में बात करते हैं:

यह एक सच में, सच बुरा विचार है। एसएसएच पर दूरस्थ प्रक्रिया निष्पादन को सुरक्षित रूप से प्रबंधित करने के तरीके के बारे में कुछ सुझावों के लिए HOWTO: set up ssh keys पर एक नज़र डालें। यदि आपको दूरस्थ रूप से विशेषाधिकारों के साथ कुछ चलाने की ज़रूरत है तो आप शायद एक समाधान चाहते हैं जिसमें एम्बेडेड कमांड और एक स्क्रिप्ट के साथ एक एसएसएच सार्वजनिक कुंजी शामिल है जो सूडो की रूट सौजन्य के रूप में चलती है।

2

जब आपका एसएसएच सत्र समाप्त होता है, तो आपका खोल एक SIGHUP प्राप्त करेगा। (हैंग-अप सिग्नल)। आपको यह सुनिश्चित करने की ज़रूरत है कि यह उस से शुरू की गई सभी प्रक्रियाओं पर भेजता है। बैश के लिए, shopt -s huponexit; your_command आज़माएं। यह काम नहीं कर सकता है, क्योंकि मैन पेज का कहना है कि ह्यूपोनिक्सिट केवल इंटरैक्टिव शैल के लिए काम करता है।

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

आपका ssh -t काम करना चाहिए, हालांकि, जब कनेक्शन बंद हो जाता है, टर्मिनल से पढ़ता है तो ईओएफ या त्रुटि प्राप्त होगी, और इससे अधिकांश कार्यक्रम निकलते हैं।