我想编写一个脚本,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+Z和bg
步骤?
我尝试在命令&
后附加一个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 &
但是,当你想用 在后台运行命令时,最好完全避免使用&
和。编写脚本时尤其如此。nohup
sudo
方法二:使用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。