Сведения о вопросе

HEIGTH

22:52, 9th August, 2020

Теги

bash   ssh   csh    

Получение ssh для выполнения команды в фоновом режиме на целевой машине

Просмотров: 476   Ответов: 14

Это следующий вопрос к тому, как вы используете ssh в скрипте shell? вопрос. Если я хочу выполнить команду на удаленной машине, которая выполняется в фоновом режиме на этой машине, как я могу получить команду ssh для возврата? Когда я пытаюсь просто включить амперсанд (&) в конце команды, он просто зависает. Точная форма команды выглядит так:

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

Есть какие-нибудь идеи? Одна вещь, чтобы отметить, что логины на целевой машине всегда производят текстовый баннер, и у меня есть SSH ключей, настроенных так, что пароль не требуется.



  Сведения об ответе

ЯЯ__4

17:51, 10th August, 2020

У меня была эта проблема в программе, которую я написал год назад-оказывается, ответ довольно сложный. Вам нужно будет использовать nohup, а также перенаправление вывода, Как описано в Википедии artcle на nohup, скопированном здесь для вашего удобства.

Nohuping справочная рабочих мест для пример полезен при входе в систему через SSH, так как фоновые задания могут вызвать shell зависнуть на выходе из системы из-за гонки условие [2]. Эта проблема также может быть преодолены путем перенаправления всех трех Потоки ввода-вывода:

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


  Сведения об ответе

ASER

18:11, 8th August, 2020

Это был самый чистый способ сделать это для меня:-

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

Единственное, что работает после этого, - это фактическая команда на удаленной машине


  Сведения об ответе

lool

21:57, 18th August, 2020

Перенаправление fd's

Вывод должен быть перенаправлен с помощью &>/dev/null , который перенаправляет как stderr, так и stdout на /dev/null и является синонимом >/dev/null 2>/dev/null или >/dev/null 2>&1 .

Парантезы

Лучше всего использовать sh -c '( ( command ) & )' там, где команда-это что угодно.

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

Nohup и Shell

Вы также можете использовать nohup непосредственно для запуска shell:

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

Хороший Старт

Еще одна хитрость заключается в использовании приятно запустить command/shell:

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

  Сведения об ответе

lesha

10:23, 8th August, 2020

Я просто хотел показать рабочий пример, который можно вырезать и вставить:

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


  Сведения об ответе

SEEYOU

19:51, 1st August, 2020

Если вы don't/can't держите соединение открытым, вы можете использовать экран, если у вас есть права на его установку.

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, которые вы можете попробовать.


  Сведения об ответе

dump

21:24, 22nd August, 2020

Самый быстрый и простой способ-это использовать команду 'at':

ssh user@target " в настоящее время-f /home/foo.sh"


  Сведения об ответе

ITSME

20:28, 5th August, 2020

Я думаю, что вам придется объединить несколько этих ответов, чтобы получить то, что вы хотите. Если вы используете nohup в сочетании с точкой с запятой и заключаете все это в кавычки, то вы получаете:

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.


  Сведения об ответе

lats

17:43, 10th August, 2020

Это сработало для меня в мае Таймс:

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


  Сведения об ответе

crush

21:57, 2nd August, 2020

На самом деле, когда мне нужно выполнить сложную команду на удаленной машине, я предпочитаю поместить ее в сценарий на целевой машине и просто запустить этот сценарий, используя 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"


  Сведения об ответе

lool

11:59, 6th August, 2020

Я пытался сделать то же самое, но с добавленной сложностью, что я пытался сделать это с Java. Итак, на одной машине под управлением java я пытался запустить скрипт на другой машине, в фоновом режиме (с nohup).

Из командной строки, Вот что сработало: (вам может не понадобиться "-i keyFile", если вам не нужно это ssh для хоста)

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

Обратите внимание, что в моей командной строке есть один аргумент после "-c", который все заключен в кавычки. Но для того, чтобы он работал на другом конце, ему все еще нужны кавычки, поэтому мне пришлось поместить в него экранированные кавычки.

Из java, вот что сработало:

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.

Потребовалось немного пробных ошибок &, чтобы заставить это работать, но теперь это, кажется, работает хорошо.


  Сведения об ответе

прога

18:52, 2nd August, 2020

Вы можете сделать это вот так...

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


  Сведения об ответе

FAriza

16:53, 4th August, 2020

Мне показалось довольно удобным иметь удаленный сеанс tmux, используя синтаксис tmux new -d <shell cmd> , как это:

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

Это приведет к запуску новой сессии на узле elsewhere , а команда ssh на локальном компьютере почти мгновенно вернется к shell. Затем вы можете ssh к удаленному хосту и tmux attach к этому сеансу. Обратите внимание, что нет ничего о локальном запуске tmux, только удаленный!

Кроме того, если вы хотите, чтобы ваш сеанс сохранялся после выполнения задания, просто добавьте shell launcher после вашей команды, но не забудьте заключить его в кавычки:

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


  Сведения об ответе

repe

17:19, 18th August, 2020

Я думаю это то что тебе нужно: Сначала вам нужно установить 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


  Сведения об ответе

P_S_S

21:06, 1st October, 2020

Сначала выполните эту процедуру:

Войти на как пользователь и генерировать пары ключей аутентификации. Не вводите парольную фразу:

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: 

Наконец, добавьте новый открытый ключ a к b@B:.ssh/authorized_keys и введите пароль b в последний раз:

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

С этого момента вы можете войти в B как b из A как a без пароля:

a@A:~> ssh b@B

тогда это будет работать без ввода пароля

ssh b@B "компакт-диск /some/directory; program-to-execute &"


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться