Выполните удаленные команды, полностью отсоединяющиеся от соединения SSH

На пути должен использовать equery depends функция для получения списка вещей, которые зависят от пакета.

# equery depends perl

Если Вы хотите восстановить всех их, попробуйте что-то как:

# emerge -a --oneshot `equery depends perl|awk '{print " ="$1}'`

У Вас будут проблемы со что, если Вам установят пакеты, которые были удалены из дерева перевозки, таким образом, синхронизирующее и мировое обновление заранее является хорошей идеей.

Для этого конкретного случая Вы могли бы также хотеть посмотреть на app-admin/perl-cleaner - это имеет определенные функции для восстановления модулей жемчуга.

49
01.02.2012, 12:52
7 ответов

Необходимо, вероятно, использовать screen на удаленном хосте, чтобы иметь реальную отдельную команду:

ssh root@remoteserver screen -d -m ./script
48
27.01.2020, 19:33
  • 1
    мне нравится эта идея. Когда сценарий закончится, экран будет все еще пробегать..., и я должен был бы так или иначе снова соединиться с ним в следующий раз, когда я хотел выполнить его, правильно? –  LVLAaron 01.02.2012, 12:06
  • 2
    @AaronJAnderson: нет, учитывая, что команда не является оболочкой, когда она завершается также, что экранная сессия завершается. –  enzotib 01.02.2012, 12:12

Близко, но не точно.

Независимо от любого терминала

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

Необходимо закрыть все дескрипторы файлов, которые подключены к сокету ssh, потому что ssh сессия не закроется, пока некоторый удаленный процесс имеет открытый сокет. Если Вы не интересуетесь выводом сценария (по-видимому, потому что сам сценарий заботится о записи в файл журнала), перенаправьте его к /dev/null (но обратите внимание, что это скроет ошибки, такие как неспособность запустить сценарий).

Используя nohup не имеет никакого полезного действия здесь. nohup устраивает программу, которую это запускает для не получения Сигнала HUP, если терминал управления программы исчезает, но здесь во-первых нет никакого терминала, таким образом, ничто не собирается отправить SIGHUP в процесс внезапно. Кроме того, nohup стандартный вывод перенаправлений и стандартная погрешность (но не стандартный вход) в файл, но только если они подключены к терминалу, который, снова, они не.

