ssh और ssh के माध्यम से खोल: कैसे बाहर निकलें?


22

मैं SSH के माध्यम से इस तरह एक दूर की स्क्रिप्ट लॉन्च कर रहा हूं:

ssh user@ipaddress '~/my_script.sh'

सब कुछ ठीक चल रहा है लेकिन एक बार स्क्रिप्ट खत्म हो जाने के बाद, कनेक्शन बंद नहीं हुआ है। मुझे वर्तमान कनेक्शन को तोड़ने के लिए CTRL-C दबाना होगा।

मैंने '~ / my_script.sh' में "बाहर निकलने" की कोशिश की है और यह बेकार है। मैंने '~ / my_script.sh' में "लॉगआउट" कमांड की कोशिश की है और मुझे एक संदेश मिला है:

logout: not login shell: use exit

...

किसी भी विचार है कि कैसे स्क्रिप्ट के पूरा होने पर मैं स्वतः और SSH को ठीक से बंद कर सकता हूं?

(स्पष्टीकरण के लिए संशोधन :) यहाँ मेरी स्क्रिप्ट के अंदर क्या है:

#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas

umount_disque_qas()
{
  # Umount du disque 'qas' s'il n'avait pas été 'umount' :
  nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
  if [ "$nom_disque_monte" != "" ]
  then
    echo "For safety, umount : $nom_disque_monte"
    umount $nom_disque_monte
  fi

}

# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas

echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."

# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...

echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."

# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."


echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."

echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."

echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3

echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."

echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."

echo "All done"
echo "Click 'Ctrl-C' to quit."

exit

जब मैं इसे एसएसएच के माध्यम से लॉन्च करता हूं, तो यह चलता है और अंत में, मैंने "ऑल किया हुआ" पढ़ा तो इसका मतलब यह अंतिम 2 लाइनों तक पहुँचता है

किसी भी विचार मैं कैसे स्वचालित रूप से और जनसंपर्क बंद कर सकता है


1
स्क्रिप्ट में क्या है?
इग्नासियो वाज़केज़-अब्राम्स

@ ऑलिवर: क्या आप किसी पोर्ट (एजेंट और एक्स सहित) को फॉरवर्ड करते हैं? Ssh कनेक्शन बंद हो जाता है जब कमांड समाप्त हो जाता है और सभी TCP कनेक्शन बंद हो गए हैं।
गिल्स एसओ-

@ गिल्स: नहीं मैं सिर्फ एक स्क्रिप्ट चलाने के लिए एक शेल कॉन्सेप्ट बनाता हूं, आगे कुछ भी नहीं।
ओलिवियर पोंस

1
@Olivier: यदि आपके पास कोई है ~/.ssh/config, तो इसके बिना प्रयास करें, और यह सुनिश्चित करने के लिए विकल्प -a -x(और नहीं -o) पास sshकरें कि कोई आगे चल रहा है। यदि यह अभी भी काम नहीं करता है, तो स्क्रिप्ट की सामग्री दिखाएं।
गाइल्स का SO- बुराई पर रोक '

@ ऑलिवर: क्या स्क्रिप्ट किसी भी पृष्ठभूमि की नौकरी शुरू करती है, जिस पर वह इंतजार कर सकता है? दुर्भाग्य से नौकरियों के लिए कुछ भी नहीं लगता है जब एक ssh स्क्रिप्ट में। उदाहरण: ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'फ़ाइलों को सूचीबद्ध करेगा, किया जाएगा और लौटने से पहले 10 सेकंड प्रतीक्षा करें।
asoundmove

जवाबों:


19

शेल स्क्रिप्ट में निकास काम नहीं करता है क्योंकि यह स्क्रिप्ट से बाहर निकल रहा है, शेल से नहीं। स्क्रिप्ट पूरी होने के बाद शेल से बाहर निकलने के लिए

ssh user@ipaddress '~/my_script.sh && exit'

यह स्क्रिप्ट चलाएगा फिर शेल से बाहर निकलेगा।


3
यह बाहर होना चाहिए। स्क्रिप्ट है खोल।
अगली सूचना तक रोक दिया गया।

@ डेनिस: यह उसके लिए काम नहीं कर रहा है इसलिए यह इसके बजाय काम कर सकता है।
वफ़र्स

