लक्ष्य मशीन पर पृष्ठभूमि में एक कमांड निष्पादित करने के लिए ssh हो रही है


304

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

ssh user@target "cd /some/directory; program-to-execute &"

कोई विचार? ध्यान देने वाली एक बात यह है कि लक्ष्य मशीन में लॉगइन हमेशा एक पाठ बैनर का निर्माण करते हैं और मेरे पास SSH कुंजी सेट है इसलिए कोई पासवर्ड की आवश्यकता नहीं है।

जवाबों:


315

एक साल पहले मैंने जो कार्यक्रम लिखा था, उसमें मुझे यह समस्या थी - पता चला कि यह उत्तर जटिल है। आप के रूप में पर विकिपीडिया artcle में विस्तार से बताया है, साथ ही nohup उपयोग करने के लिए उत्पादन पुनर्निर्देशन के रूप में की आवश्यकता होगी nohup , यहां आपकी सुविधा के लिए की नकल की।

नोहपिंग बैकग्राउंड जॉब्स उदाहरण के लिए उपयोगी है जब एसएसएच के माध्यम से लॉग इन किया जाता है, क्योंकि बैकग्राउंड जॉब्स रेस की स्थिति [2] के कारण लॉगआउट पर लटका सकते हैं। इस समस्या को तीनों I / O धाराओं पर पुनर्निर्देशित करके भी दूर किया जा सकता है:

nohup myprogram > foo.out 2> foo.err < /dev/null &

1
वे फाइलें वर्तमान निर्देशिका में बनाई गई हैं। तो सीमा विभाजन पर मुक्त स्थान की मात्रा है। बेशक आप भी अनुप्रेषित कर सकते हैं /dev/null
फ्रैंक केस्टर

2
प्रॉम्प्ट के लिए पूछना समाप्त करने के बाद प्रक्रिया की पृष्ठभूमि पर कोई विचार? (एक gpg --decrypt की तरह जो पासवर्ड के लिए पूछ रहा है)
isaaclw

