bash-скрипт openvpn, ожидание вывода, ssh-сервер, завершение openvpn

bash-скрипт openvpn, ожидание вывода, ssh-сервер, завершение openvpn

Я хочу использовать скрипт 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 уже существовал.

  1. Как избежать синтаксической ошибки в скрипте?

  2. Как расширить скрипт так, чтобы он автоматически закрывал соединение OpenVPN после этого?

  3. Как обеспечить закрытие файлового дескриптора в конце скрипта?

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

решение1

Проблема в том, что код написан для bashоболочки, но вы явно используете shдля ее запуска. На все большем числе платформ это не одно и то же.

Вместо этого sh ssh-vpn.shу вас есть два лучших варианта

  1. Сделайте скрипт исполняемым и позвольте #!строке определить оболочку, которая будет использоваться.

    # just once
    chmod a+rx ssh-vpn.sh
    
    # thereafter
    ./ssh-vpn.sh
    
  2. Запустите скрипт с правильной оболочкой

    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 

Итак, в общем

  1. сгенерировать скрипт 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
    
  2. в ракушке

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. выполнить команду в оболочке

    # thereafter
    ./ssh-vpn.sh
    

Связанный контент