自动化证书创建 OpenVPN

Dav*_*vid 1 bash ubuntu openvpn

我不知道为什么在使用 SSH 运行脚本时会出现错误,但是当我从 CA 服务器运行 bash 时,一切正常。

我根据这篇文章安装了我的 VPN 服务器https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04

我为 VPN 创建编写了一个 bash,但是当我尝试运行它时,我需要在某个时候通过 SSH 连接到另一台服务器。如果我在其中使用 SSH 启动脚本,则会收到一条错误消息:

>./easyrsa: 341: set: Illegal option -o echo
Run Code Online (Sandbox Code Playgroud)

我的 bash 包含这个并从我的 VPN 服务器运行:

sshpass -p $PASSWORD ssh username@"CA server IP" "/home/username/makevpn.sh $NAME $PASSWORD"
Run Code Online (Sandbox Code Playgroud)

而 makevpn.sh 包含这个:

>./easyrsa sign-req client $NAME
Run Code Online (Sandbox Code Playgroud)

这次运行后似乎没问题,但在上面给出错误。

我尝试在此错误后阅读,但一无所获。:( 希望有人能提供帮助,因为经过 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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 5

我只是在这里浏览那个easyrsa 脚本的代码。鉴于错误的行是 341,这个可能与您的不同。在 Github 页面上,它是第 352 行,它是名为cleanup. 看来这个函数只作为一个trap(第 2744 行)附加。陷阱用于捕获像sigint(中断)这样的信号,这些信号通常在终端上发送ctrl+c(并且可能显示像 ^C 这样的字符)。错误仅显示在您的脚本中的原因是它可能会导致发出信号,如果您通过 ssh 手动运行它,您通常不会收到该信号。

错误本身真的不是问题。

来自 Github 的代码:

第 352 行:

(stty echo 2>/dev/null) || { (set -o echo 2>/dev/null) && set -o echo; }
Run Code Online (Sandbox Code Playgroud)

第 2744 行:

trap "cleanup" EXIT
Run Code Online (Sandbox Code Playgroud)

看来该行只是试图将您键入的字符的终端输出重新打开(通过stty echo)。有时程序会在某处禁用终端输出,然后在程序完成后重新启用它。但是,如果您要在中途ctrl+c终止程序(例如使用),您的程序将在终端输出仍然禁用的情况下终止。这将使终端看起来被冻结。它仍然可以工作,但不会显示您用键盘键入的字符。陷阱的重点是确保无论程序如何退出都重新启用终端输出。

更多信息...

在第 567 行有一个禁用回声的函数。看起来重点是不要在屏幕上显示密码。如果您在读取密码期间终止程序,则终端上的 echo 将保持禁用状态。错误的原因可能更多地与您运行脚本的方式有关。无论出于何种原因,它都会导致stty echo失败。第 352 行假设失败是由于stty echo不是有效命令。因此,在失败 ( ||) 时,它会尝试set -o echo启用回声的不同方法 ( )。如果我尝试在我的终端上运行它,我也会收到一个错误(bash 4.2):

-bash: set: echo: 无效的选项名称