Nohup का उपयोग करके पृष्ठभूमि में एक रेस्क्यू कार्यकर्ता को शुरू करने की कोशिश कर रहा है, लेकिन यह काम नहीं करता है .. :(
शिशु देव

1
क्या आप < /dev/nullइसका मतलब बता सकते हैं ? धन्यवाद।
कियान चेन

1
नूप पर विकिपीडिया लेख से भी: "यह भी ध्यान दें कि एक समापन SSH सत्र हमेशा प्रक्रियाओं के आधार पर एक HUP नहीं भेजता है। दूसरों के बीच, यह इस बात पर निर्भर करता है कि छद्म टर्मिनल आवंटित किया गया था या नहीं।" इसलिए जब सख्ती से हमेशा की जरूरत नहीं हो सकती है, तो आप इसके बिना लंबे समय तक बेहतर हैं।
जाॅब

254

यह मेरे लिए इसे करने का सबसे साफ तरीका है: -

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

इसके बाद चलने वाली एकमात्र चीज रिमोट मशीन पर वास्तविक कमांड है


7
-nइसका -fमतलब यह नहीं है कि इसका मतलब है-n
ब्लिसिनी ६'१६

6
ssh -fजुड़ा ssh प्रक्रिया छोड़ देता है, बस पृष्ठभूमि। / Dev / null समाधान ssh को जल्दी से डिस्कनेक्ट करने की अनुमति देते हैं, जो बेहतर हो सकता है।
बेनी चेर्नियाव्स्की-पास्किन

यह समाधान एक साइकोलॉजी एनएएस के लिए कमांड भेजने के लिए भी काम करता है
स्टीफन एफ

मुझे अपने रिमोट पर दिखाने के लिए "ls -l" के परिणामों की आवश्यकता है, यह कमांड ऐसा नहीं करता है।
सिद्धार्थ

@ सिद्धार्थ तब / dev / null के बजाय कुछ नामित फ़ाइल पर रीडायरेक्ट करता है।
sherrellbc

29

रीडायरेक्ट fd की

आउटपुट जरूरतों के साथ करने के लिए पुनः निर्देशित किया &>/dev/nullजो पुनर्निर्देश दोनों stderr और stdout के लिए / dev / बातिल और का एक पर्याय है >/dev/null 2>/dev/nullया >/dev/null 2>&1

parantheses

सबसे अच्छा तरीका है sh -c '( ( command ) & )'जहां कमांड कुछ भी है का उपयोग करना है।

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

नोहप शैल

आप शेल लॉन्च करने के लिए सीधे नोह का उपयोग भी कर सकते हैं:

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

अच्छा लॉन्च किया

एक और चाल है कमांड / शेल लॉन्च करने के लिए अच्छा उपयोग करना:

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

8
मुझे पता है कि यह आपका बहुत पुराना उत्तर है, लेकिन क्या आप इस बारे में कुछ टिप्पणी जोड़ सकते हैं कि कोष्ठक का तरीका सबसे अच्छा तरीका क्यों है, क्या (यदि कोई है) जोड़ने nohupसे फर्क पड़ता है, और आप क्यों और कब उपयोग करेंगे nice? मुझे लगता है कि इस जवाब से बहुत कुछ जुड़ जाएगा।
डॉ। के।

हो सकता है कि इसका आंशिक रूप से जवाब दें: nohup के साथ, आपको & को चलाने के लिए कमांड को जोड़ने की आवश्यकता नहीं है।
Cadoiz

21

यदि आप कनेक्शन को खुला नहीं रख सकते हैं तो आप स्क्रीन का उपयोग कर सकते हैं , यदि आपके पास इसे स्थापित करने के अधिकार हैं।

user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &

स्क्रीन सत्र को अलग करने के लिए: ctrl-a d

स्क्रीन सत्रों को सूचीबद्ध करने के लिए:

screen -ls

एक सत्र फिर से शुरू करने के लिए:

screen -d -r remote-command

ध्यान दें कि स्क्रीन प्रत्येक सत्र के भीतर कई गोले भी बना सकती है। एक समान प्रभाव tmux के साथ प्राप्त किया जा सकता है ।

user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &

Tmux सत्र को अलग करने के लिए: ctrl-b d

स्क्रीन सत्रों को सूचीबद्ध करने के लिए:

tmux list-sessions

एक सत्र फिर से शुरू करने के लिए:

tmux attach <session number>

डिफ़ॉल्ट tmux नियंत्रण कुंजी, ' ctrl-b', का उपयोग करना कुछ कठिन है, लेकिन कई उदाहरण हैं tmux उस जहाज को tmux से कॉन्फ़िगर करता है जिसे आप आज़मा सकते हैं।


3
इसके लिए कोई कैसे उपयोग करेगा screen?
क्वासिस

18

मैं सिर्फ एक कार्यशील उदाहरण दिखाना चाहता था जिसे आप काट कर चिपका सकते हैं:

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""

बहुत मददगार। धन्यवाद।
माइकल मार्टिनेज

8

सबसे आसान और आसान तरीका है 'at' कमांड का उपयोग करना:

ssh user @ target "पर अब -f /home/foo.sh"


2
यह एक महान सामान्य समाधान होगा यदि atसमय के बाद कमांड लाइन तर्क स्वीकार किए जाते हैं और न केवल एक फ़ाइल से।
टायलर कोलियर

3
आप <<< की तरह एक फ़ाइल का अनुकरण कर सकते हैं जैसे: ssh user @ target "पर अब -f <<< 'my_comnads'"
Nico

6

मुझे लगता है कि आप जो चाहते हैं उसे पाने के लिए आपको इन उत्तरों में से कुछ को संयोजित करना होगा। यदि आप अर्धविराम के साथ संयोजन में नोह का उपयोग करते हैं, और उद्धरण में पूरी बात लपेटते हैं, तो आप प्राप्त करते हैं:

ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"

जो मेरे लिए काम करने लगता है। Nohup के साथ, आपको चलाने के लिए & कमांड को जोड़ने की आवश्यकता नहीं है। इसके अलावा, यदि आपको कमांड के किसी भी आउटपुट को पढ़ने की आवश्यकता नहीं है, तो आप उपयोग कर सकते हैं

ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"

सभी आउटपुट को / dev / null में रीडायरेक्ट करने के लिए।


5

मेरे लिए यह काम कई बार हो सकता है:

ssh -x remoteServer "cd yourRemoteDir; ./yourRemoteScript.sh </dev/null >/dev/null 2>&1 & " 

2

आप इसे इस तरह से कर सकते हैं ...

sudo /home/script.sh -opt1 > /tmp/script.out &

बिल्कुल सही, एक पुष्ट एसएसएच सत्र के साथ काम करता है। मैं बाहर निकल सकता हूं और मशीन पर स्क्रिप्ट जारी है। धन्यवाद।
Satria

1

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

उदाहरण के लिए:

# simple_script.sh (located on remote server)

#!/bin/bash

cat /var/log/messages | grep <some value> | awk -F " " '{print $8}'

और फिर मैं सिर्फ स्रोत मशीन पर इस कमांड को चलाता हूं:

ssh user@ip "/path/to/simple_script.sh"

0

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

कमांड लाइन से, यहां वह काम किया गया है: (यदि आपको मेजबान को ssh करने के लिए इसकी आवश्यकता नहीं है, तो आपको "-i keyFile" की आवश्यकता नहीं हो सकती है)

ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""

ध्यान दें कि मेरी कमांड लाइन में, "-c" के बाद एक तर्क है, जो सभी उद्धरणों में है। लेकिन इसके दूसरे छोर पर काम करने के लिए, इसे अभी भी उद्धरणों की आवश्यकता है, इसलिए मुझे इसके भीतर बच गए उद्धरणों को डालना होगा।

जावा से, यहाँ काम किया है:

ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
 "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.

इस कार्य को करने में थोड़ा परीक्षण और त्रुटि हुई, लेकिन अब यह अच्छी तरह से काम करता है।


0

यह इस तरह से वाक्यविन्यास का उपयोग करके दूरस्थ tmux सत्र के लिए मेरे लिए काफी सुविधाजनक दिखाई दिया tmux new -d <shell cmd>:

ssh someone@elsewhere 'tmux new -d sleep 600'

यह elsewhereमेजबान पर नया सत्र शुरू करेगा और स्थानीय मशीन पर ssh कमांड लगभग तुरंत खोल देगा। आप तब दूरस्थ होस्ट और tmux attachउस सत्र के लिए ssh कर सकते हैं । ध्यान दें कि स्थानीय tmux के बारे में कुछ भी नहीं है, केवल रिमोट!

इसके अलावा, यदि आप चाहते हैं कि आपका सत्र नौकरी समाप्त होने के बाद भी जारी रहे, तो बस अपने कमांड के बाद एक शेल लांचर जोड़ें, लेकिन उद्धरणों में संलग्न करना न भूलें:

ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'

0
YOUR-COMMAND &> YOUR-LOG.log &    

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



-2

मुझे लगता है कि यह वही है जो आपको चाहिए: सबसे पहले आपको sshpassअपनी मशीन पर स्थापित करने की आवश्यकता है । तो आप अपनी स्क्रिप्ट लिख सकते हैं:

while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
    COMMAND 1
    .
    .
    .
    COMMAND n
ENDSSH1
done <<____HERE
    PASS    PORT    USER    IP
      .      .       .       .
      .      .       .       .
      .      .       .       .
    PASS    PORT    USER    IP    
____HERE

-3

पहले इस प्रक्रिया का पालन करें:

उपयोगकर्ता के रूप में ए पर लॉग इन करें और प्रमाणीकरण कुंजियों की एक जोड़ी उत्पन्न करें। पासफ़्रेज़ दर्ज न करें:

a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa): 
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A

अब एक निर्देशिका बनाने के लिए ssh का उपयोग करें ~ / .ssh के रूप में उपयोगकर्ता b पर B. (निर्देशिका पहले से ही मौजूद हो सकती है, जो ठीक है):

a@A:~> ssh b@B mkdir -p .ssh
b@B's password: 

अंत में b @ B: .sh / अधिकृत_की की नई सार्वजनिक कुंजी संलग्न करें और अंतिम बार एक बार b का पासवर्ड दर्ज करें:

a@A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password: 

अब से आप बिना पासवर्ड के A से b के रूप में B में लॉग इन कर सकते हैं:

a@A:~> ssh b@B

तब यह बिना पासवर्ड डाले काम करेगा

ssh b @ B "cd / some / निर्देशिका; कार्यक्रम-से-निष्पादन और"


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