Как начать два процесса, поддерживаемых свиньями? Итак, первый заканчивается, когда второй заканчивается?

Я запускаю скрипт с командами ssh для сервера, стоящего за прыжком-хостом. Каждый раз, когда я хочу запустить команду на своем сервере в защищенной сети, мне нужно ssh перейти на сервер-хост (bastion) и запустить nc а затем ssh in с фактической командой, которую я хочу запустить через канал netcat. Затем мне нужно остановить исходный nc .

Я бы хотел, чтобы «умный амперсанд» позволял мне одновременно запускать оба процесса, а затем завершает процесс nc ssh, когда мой процесс с поддержкой piggie завершен.

Вот что я сейчас делаю.

 ssh -g -L 23:localhost:22 -f -N user@jumphost & ssh user2@localhost -P 23 "ssh user@destination server \"ls -al\"" kill -0 $! 

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

Мой вопрос: как начать два процесса, поддерживаемых свиньями? Итак, первый заканчивается, когда второй заканчивается?

Это не отвечает на ваш вопрос, но этот ответ на SU решает вашу проблему, я думаю:

Использование ProxyCommand в вашем ~/.ssh/config должно сделать все для вас:

 Host server HostName server.tld User {server user} Host proxy ProxyCommand ssh server -W %h:%p User {proxy user} 

Затем вы можете получить доступ к своему серверу, просто используя ssh server

Если я правильно интерпретирую вашу команду, не будет ли она такой же?

 ssh -t user@jumphost ssh user@destination ... 

Кажется, что все ваши -L – это перенос порта на SSH-сервер jumphost, но вы уже подключаетесь к этому, так почему дополнительный туннель?

В этом случае jumphost также будет SSH-клиентом для второго соединения. Если вы не можете доверять хосту перехода как клиенту (т. Е. Если вы хотите, чтобы хост-перехватчик видел только зашифрованные данные), вам нужно было бы -L 23:destination:22 вместо localhost , no?

Обходной путь с использованием wait :

С wait вы можете использовать PID для ожидания: wait $PID , но мы просто будем использовать аргумент для выполнения нашей второй команды. Обратите внимание, что все выходные данные должны игнорироваться, поскольку они не передаются в качестве аргумента команде wait (таким образом, мы оставляем без аргументов использование wait как в command & wait )

 process1 & wait $( process2 &> /dev/null ) 

логически process1 должен будет дождаться завершения process2 поскольку wait завершается process2 чтобы интерпретировать переменную.


EDIT: это также может быть вложенным:

 sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) ) 

будет sleep течение 4 секунд.