Отсоединение от терминала

 aaron@localpc$ ssh root@remoteserver
 root@remoteserver# nohup /root/backup.sh </dev/null &
 nohup: appending output to `nohup.out'
 [1] 12345
 root@remoteserver# exit
 aaron@localpc$ 

Использовать nohup отсоединять сценарий от его терминала управления так, чтобы это не получало SIGHUP, когда терминал исчезает. nohup также перенаправляет стандартный вывод сценария и стандартную погрешность в названный файл nohup.outесли они подключены к терминалу; необходимо заботиться о стандарте, вводит себя.

Хранение удаленного терминала

Если Вы хотите поддерживать команду в рабочем состоянии в удаленном терминале, но не иметь присоединенный к сессии SSH, выполнить его в оконечном мультиплексоре, таком как Screen или Tmux.

ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'

Можно позже снова соединиться с терминалом, куда сценарий работает путем вызова screen -S backup -rd как базируются на той машине.

Автоматизация одной удаленной команды

Для немного лучшей безопасности не открывайте прямые удаленные корневые логины слишком широко. Создайте пару ключей специального назначения и дайте ей принудительную команду в /root/.ssh/authorized_keys. Содержание файла с открытым ключом AAAA…== wibble@example.com; добавьте разделенный запятыми список опций включая command="…" который указывает, что ключ может только использоваться для выполнения этой определенной команды. Обязательно сохраните опции и ключ всеми на одной строке.

command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com
53
27.01.2020, 19:33
  • 1
    я попробовал первую команду, которую Вы перечислили. Это не делает фона на поле, которое выполнило команду. Курсор просто находится там и ожидает завершения..., возможно, это - ошибка? –  LVLAaron 31.01.2012, 15:21
  • 2
    Вы, возможно, должны были бы перенаправить stdin к/dev/null в удаленной системе. Это может быть то, почему ssh не выходит. –  KeithB 31.01.2012, 22:20
  • 3
    я добавил бы -f опция получить ssh к 'фону' (т.е. оконечные, близкие соединения) на локальной стороне. Это будет работать в сочетании с &. nohup является дополнительным в этом случае, но Вы могли бы рассмотреть использование setsid вместо этого. –  Alexios 01.02.2012, 11:36
  • 4
    @KeithB, Перенаправляющий stdin, является частью его, но я также должен перенаправить stdout и stderr: nohup не сделает этого здесь, потому что они не терминалы, и на самом деле nohup не полезен здесь. –  Gilles 'SO- stop being evil' 01.02.2012, 12:57
  • 5
    @erikbwork Обратите внимание на то, что у меня нет абсолютно никакой подсказки о тех вещах, но после обсуждения и комментариев: Gilles не использует-t опцию в своих командах, таким образом, никакой псевдотерминал не будет установлен, ни в клиенте, ни в стороне сервера. Поэтому не ПОНУКНИТЕ, будет отправлен. –  Binarus 15.05.2017, 21:30

Вы должны фон удаленная команда на remoteserver. Путем Вы делаете это будет фон ssh-команда на localpc.

Кроме этого это - плохая идея позволить корень-ssh.

Так устанавливают на remoteserver: sudoers строка, которая будет работать /root/backup.sh как базируются пользователем backup.

Вы могли создать того пользователя без "хорошего" пароля.

Поместите команду sudo /root/backup.sh & как управляют в ~backup/.ssh/authorized_keys — вместе с открытым ключом от localpc (кто бы ни инициировал тот сценарий).

0
27.01.2020, 19:33

Стандартный рецепт для выполнения удаленной команды от удаленного входа в систему как SSH следующий:

nohup command </dev/null >command.log 2>&1 &

Если command сценарий оболочки, который заботится о входе в сам файл, затем Вы могли измениться command.log кому: /dev/null. После того как Вы запускаете это, выходите из системы сразу же.

Вам нужно все на той строке.

nohup говорит оболочке не нарушать процесс, если сессия входа в систему разъединяется.

</dev/null говорит этому никогда не ожидать входа

>command.log говорит этому отправлять любые сообщения в этот именованный файл журнала

2>&1 говорит этому отправлять любые сообщения stderr в тот же файл журнала. В некоторых случаях лучше иметь два файла, второй для сбора сообщений об ошибках и первого для сбора нормальных сообщений действия. Это может помочь проверить, что все работало правильно.

& говорит этому отсоединять этот процесс и выполнять его в фоновом режиме как процесс демона.

12
27.01.2020, 19:33
#screen -d -m -S BACKUP ssh root@remoteserver /root/backup.sh
-1
27.01.2020, 19:33
  • 1
    Это не очень полезно: если соединение SSH умрет, то stdout и stderr сценария будут закрыты, который может доставить неприятности. Экран должен работать на удаленной машине (как в ответе enzotib). –  Gilles 'SO- stop being evil' 01.02.2012, 12:54

Этот поток был очень полезен, но мое решение должно было несколько отличаться.

Мне не нравится экранное решение, потому что оно оставляет экранное выполнение процесса, в котором я не нуждаюсь. Перенаправления и nohups используются как это:

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

НЕ работали на меня при использовании с командой ssh.

Я создал сценарий обертки на удаленной машине, которая запускает фактический скрипт. Сценарий обертки устанавливает перенаправление и nohup. Что-то вроде этого:

backupwrapper.sh:
nohup backup.sh > /dev/null 2>&1 &

Затем на моей клиентской машине я работаю (не заметьте перенаправление):

# ssh remotemachine "backupwrapper.sh"
#

Команда ssh сразу возвращается, соединение завершается, и сценарий оставляют, работая.

11
27.01.2020, 19:33

Как Nils говорит, это - угроза безопасности, чтобы позволить корню регистрироваться на пути ssh. И я отговариваю от выполнения любого существенного задания на машине без журнала. Если что-нибудь пойдет не так, как надо, то Вам жаль, что у Вас не было некоторых сообщений поиска и устранения неисправностей. Существуют другие ответы, показывающие Вам, как сделать это. Но вот то, как я рекомендую выполнить, что Вы попросили. Это все встроено в sh (1). Никакая потребность в экране GNU (хотя я думаю, что это - умное решение). Добавьте эту строку к своей команде: >&- 2>&- <&- &. >&- средства близко stdout. 2>&- средства близко stderr. <&- средства близко stdin. & средства, выполненные в фоновом режиме, например.

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$
6
27.01.2020, 19:33

Теги

Похожие вопросы