我想写一个脚本,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后跟bg
.
但是,我想通过仅调用我的 bash 文件来自动调用 openvpn 连接步骤和 ssh。我如何设法模拟此文件中的Ctrl+Z和bg
步骤?
我试图将 a 附加&
到openvpn
命令并放在nohup
它前面。两者都不起作用。
TL;DR:使用
sudo -b
或者,更好,.openvpn [...] --daemon
由于您正在运行
openvpn
(并且不太具体,因为您希望在后台以 root身份运行程序),所以最常见的关于如何在后台运行命令的信息并不能解决您的情况。你说:你的命令是:
在
sudo
的默认配置下,如果您最近没有sudo
在同一个终端中输入密码(或在该终端上注销并重新登录),那么它将询问您的密码。但是,如果您通过附加在后台运行命令,&
那么您将不会看到该行或有机会输入它。[sudo] password for user:
因此在这种情况下,运行命令,输入密码,然后将其发送到后台是一种合理的方式,用于交互使用。
但这不是唯一的方法,正如您所说,您不想在脚本中这样做。
方式1:确保
sudo
有一个新的时间戳。您可以通过首先运行以下命令来确保
sudo
它在用于运行命令时具有当前时间戳:然后,在那之后,您可以运行:
但是,当您想在后台运行命令时,通常最好完全避免
&
(和) 。脚本尤其如此。nohup
sudo
方式 2:使用
sudo -b
. 通常,这通常是您想要的。相反,您可以
sudo
在前台运行它自己,但传递-b
标志以sudo
使命令在后台运行。这通常是一种更好的方法,尤其是当您将命令放入脚本时。
sudo -b
你没有得到作业控制,但在 shell 脚本中作业控制默认是禁用的,你通常不应该使用它。正如
man sudo
解释的那样:这是有效的,因为在sudo 收到您的密码(如有必要)并确定您被允许运行该命令之前,没有任何东西在后台运行。
方式 3:但是对于
openvpn
,您可能应该只使用--daemon
.openvpn
--daemon
如果您使用以下选项运行它,它将自动在后台运行:--daemon
在您的.opvn
文件名之后而不是之前传递;后面的参数--daemon
(如果有)被解释为守护openvpn
进程应该使用的名称。(不要同时附加&
。)这是否合适取决于在
openvpn
运行之后但在其守护进程之前是否必须发生任何交互。这部分取决于~/my_connection.ovpn
. 但是,如果openvpn
不能立即守护进程,那么所有其他立即在后台运行它的方式也会中断。因此,在您知道要开始在后台运行并且您知道不想将其带回前台的任何情况下
openvpn
,您都应该强烈考虑使用--daemon
选项调用它的方法。这是特定于openvpn
--most 程序不支持--daemon
选项的,尽管许多服务器程序确实有一些这样的选项。(但是,名称和语法有所不同。)要决定是否使用此选项(以及您希望如何使用它),我建议您阅读手册页,尤其是关于
openvpn
--daemon
. 它有很多有用的信息,我在这里只引用第一段:方式 4:有时以 root 身份运行整个脚本是合理的。
如果您有一个以 root 身份执行多个操作的脚本,那么它没有任何可以合理地不以 root 身份运行的重要活动,并且以非 root 用户身份运行脚本永远不会有任何用处,那么该脚本的用户可能应该以 root 身份运行它。
如果是这种情况,那么您应该
sudo
从脚本中的命令中删除。当脚本以 root 身份运行时,不需要sudo
. (尽管默认情况下,root 用户可以像任何用户一样运行任何命令,包括它自己,sudo
并且不需要密码来执行此操作。因此,如果您确实将实例保留sudo
在脚本中,那么它可能仍然可以工作。)如果您
sudo
在脚本中有任何实例实际上用于以除 root 以外的其他用户身份运行命令(使用),那么您仍应保留这些实例。-u user
如果整个脚本以 root 身份运行,则大多数使命令在后台运行的典型方法都适用,包括附加
&
以及在需要时使用nohup
(您已经知道)。但是,为此,您仍应强烈考虑使用openvpn
with--daemon
选项。TL;DR在守护进程模式下运行它:
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 会话中注销后,这也会保持守护程序运行。
你可以复制你的
然后让“service openvpn@confName start”为你处理所有的守护进程和 sudo。
见https://unix.stackexchange.com/a/366680/198666