Я хочу использовать скрипт bash для запуска соединения OpenVPN, и как только туннель будет установлен, запустить терминальное соединение SSH с сервером, а как только я закрою соединение SSH, также закрою соединение OpenVPN.
Для начала я попробовал реализовать решение, предложенное наhttps://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-programкак скрипт оболочки
#!/bin/bash
exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
Я запускаю этот скрипт как sh ssh-vpn.sh в оболочке fish.
В качестве скрипта это приводит к синтаксической ошибке line 2: syntax error near unexpected token '<'
. За пределами скрипта эта ошибка не возникает.
Кроме того, не используя эти команды в качестве скрипта, я иногда получал сообщения об ошибках, поскольку файловый дескриптор 3 уже существовал.
Как избежать синтаксической ошибки в скрипте?
Как расширить скрипт так, чтобы он автоматически закрывал соединение OpenVPN после этого?
Как обеспечить закрытие файлового дескриптора в конце скрипта?
Прошу прощения, если для одного вопроса это слишком много — полагаю, это один из моих первых вопросов по написанию сценариев за долгое время, и мне еще многому предстоит научиться.
решение1
Проблема в том, что код написан для bash
оболочки, но вы явно используете sh
для ее запуска. На все большем числе платформ это не одно и то же.
Вместо этого sh ssh-vpn.sh
у вас есть два лучших варианта
Сделайте скрипт исполняемым и позвольте
#!
строке определить оболочку, которая будет использоваться.# just once chmod a+rx ssh-vpn.sh # thereafter ./ssh-vpn.sh
Запустите скрипт с правильной оболочкой
bash ssh-vpn.sh
решение2
Реализацияhttps://unix.stackexchange.com/users/100397/roaimaОтвет и знание того, что у меня открыто только одно соединение OpenVPN, позволяет мне повторно использовать pkill -9 -x $process_name
команду изЛучший способ завершить процессы, созданные скриптом bash?- и это приводит меня к этому коду
#!/bin/bash
exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
sudo pkill -9 -x openvpn
Итак, в общем
сгенерировать скрипт ssh-vpn.sh с кодом выше (добавлена некоторая
printf
информация о том, что происходит)#!/bin/bash printf "Script to initialise openvpn connection to XYZ and open ssh channel into XYZ Server.\n" printf "Starting openvpn to YXZ...\n\n" exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn) sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 & printf "VPN now initialised.\nstarting ssh connection to XYZ...\n" ssh server printf "\nKilling openvpn connection...\n" sudo pkill -9 -x openvpn # end of script
в ракушке
# just once chmod a+rx ssh-vpn.sh
выполнить команду в оболочке
# thereafter ./ssh-vpn.sh