bash - 自动创建证书 OpenVPN

标签 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

我的 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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="275254425549464a4267161e150916111f091609161712" rel="noreferrer noopener nofollow">[email protected]</a>:/tmp
echo "scp done"

sshpass -p $PASSWORD ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6b1e180e19050a060e2b5a5259455a5d53455a455a5b5e" rel="noreferrer noopener nofollow">[email protected]</a> "/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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a1d4d2c4d3cfc0ccc4e19098938f9097998f908f909192" rel="noreferrer noopener nofollow">[email protected]</a>:/tmp
echo "Scp done"

最佳答案

我只是浏览了 easyrsa 脚本的代码 here 。这可能与您的不同,因为错误行是 341。在 Github 页面上,它是第 352 行,它是名为 cleanup 的函数的一部分。看来这个函数只是作为一个陷阱附加的(第 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 行有一个禁用 echo 的函数。看起来重点是不要在屏幕上显示密码。如果您在密码读取期间终止该程序,则终端上的回显将保持禁用状态。错误的原因可能更多地与您运行脚本的方式有关。无论出于何种原因,它都会导致 stty echo 失败。第 352 行假设失败是由于 stty echo 不是有效命令所致。因此,在失败时 ( || ),它会尝试使用不同的方法 (set -o echo) 来启用 echo。如果我尝试在终端上运行它,我还会收到错误(bash 4.2):

-bash: set: echo: invalid option name

关于bash - 自动创建证书 OpenVPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62450894/

相关文章:

bash - 在 shell/bash 脚本中的文件之间使用变量

ios - iOS 应用程序中的 VPN 访问客户端实现?

linux - 使用 ssh 和本地脚本执行远程 bash,当结束时,将终止远程执行

linux - bash 中的 Bash 不起作用

mysql - 错误 1728 (HY000) : Cannot load from mysql. 用户。该表可能已损坏

ubuntu - 无法在 Jetbrains GoLand 中打开终端

python - 使用python将数据包发送到tap接口(interface)

macos - 打开VPN : connect error: Missing External PKI alias

regex - 使用 sed 编辑 JSON 文件

java - 如何在 PPA 中安装旧的 java 版本?