如何在脚本中以root用户在后台运行OpenVPN?


22

我想编写一个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

该命令被阻止,并且外壳未释放。为了在以后开始ssh连接,我需要通过键入Ctrl+ Z后面跟一个,将openvpn进程推入后台bg

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

我尝试将a附加&openvpn命令并放在命令的nohup前面。都不行。


这种问题已经被问过多次了。如果需要帮助,您确实需要发布脚本。
Panther

用于sudo -b在后台运行
紧跟其后

1
在我看来,这确实不是该问题的重复,该问题几乎没有涵盖以root身份运行后台程序,也根本没有涵盖如何正确守护OpenVPN。
伊利亚·卡根

然后,我们应该再次更改标题以指出我尝试以root用户身份运行后台程序。
null

@null我已根据要求重新编辑了标题。OpenVPN通常以root用户身份运行,在没有使用的情况下,--daemon仍然可以使用该选项,但是您说对了,以root用户身份运行它该问题的核心,应该在其标题中反映出来。感谢您指出了这一点!
伊利亚·卡根

Answers:


35

TL; DR:使用sudo -b或更好地使用。openvpn [...] --daemon

由于您正在运行openvpn(并且更具体地讲,由于您希望在后台以root身份运行程序),因此有关如何在后台运行命令的最常用信息无法解决您的情况。你说:

我尝试将&附加到cpenvpn命令并将nohop放在它前面。两者都不起作用。

您的命令是:

sudo openvpn ~/my_connection.ovpn

sudo的默认配置下,如果您最近没有sudo在相同的上下文中输入密码(对于交互式使用,通常表示同一终端),那么它将要求您输入密码。但是,如果您通过追加在后台运行命令,&则不会显示该行或没有机会键入该行。[sudo] password for user:

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

但这不是唯一的方法,正如您所说,您将不想在脚本中执行此操作。

方法1:确保sudo有新的时间戳。

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

sudo -v

然后,在那之后,您可以运行:

sudo openvpn ~/my_connection.ovpn &

但是,通常最好避免使用&(和nohup)完全在后台运行命令sudo。对于脚本来说尤其如此。

方式2:使用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收到密码(如果需要)并确定允许您运行该命令之前,后台无任何操作。

方式3:但是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身份(带有)(而不是root )实际用于以其他用户身份运行命令,那么您仍应保留这些实例。-u user

如果整个脚本都以root用户身份运行,那么大多数使命令在后台运行的典型方法都适用,包括附加&(必要时)以及使用nohup(您已经知道)。但是,为此,您仍应强烈考虑openvpn--daemon选项一起使用。


全面而周到的答案。做得好。
gwideman

2

TL; DR在守护程序模式下运行它:openvpn --config Windscribe-Japan.ovpn --daemon

openvpn仅当未指定其他选项时,才将配置(.ovpn)文件名传递给命令。如果我指定--daemonoption,则openvpn尝试将文件名解析为options参数,并引发Options错误:我正在尝试将“ Windscribe.ovpn”解析为--option参数,但看不到前导'-'

回答:

为避免这种情况,必须使用--configoption 指定文件名。例如,openvpn --config Windscribe.ovpn --daemon。然后在syslog后面加上tail -f /var/log/syslog,以进行进一步检查。

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

注意:即使您从SSH会话注销,这也将使守护程序继续运行。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.