自动化证书创建 OpenVPN

Automatize the cert creation 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

我的 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=
PASSWORD=

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"

我刚刚浏览了那个 easyrsa 脚本的代码 here。这一个可能与您的不同,因为错误行是 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; }

第 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