টার্গেট মেশিনে ব্যাকগ্রাউন্ডে একটি কমান্ড চালানোর জন্য ssh পাচ্ছেন


304

এটি শেল স্ক্রিপ্টে আপনি কীভাবে এসএসএস ব্যবহার করবেন তা একটি ফলো-অন প্রশ্ন ? প্রশ্ন। যদি আমি সেই মেশিনটির ব্যাকগ্রাউন্ডে চলমান দূরবর্তী মেশিনে একটি আদেশ চালাতে চাই তবে কীভাবে ফিরে আসার জন্য ssh কমান্ড পাব? যখন আমি কমান্ডের শেষে এম্পারস্যান্ড (&) অন্তর্ভুক্ত করার চেষ্টা করি এটি কেবল স্তব্ধ হয়ে যায়। কমান্ডের হুবহু রূপটি এরকম দেখাচ্ছে:

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

কোন ধারনা? একটি বিষয় লক্ষণীয় হ'ল টার্গেট মেশিনে লগইনগুলি সর্বদা একটি পাঠ্য ব্যানার তৈরি করে এবং আমার কাছে এসএসএইচ কীগুলি সেট আপ রয়েছে যাতে কোনও পাসওয়ার্ডের প্রয়োজন হয় না।

উত্তর:


315

আমি একবছর আগে লিখেছি এমন একটি প্রোগ্রামে আমার এই সমস্যা ছিল - উত্তরটি বরং জটিল is আপনার সুবিধার জন্য এখানে অনুলিপি করা নোহাপের উইকিপিডিয়া আর্টলেলে আপনাকে যেমন নোহুপ পাশাপাশি আউটপুট পুনঃনির্দেশ ব্যবহার করতে হবে।

নোহুপিং ব্যাকগ্রাউন্ড জবগুলি উদাহরণস্বরূপ এসএসএইচ-এর মাধ্যমে লগ ইন করার সময় দরকারী, যেহেতু ব্যাকগ্রাউন্ড জবস একটি রেসের শর্তের কারণে শেলটি লগআউটে আটকে রাখতে পারে [২]। এই তিনটি আই / ও স্ট্রিম পুনর্নির্দেশের মাধ্যমেও এই সমস্যাটি কাটিয়ে উঠতে পারে:

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

1
এই ফাইলগুলি বর্তমান ডিরেক্টরিতে তৈরি করা হয়েছে। সুতরাং সীমাটি পার্টিশনের মুক্ত স্থানের পরিমাণ। অবশ্যই আপনি পুনর্নির্দেশ করতে পারেন /dev/null
ফ্র্যাঙ্ক কুষ্টার্স

