【问题标题】:Automatize the cert creation OpenVPN自动创建证书 OpenVPN
【发布时间】:2020-06-18 13:18:45
【问题描述】:

我不知道为什么我在使用 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=$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"

【问题讨论】:

  • 能贴出代码吗?
  • 当然。往上看。编辑了我的问题
  • 请注意……您几乎总是想引用您的变量。如果您的密码包含空格或任何特殊字符,如!*,您将遇到各种麻烦。应该是sshpass -p "$PASSWORD" ...

标签: bash ubuntu openvpn


【解决方案1】:

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

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

【讨论】:

  • 天啊,你很好。谢谢您的帮助。所以基本上,如果我的证书不起作用,那不是因为这个错误。
  • @David 唯一会导致错误的是您无法在终端退出时输入。
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2012-10-14
  • 2019-11-07
相关资源
最近更新 更多