如何在脚本中以 root 身份在后台运行 OpenVPN?

如何在脚本中以 root 身份在后台运行 OpenVPN?

我想编写一个脚本,openvpn首先调用,然后调用ssh。输入命令时

sudo openvpn ~/my_connection.ovpn

在命令提示符中我得到以下输出:

...
Wed Jan  4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan  4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan  4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan  4 21:04:35 2017 Initialization Sequence Completed

此命令处于阻塞状态,并且未释放 shell。为了随后启动 ssh 连接,我需要通过键入Ctrl+Z后跟 来将 openvpn 进程推送到后台bg

但是,我想通过调用我的 bash 文件来自动调用 openvpn 连接步骤和 ssh。我如何设法模拟此文件中的Ctrl+Zbg步骤?

我尝试在命令&后附加一个openvpn,并将nohup其放在命令前面。但都不起作用。

答案1

总结:使用sudo -b,或者更好。openvpn [...] --daemon

由于您正在运行openvpn(更具体地说,由于您希望运行一个程序以 root 身份在后台运行命令),最常见的关于如何在后台运行命令的信息并不能解决您的情况。您说:

我尝试在 cpenvpn 命令后附加一个 &,并在其前面放置 nohop。两者都不起作用。

你的命令是:

sudo openvpn ~/my_connection.ovpn

sudo的默认配置下,如果您最近没有sudo在同一终端中输入密码(或已在该终端上注销并重新登录),则它会要求您输入密码。但如果您通过附加在后台运行该命令,则&不会显示该行或给您机会输入它。[sudo] password for user:

因此在这种情况下,运行命令,输入密码,然后将其发送到后台是一种合理的方法,供互动使用

但这不是唯一的方法,正如你所说,你不会想这么做在脚本中

方法一:确保sudo具有最新的时间戳。

您可以通过首先运行以下命令来确保sudo在运行命令时具有当前时间戳:

sudo -v

然后,您可以运行:

sudo openvpn ~/my_connection.ovpn &

但是,当你想用 在后台运行命令时,最好完全避免使用&和。编写脚本时尤其如此。nohupsudo

方法二:使用sudo -b一般来说,这通常就是您想要的。

相反,您可以sudo在前台运行它自己,但传递标志-b,这样sudo就会导致命令在后台运行。

sudo -b openvpn ~/my_connection.ovpn

这通常是更好的方法,特别是如果你把命令放在脚本中。如果sudo -b你没有得到作业控制, 但在 shell 脚本中,作业控制默认是禁用的,通常不应该使用它

作为man sudo解释:

     -b, --background
                 Run the given command in the background.  Note that it is not
                 possible to use shell job control to manipulate background
                 processes started by sudo.  Most interactive commands will
                 fail to work properly in background mode.

这是有效的,因为在sudo 已收到您的密码(如有必要)并确定您被允许运行该命令。

方法三:但对于openvpn,您可能应该只用 来运行它--daemon

openvpn如果使用以下选项运行它,它将自动在后台运行--daemon

sudo openvpn ~/my_connection.ovpn --daemon

--daemon在文件名之后传递,而不是在文件名之前传递.opvn;后面的参数--daemon(如果有)将被解释为守护进程应使用的名称openvpn。(请勿不是另附&。)

这是否合适取决于在openvpn运行之后但在守护进程之前是否必须发生任何交互。并且部分取决于 中的设置~/my_connection.ovpn。但是如果openvpn不能立即将其守护进程化,那么其他所有立即在后台运行的方法也将失效

因此,在任何情况下,只要你知道你openvpn想要开始在后台运行,并且您知道您不想将其带回前台,则应该认真考虑使用该--daemon选项调用它的方法。这特定于openvpn--大多数程序都不支持--daemon选项,尽管许多服务器程序确实有一些这样的选项。(但是名称和语法有所不同。)

要决定是否使用此选项(以及如何使用它),我建议您阅读手册openvpn,尤其是关于的部分--daemon。它有很多有用的信息,我在这里只引用第一段:

       --daemon [progname]
              Become  a  daemon  after  all   initialization   functions   are
              completed.   This option will cause all message and error output
              to be sent to  the  syslog  file  (such  as  /var/log/messages),
              except  for  the  output of scripts and ifconfig commands, which
              will go to /dev/null unless otherwise  redirected.   The  syslog
              redirection  occurs  immediately  at  the point that --daemon is
              parsed on the command line even though the  daemonization  point
              occurs  later.   If one of the --log options is present, it will
              supercede syslog redirection.

              The optional progname parameter [...]

方法 4:有时以 root 身份运行整个脚本是合理的。

如果你有一个以 root 身份执行多个操作的脚本,那么它没有任何可以合理运行的重要活动不是以 root 身份运行该脚本,并且以非 root 用户身份运行该脚本不会产生任何有用的效果,那么该脚本的用户可能应该以 root 身份运行它。

如果是这种情况,那么您应该sudo从脚本中的命令中删除。当脚本以 root 身份运行时,不需要sudo。(尽管 root 用户可以默认以任何用户的身份(包括其自身)运行任何命令,sudo并且不需要密码。因此,如果您sudo在脚本中保留实例那么它可能仍然有效。)

如果脚本中有任何实例sudo,实际上用于以 root 以外的其他用户身份运行命令(使用),那么您仍应保留-u user那些實例。

如果整个脚本以 root 身份运行,那么大部分使命令在后台运行的典型方法应用,包括附加&和在需要时使用nohup(您已经了解)。但是,为此,您仍然应该强烈考虑使用openvpn选项--daemon

答案2

总结以守护进程模式运行它:openvpn --config Windscribe-Japan.ovpn --daemon

openvpn仅当未指定其他选项时,将配置 (.ovpn) 文件名传递给命令才有效。如果我指定--daemon选项,则 openvpn 会尝试将文件名解析为选项参数并抛出选项错误:我尝试将“Windscribe.ovpn”解析为 --option 参数,但我没有看到前导“--”

回答:

为了避免这种情况,必须使用--config选项指定文件名。例如,openvpn --config Windscribe.ovpn --daemon。然后使用 跟踪 syslog tail -f /var/log/syslog,以便进一步检查。

您还可以检查此 curl 命令的前后输出,curl ifconfig.co以确保 VPN 已连接。

注意:即使您从 SSH 会话注销后,守护进程仍会继续运行。

答案3

你可以复制你的

.conf 文件放入 /etc/openvpn/

然后要求“service openvpn@confName start”为您处理所有守护进程和 sudo。

https://unix.stackexchange.com/a/366680/198666

相关内容