2
অনুরোধ জিজ্ঞাসা শেষ করার পরে প্রক্রিয়াটির ব্যাকগ্রাউন্ডিং সম্পর্কে কোনও ধারণা? (একটি জিপিজি
ডিক্রিপ্টের

নোহুপ ব্যবহার করে পটভূমিতে একজন রিকুই কর্মী শুরু করার চেষ্টা করা হচ্ছে, কিন্তু এটি কাজ করে না .. :(
শিশু দেব

1
আপনি কি দয়া করে < /dev/nullবোঝাতে পারেন? ধন্যবাদ।
কিয়ান চেন

1
নোহুপ সম্পর্কিত উইকিপিডিয়া নিবন্ধ থেকে: "এছাড়াও নোট করুন যে একটি সমাপ্ত এসএসএইচ অধিবেশন সর্বদা নির্ভরশীল প্রক্রিয়াগুলিতে এইচইউপি সিগন্যাল প্রেরণ করে না others সুতরাং কঠোরভাবে কখনই নোহুপের প্রয়োজন পড়বে না, আপনি এটির চেয়ে ভাল দীর্ঘমেয়াদী।
জ্যাক্স

254

এটি আমার পক্ষে এটি করার সবচেয়ে পরিষ্কার উপায় ছিল: -

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

এর পরে কেবল চলমান জিনিস হ'ল রিমোট মেশিনে আসল কমান্ড


7
-n-fইঙ্গিত হিসাবে প্রয়োজন হয় না-n
blissini

6
ssh -fssh প্রক্রিয়াটি সংযুক্ত করে ফেলেছে, কেবল পটভূমি। / Dev / নাল সমাধানগুলি ssh কে দ্রুত সংযোগ বিচ্ছিন্ন করার অনুমতি দেয় যা সম্ভবত পছন্দনীয়।
বেনি চেরনিয়াভস্কি-পাসকিন

এই সমাধানটি একটি সায়োনোলজি এনএএস
স্টিফান এফ

আমার দূরবর্তীটিতে দেখাতে আমার "ls -l" এর ফলাফলগুলি প্রয়োজন, এই আদেশটি এটি করে না।
সিদ্ধার্থ

@ সিদ্ধার্থ এরপরে / dev / নাল পরিবর্তে কিছু নামকৃত ফাইলে পুনর্নির্দেশ করুন।
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 সহ, আপনাকে চালাতে কমান্ডটিতে & যুক্ত করতে হবে না।
কাদোইজ

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 &

টিএমএক্স সেশনটি আলাদা করতে: ctrl-b d

স্ক্রিন সেশন তালিকা করতে:

tmux list-sessions

একটি অধিবেশন পুনরায় সংযুক্ত করতে:

tmux attach <session number>

ডিফল্ট tmux নিয়ন্ত্রণ কী, ' ctrl-b', ব্যবহার করা কিছুটা কঠিন তবে আপনি চেষ্টা করতে পারেন এমন বেশ কয়েকটি উদাহরণ রয়েছে tmux কনফিগারেশনের সাথে tmux রয়েছে with


3
কেউ এর screenজন্য কীভাবে ব্যবহার করবে ?
কামিস

18

আমি কেবল একটি কাজের উদাহরণ দেখাতে চেয়েছিলাম যা আপনি কেটে পেস্ট করতে পারেন:

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

খুব উপকারী. ধন্যবাদ।
মাইকেল মার্টিনেজ

8

'এট' কমান্ডটি ব্যবহার করা সবচেয়ে দ্রুত এবং সহজতম উপায়:

ssh ব্যবহারকারী @ টার্গেট "এখন -f /home/foo.sh" এ


2
atসময়ের পরে যদি কোনও ফাইল থেকে নয় তবে স্বীকৃত কমান্ড লাইন আর্গুমেন্ট গ্রহণ করা এটি একটি দুর্দান্ত সাধারণ সমাধান হবে।
টাইলার কলিয়ার

3
আপনি <<< এর মতো: ssh ব্যবহারকারীর @ টার্গেট "এখন -f <<< 'আমার_কম্যাডস" "
নিকো

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 &

পারফেক্ট, একটি পিটিএসআই এসএসএইচ সেশন নিয়ে কাজ করে। আমি প্রস্থান করতে পারি এবং স্ক্রিপ্টটি মেশিনে অবিরত থাকে। ধন্যবাদ.
সাতরিয়া

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

আমি একই জিনিসটি করার চেষ্টা করছিলাম, তবে জাভা থেকে এটি করার চেষ্টা করার সাথে যুক্ত হওয়া জটিলতাটি ছিল। জাভা চলমান এক মেশিনে, আমি ব্যাকগ্রাউন্ডে (নোহুপ সহ) অন্য একটি মেশিনে স্ক্রিপ্ট চালানোর চেষ্টা করছিলাম।

কমান্ড লাইন থেকে, এখানে যা কাজ করেছে তা এখানে রয়েছে: (আপনার যদি হোস্টের দিকে ঝাঁকুনির প্রয়োজন না হয় তবে আপনার "-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 new -d <shell cmd>:

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

এটি elsewhereহোস্টে নতুন অধিবেশন আরম্ভ করবে এবং স্থানীয় মেশিনে ssh কমান্ডটি তাত্ক্ষণিকভাবে শেলটিতে ফিরে আসবে। তারপরে আপনি রিমোট হোস্ট এবং tmux attachসেই সেশনে এসএসএস করতে পারেন । মনে রাখবেন যে স্থানীয় টিএমউक्स চলমান সম্পর্কে কিছুই নেই, কেবল দূরবর্তী!

এছাড়াও, আপনি যদি কাজটি শেষ হওয়ার পরে আপনার সেশনটি অবিরত রাখতে চান তবে আপনার কমান্ডের পরে কেবল একটি শেল লঞ্চার যুক্ত করুন, তবে উদ্ধৃতিগুলিতে আবদ্ধ হতে ভুলবেন না:

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

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

এটি কমান্ডটি চালায় এবং একটি প্রক্রিয়া আইডি বরাদ্দ করা উচিত যা আপনি কেবল নিজের-লগ.লগ-এ লেজ করতে পারেন যাতে ফলাফলগুলি ঘটে থাকে সে হিসাবে এটি লিখিত হয় results আপনি যে কোনও সময় লগ আউট করতে পারেন এবং প্রক্রিয়াটি চালিয়ে যাবে


0

আপনি নোহোপ ছাড়াই এটি করতে পারেন:

ssh user@host 'myprogram >out.log 2>err.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 ব্যবহার করুন (ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকতে পারে, যা ভাল):

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

অবশেষে b @ B: .ssh / अधिकृत_keys এ একটি নতুন পাবলিক কী সংযোজন করুন এবং বি এর পাসওয়ার্ডটি শেষ বার প্রবেশ করুন:

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

এখন থেকে আপনি B থেকে B তে পাসওয়ার্ড ছাড়াই লগ ইন করতে পারেন:

a@A:~> ssh b@B

তাহলে এটি কোনও পাসওয়ার্ড প্রবেশ না করেই কাজ করবে

ssh b @ B "সিডি / কিছু / ডিরেক্টরি; প্রোগ্রাম-থেকে-এক্সিকিউটেড &"


1
প্রশ্নটি বলছে যে ডাগরিম ইতিমধ্যে পাসওয়ার্ডের প্রয়োজন না হওয়ার জন্য কীগুলি সেট আপ করেছে তবে এটি এখনও ঝুলছে
ম্যাক্স ন্যান্যাসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.