Автоматизировать создание сертификата OpenVPN - PullRequest
0 голосов
/ 18 июня 2020

Я не знаю, почему я получаю сообщение об ошибке при запуске сценария с S SH, но когда я запускаю bash с моего сервера CA, все работает нормально.

Я установил свой VPN сервер на основе этой статьи https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04

Я написал bash для создания VPN, но когда я пытаюсь запустить его, мне нужно S SH на другой сервер в какой-то точка. Если я запускаю скрипт с S SH, я получаю сообщение об ошибке:

>./easyrsa: 341: set: Illegal option -o echo

Мой bash содержит это и запускается с моего VPN-сервера:

sshpass -p $PASSWORD ssh username@"CA server IP" "/home/username/makevpn.sh $NAME $PASSWORD"

И makevpn. sh содержит следующее:

>./easyrsa sign-req client $NAME

После этого прогона все в порядке, но укажите эту ошибку выше.

Я попытался прочитать после этой ошибки и ничего не нашел. :( Надеюсь, кто-то может помочь, потому что после 4 дней устранения неполадок я безнадежен.

Код сценария VPN

#!/bin/sh
clear
read -p "Please enter the name of the new certificate : "  NAME
read -p "Please enter the Password : "  PASSWORD

cd /home/username/EasyRSA-3.0.7/
./easyrsa gen-req $NAME nopass
echo "gen-req done"
cp /home/username/EasyRSA-3.0.7/pki/private/$NAME.key /home/username/client-configs/keys/
echo "cp done"
sshpass -p $PASSWORD scp /home/username/EasyRSA-3.0.7/pki/reqs/$NAME.req username@192.168.1.105:/tmp
echo "scp done"

sshpass -p $PASSWORD ssh username@192.168.1.105 "/home/username/makevpn.sh $NAME $PASSWORD"
echo "ssh done"

cp /tmp/$NAME.crt /home/username/client-configs/keys/
echo "last CP done"
sudo /home/username/client-configs/make_config.sh $NAME
echo "All Done"

Код на сервере CA

#!/bin/sh

NAME=$1
PASSWORD=$2

cd /home/username/EasyRSA-3.0.7/
echo "CD Done"
./easyrsa import-req /tmp/$NAME.req $NAME
echo "Import-req done"
./easyrsa sign-req client $NAME 
echo "Sign-req done"
sshpass -p $PASSWORD scp /home/username/EasyRSA-3.0.7/pki/issued/$NAME.crt username@192.168.1.103:/tmp
echo "Scp done"

1 Ответ

4 голосов
/ 18 июня 2020

Я просто просматривал код этого сценария easyrsa здесь . Этот, вероятно, отличается от вашего, учитывая, что строка для ошибки - 341. На странице Github это строка 352, и она является частью функции с именем cleanup. Похоже, что эта функция прикреплена только как trap (строка 2744). Ловушки используются для перехвата таких сигналов, как sigint (прерывание), которые обычно отправляются на терминал с помощью ctrl+c (и могут отображать такие символы, как ^ C). Причина, по которой ошибка отображается только в вашем скрипте, заключается в том, что она, вероятно, вызывает испускание сигнала, который вы обычно не получали бы, если бы вы запускали его вручную через s sh.

Ошибка сама по себе не проблема.

Код из Github:

Строка 352:

(stty echo 2>/dev/null) || { (set -o echo 2>/dev/null) && set -o echo; }

Строка 2744:

trap "cleanup" EXIT

Похоже, эта строка просто пытается снова включить терминальный вывод ваших набранных символов (через stty echo). Иногда программы где-то отключают вывод терминала, а затем снова включают его, когда программа завершает работу. Однако, если вы завершите программу на полпути (например, с помощью ctrl+c), ваша программа завершится с отключенным выводом терминала. Это приведет к зависанию терминала. Он по-прежнему будет работать, но не будет отображать символы, которые вы вводите с клавиатуры. Смысл ловушки состоит в том, чтобы гарантировать, что вывод терминала будет повторно включен независимо от того, как программа завершается.

Подробнее ...

В строке 567 есть функция, отключающая эхо. Похоже, дело в том, чтобы не показывать пароль на экран. Если вы завершите программу во время чтения пароля, эхо останется отключенным на терминале. Вероятно, причина ошибки больше связана с тем, как вы запускаете скрипт. По какой-то причине это вызывает сбой stty echo. Строка 352 предполагает, что сбой вызван тем, что stty echo не является допустимой командой. Поэтому в случае неудачи (||) он пробует другой метод (set -o echo) включения эха. Если я попытаюсь запустить это на своем терминале, я также получу сообщение об ошибке (bash 4.2):

- bash: set: echo: invalid option name

...