आपका यह तर्क कि यह sshस्वयं है कि 255 निकास स्थिति लौटाता है, सही है। sshआदमी पेज कि राज्यों:
ssh दूरस्थ कमांड के बाहर निकलने की स्थिति के साथ या 255 के साथ बाहर निकलता है यदि कोई त्रुटि हुई।
यदि आप केवल चलाने के लिए थे ssh pi@10.20.0.10 "pkill -f asdf", तो आपको " कोई प्रक्रिया नहीं मिली " 1की pkillस्थिति के अनुसार , आपको सबसे अधिक बाहर निकलने की स्थिति मिलेगी ।
चुनौतीपूर्ण भाग यह समझना है कि जब आप चलाते हैं तो SSH के साथ कोई त्रुटि क्यों होती है
ssh pi@10.20.0.10 "pkill -f asdf || true"
SSH रिमोट कमांड
SSH सर्वर रिमोट कमांड चलाने के लिए एक शेल लॉन्च करता है। यहाँ इस कार्रवाई में एक उदाहरण है:
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
ध्यान दें कि डिफ़ॉल्ट शेल है bashऔर यह कि रिमोट कमांड एक साधारण कमांड नहीं है , लेकिन एक पाइपलाइन है , "कंट्रोल ऑपरेटर द्वारा अलग किए गए एक या अधिक कमांड का एक क्रम |"।
बैश शेल यह महसूस करने के लिए पर्याप्त चतुर है कि यदि -cविकल्प द्वारा इसे पारित किया जा रहा है , तो यह एक साधारण कमांड है , यह वास्तव में नई प्रक्रिया के लिए मजबूर न करके अनुकूलन कर सकता है, अर्थात, यह सीधे execअतिरिक्त चरण के माध्यम से जाने के बजाय सरल कमांड का उपयोग करता है। की forking इससे पहले कि यह execहै। जब आप दूरस्थ सरल कमांड चलाते हैं ( ps -elfइस मामले में) क्या होता है, इसका एक उदाहरण यहां दिया गया है :
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
मैं इस व्यवहार से पहले आया था, लेकिन मुझे इस AskUbuntu उत्तर के अलावा एक बेहतर संदर्भ नहीं मिला ।
pkill व्यवहार
चूंकि pkill -f asdf || trueएक साधारण कमांड नहीं है (यह एक कमांड लिस्ट है ), उपरोक्त अनुकूलन तब नहीं हो सकता है जब आप चलाते हैं ssh pi@10.20.0.10 "pkill -f asdf || true", sshdप्रक्रिया कांटे और निष्पादित होती है bash -c "pkill -f asdf || true"।
जैसा कि ctx का उत्तर बताता है, pkillअपनी प्रक्रिया को नहीं मारेगा। हालांकि, यह किसी भी अन्य प्रक्रिया को मार देगा जिसकी कमांड लाइन -fपैटर्न से मेल खाती है । bash -cअपने स्वयं के माता पिता (के रूप में यह होता है) - तो यह इस प्रक्रिया को मारता आदेश इस पैटर्न से मेल खाता है।
SSH सर्वर तब देखता है कि दूरस्थ कमांड को चलाने के लिए शुरू की गई शेल प्रक्रिया अप्रत्याशित रूप से मार दी गई थी, इसलिए यह SSH क्लाइंट को एक त्रुटि की सूचना देता है।
pkillक्योंकि इसके आर्ग सूची regexp से मेल खाता अपनी मूल खोल प्रक्रिया को मारता है, मैं एक शब्दावली आपत्ति बढ़ा देंगे:x || yहै नहीं एक यौगिक आदेश है, यह एक है आदेश सूची ।