2
@श्री। Man: आपका कमांड मूल के बराबर है, सिवाय इसके कि यह एक शेल को sshdचलाने और शेल के बीच मौजूद होने के लिए मजबूर करता है myscript.shexitआप ने लिखा जब स्क्रिप्ट बाहर निकलता है, जो मदद नहीं करता है कार्य करेगा। एक ही तरीका है कि आपका समाधान काम कर सकता है यदि स्क्रिप्ट कुछ विचित्र करती है जब उसके अभिभावक होते हैं sshdऔर उस विचित्र बात को तब नहीं करते हैं जब उसका अभिभावक शेल होता है।
गाइल्स 'एसओ- बुराई को रोकना'

यह कैसे मदद नहीं करता है? बाहर निकलें खोल को बंद कर देंगे और कनेक्शन को समाप्त कर देंगे, सही? और क्या यह पोस्टर नहीं करना चाहता है?
वफ़र्स

3
@ मरमन: ~/my_script.sh && exitबाहर निकलते ही ~/my_script.sh। यदि शेल स्क्रिप्ट बाहर नहीं निकलती है, तो आपकी कमांड कभी exitभी बिट पर नहीं जाएगी । तो यह सिर्फ बेकार है।
गाइल्स का SO- बुराई पर रोक '

12

Ssh कनेक्शन खुला रहता है जब ssh (यहां एक शेल) द्वारा शुरू की गई प्रक्रिया बाहर निकलती है, अगर अन्य प्रक्रियाएं हैं जो अभी भी इसका उपयोग कर रही हैं। मुझे सटीक नियम नहीं पता है कि ssh डेमॉन इस प्रकार है, लेकिन एक कनेक्शन उपयोग में है, कम से कम, अगर किसी भी बच्चे की प्रक्रिया का मानक आउटपुट अभी भी ssh द्वारा प्रदान किए गए मूल पाइप से जुड़ा हुआ है। की तुलना करें:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

जब आप एक डेमॉन शुरू करते हैं, तो आपको इसे पृष्ठभूमि में रखना चाहिए और इसके फ़ाइल डिस्क्रिप्टर को बंद करना चाहिए। कम से कम, इसका उपयोग करें:

./qaswvd </dev/null >/dev/null 2>/dev/null &

आप nohupसामने जोड़ना चाह सकते हैं ; यहां फर्क नहीं पड़ेगा लेकिन स्क्रिप्ट टर्मिनल से चलाए जाने पर उपयोगी होगी। कई प्रोग्राम जो डेमॉन के रूप में कार्य करने के लिए डिज़ाइन किए गए हैं, उन्हें फोर्क, क्लोज़ फाइल डिस्क्रिप्टर, संकेतों और अन्य बारीकियों को अनदेखा करने के लिए एक कमांड-लाइन विकल्प हैं। qaswvdयदि यह एक है तो दस्तावेज में जाँच करें । आप "डेमनाइज़र" उपयोगिताओं की भी जाँच कर सकते हैं।


एक ही समस्या थी, और यह काम करता है। स्वीकृत उत्तर काम नहीं करता है।
एंडी

5

मैंने इस पोस्ट को देखा जब मैं उसी स्थिति के समाधान के लिए गया। हालाँकि, यह @ ओलिवर की समस्या को हल करने के लिए देर से है, क्योंकि स्वीकृत उत्तर स्पष्ट रूप से या तो ओपी या मेरे लिए काम नहीं कर रहा था (मुझे नहीं पता कि यह क्यों स्वीकार किया गया है), मैं अभी भी भविष्य के गोगलर के लिए अपना समाधान पोस्ट करना चाहूंगा। यह सरल है: कमांड -fमें एक विकल्प जोड़ें ssh:

ssh -f user@ipaddress '~/my_script.sh'

संपादित करें

-fविकल्प का प्रभाव sshपृष्ठभूमि में रखना है, इसलिए बिना किसी और विकल्प के जोड़ा जाना संभव है कि कनेक्शन अभी भी जीवित है यहां तक ​​कि ऐसा लगता है कि यह टूट गया है। यदि कोई दिलचस्पी है तो इस साइट पर किसी अन्य पोस्ट में दिए गए उत्तर का उल्लेख कर सकता है ।


सावधानी: यदि मूल स्क्रिप्ट में उपयोगकर्ता इनपुट के लिए प्रॉम्प्ट है तो यह (-f) काम नहीं करेगा।
MadD7

3

इग्नासियो की तरह, मैं यह जानने के लिए उत्सुक हूं कि आपकी स्क्रिप्ट में क्या है।

शायद आप अपनी स्क्रिप्ट को त्रुटि स्थिति पैदा करने वाले सबसे छोटे संभव उदाहरण के लिए प्रयास कर सकते हैं और कम कर सकते हैं।

