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




служба,которая работает в фоновом режиме и отвечает за выполнение запланированных задач. (8)

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

ssh [email protected] "cd /some/directory; program-to-execute &"

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


Перенаправление 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 непосредственно для запуска оболочки:

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

Хороший запуск

Другим трюком является использование nice для запуска команды / оболочки:

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

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

[email protected] $ screen -t remote-command
[email protected] $ ssh [email protected] # now inside of a screen session
[email protected] $ cd /some/directory; program-to-execute &

Отключение сеанса экрана: ctrl-a d

Чтобы просмотреть сеансы экрана:

screen -ls

Повторное подключение сеанса:

screen -d -r remote-command

Обратите внимание, что экран может также создавать несколько оболочек в каждом сеансе. Аналогичный эффект может быть достигнут при tmux .

[email protected] $ tmux
[email protected] $ ssh [email protected] # now inside of a tmux session
[email protected] $ cd /some/directory; program-to-execute &

Чтобы отсоединить сеанс tmux: ctrl-b d

Чтобы просмотреть сеансы экрана:

tmux list-sessions

Повторное подключение сеанса:

tmux attach <session number>

Управляющий ключ tmux по умолчанию, ' ctrl-b ', несколько сложно использовать, но есть несколько примеров конфигураций tmux, которые поставляются с tmux, который вы можете попробовать.


Сначала выполните следующие действия:

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

[email protected]:~> 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 [email protected]

Теперь используйте ssh для создания каталога ~ / .ssh как пользователя b на B. (Возможно, каталог уже существует, и это нормально):

[email protected]:~> ssh [email protected] mkdir -p .ssh
[email protected]'s password: 

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

[email protected]:~> cat .ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
[email protected]'s password: 

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

[email protected]:~> ssh [email protected]

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

ssh b @ B "cd / some / directory; program-to-execute &"


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

Например, если вы зашли в систему через SSH, полезно использовать nohuping backgrounded jobs, поскольку фоновые задания могут привести к зависанию оболочки при выходе из системы из-за состояния гонки [2]. Эта проблема также может быть преодолена путем перенаправления всех трех потоков ввода-вывода:

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

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

ssh -n -f [email protected] "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

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


Это помогало мне временами:

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

Я думаю, что это то, что вам нужно: сначала вам нужно установить sshpass на свой компьютер. то вы можете написать свой собственный скрипт:

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

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

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




csh