या एक खाली स्क्रिप्ट से शुरू करें और एक समय पर एक कमांड जोड़ें जब तक आप समस्या नहीं देखते हैं, तब आपको पता चल जाएगा कि किस कमांड के कारण आपकी स्क्रिप्ट लॉक हो जाती है।

यदि खाली स्क्रिप्ट आपके लिए समस्या का कारण बनती है, तो आप अपने ssh कॉन्फ़िगरेशन की जांच करना चाह सकते हैं, उदाहरण के लिए, .bash_logout या बाहर निकलने के लिए कुछ ऐसा कहा जाता है जो समस्या का कारण हो सकता है?


आपके सुझाव के लिए धन्यवाद, मैंने अब अपने प्रश्न में अपनी स्क्रिप्ट का नमूना जोड़ दिया है।
ओलिवियर पोंस

@ ऑलिवर: आपने अपनी स्क्रिप्ट के केवल अप्रासंगिक भागों को जोड़ा है। एक स्क्रिप्ट पोस्ट करें (और यदि आवश्यक हो तो निर्देशों का उपयोग करें) जो पाठकों को आपकी समस्या को पुन: पेश करने की अनुमति देगा । जितना संभव हो उतना स्क्रिप्ट को सरल बनाएं, लेकिन आगे नहीं।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स धन्यवाद। मैंने अपना प्रश्न संशोधित किया है और पूरी स्क्रिप्ट जोड़ी है। उम्मीद है की यह मदद करेगा। ऐसा लगता है कि समस्या इस तथ्य की हो सकती है कि मैं एक पृष्ठभूमि प्रक्रिया ( लाइन "./qaswvd और" ) लॉन्च कर रहा हूं । क्या यह समस्या का मूल हो सकता है?
ओलिवियर पोंस

1
@ ऑलिवर: हां, आपकी मुख्य प्रक्रिया बाहर निकलने से पहले पृष्ठभूमि की प्रक्रिया के रुकने का इंतजार करेगी। यदि आप बाहर निकलने के बाद भी कुछ चालू रखना चाहते हैं, तो हो सकता है कि आप नोहप को आज़माना चाहें। सुनिश्चित नहीं है कि यह ssh के साथ काम करता है, लेकिन इसे आजमाएँ इससे कोई नुकसान नहीं होगा।
asoundmove

2

आप शायद अपनी स्क्रिप्ट में नौकरियों का उपयोग कर सकते हैं। अगर ऐसा है तो शेल केवल आपकी नौकरियों के समाप्त होने का इंतजार करता है और खुद को अलग नहीं करना चाहता है।

मैं रिपॉस्ट नहीं कर रहा हूँ, बस आपको फॉरवर्ड करेंगे http://en.wikipedia.org/wiki/Nohup#Existing_jobs


मैंने अपना प्रश्न संशोधित किया है और पूरी स्क्रिप्ट जोड़ी है। उम्मीद है की यह मदद करेगा। ऐसा लगता है कि समस्या इस तथ्य की हो सकती है कि मैं एक पृष्ठभूमि प्रक्रिया (लाइन "./qaswvd और") लॉन्च कर रहा हूं। यदि आप सही हैं, तो यह समस्या का मूल हो सकता है?
ओलिवियर पोंस

पृष्ठभूमि की प्रक्रिया समस्या है, लेकिन nohupसीधे यहाँ समस्या नहीं है क्योंकि सर्वर की तरफ कोई टर्मिनल नहीं है: मुझे लगता है कि अपराधी विशेष रूप से खुली फ़ाइल विवरणक है।
गिल्स एसओ- बुराई को रोकना '

हां, मुझे लगता है कि यह समस्या है, आप टिप्पणी करने की कोशिश कर सकते हैं या ऊपर दिए गए लिंक से हैक को लागू कर सकते हैं
ओलेक्सी खिलकेविच

1

आपको अपनी स्क्रिप्ट के भीतर से अपनी मूल प्रक्रिया को मारने की आवश्यकता है।

kill -SIGHUP $PPID


0

समस्या निम्नलिखित लाइन की संभावना है।

./qaswvd &

यह कमांड शायद अभी भी चल रहा है और ssh पाइप को तब तक खुला रखेगा जब तक कि स्टड और stdout और stderr बंद नहीं हो जाते।

इसके बजाय इसका उपयोग करें:

./qaswvd </dev/null >/dev/null 2>&1 &
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.