我有这个脚本:
#! /bin/sh
# /etc/init.d/vpnscript
### BEGIN INIT INFO
# Short-Description: Simple script to start a program at boot
# Description: A simple script from http://www.stuffaboutcode.comwhich will start / stop a program a boot / shutdown.
### END INIT INFO
# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1"
in start)
echo "Connecting to OPENVPN"
# Connect to the VPN
sudo openvpn /etc/openvpn/connection1.ovpn
sudo mount -a
;;
stop)
echo "Stopping OPENVPN"
# Disconnect
killall openvpn
;;
*)
echo "Usage: /etc/init.d/vpnscript {start|stop}"
exit 1
;;
esac
Openvpn 部分运行良好,但如果它尝试使用sudo mount -a
该进程则开始不执行任何操作(或等待某事,我不知道)。
还有其他方法可以做我想做的事情还是我的脚本有问题?我是 shell 脚本的初学者。
一些注意事项:
我尝试使用 Debian 方式启动 OpenVPN (
/etc/default/openvpn
),但这没有启动,所以我尝试了这种方式。系统的主要
mount -a
发生在 OpenVPN 启动之前,并且我有一个条目/etc/fstab
引用 OpenVPN 连接上的网络驱动器。服务器运行 Openmediavault 3.0。
答案1
您看到的基本问题是 OpenVPN 持续运行,因此您sudo openvpn /etc/openvpn/connection1.ovpn
永远不会返回。因此你的脚本永远不会到达下一行。 (另外:初始化脚本以 root 身份运行,所以不应该有sudo
)。因此,简单地说,您需要&
在该行末尾添加一个与号 ( ),或者更好的是,为 OpenVPN 提供该--daemon
选项(但请阅读有关其限制的 OpenVPN 文档)。
当然,你应该只需使用 Debian 启用 VPN 的方式:在 Jessie 上,那就是. Pre-jessie 或在没有 systemd 的 Jessie 上,将编辑和更改该行。 (可能您还需要将扩展名从 更改为)。systemctl enable [email protected]
/etc/default/openvpn
AUTOSTART
.ovpn
.conf
然后你会发现下一个问题:OpenVPN会返回前VPN 已启动。但在 VPN 真正传递流量之前,您无法启动挂载。我发现解决这个问题的最简单方法是使用 systemd 服务来 ping VPN 的远程端:
$ cat vpn-really-up.service
[Unit]
Description=Ping Einstein to make sure the VPN is really up
[email protected]
[email protected]
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/ping -c 2 -w 300 192.168.X.Y
TimeoutStartSec=330
当然,您也可以在 init.d 脚本中使用该 ping 行。 (请注意,这可能不是最好的这样做的方法 - 例如,也许一个--route-up
命令会更好 - 不确定当我设置它时这些是否不存在,或者我是否不知道它们。我的机器实际上正在运行测试。)
然后,您可以为您的文件系统创建 systemd 挂载单元(请注意,这也取决于 dnsmasq,因为我使用它来通过 VPN 将一些域转发到 DNS 服务器,以便内部名称起作用):
$ cat mnt-Einstein-music.mount
[Unit]
Description=/mnt/Einstein/music
Requires=dnsmasq.service vpn-really-up.service
After=dnsmasq.service vpn-really-up.service remote-fs-pre.target
[Mount]
Where=/mnt/Einstein/music
What=Einstein.home:/srv/music
Options=nosuid,nodev,intr,rsize=4096,wsize=4096,nfsvers=3,fsc
Type=nfs
TimeoutSec=180s
[Install]
WantedBy=multi-user.target
(使用时安装也可以,而且使用 systemd 实际上相当容易 — 请参阅 参考资料man 5 systemd.automount
)。
最后,你的停止目标需要修复:你必须在停止 VPN 之前卸载文件系统。否则,您的计算机将在重新启动/关闭时挂起。您应该测试它是否有效,否则有一天您将通过 ssh 登录到计算机并重新启动它,并且必须进行一次计划外的旅行才能按下重置按钮。
PS:我也有这个文件:
$ cat [email protected]/local-after-ifup.conf
[Unit]
Requires=networking.service
After=networking.service
...我的猜测是,在 systemd 停止网络接口之前,需要确保 OpenVPN(以及所有 over VPN 文件系统)已停止。
答案2
简短的更新。
OPENVPN 现在工作正常,谢谢。
我需要做的最后一件事是:
$ cat mnt-SHAREDNAS.mount
[Unit]
Description=/mnt/SHAREDNAS
Requires=vpn-really-up.service
After=vpn-really-up.service remote-fs-pre.target
[Mount]
Where=/mnt/SHAREDNAS
What=//192.168.50.10/Users/RsyncNAS/SharedNASData
Options=uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm 0 0
Type=cifs
TimeoutSec=180s
[Install]
WantedBy=multi-user.target
但 mount 返回错误(22):参数无效。
所以我的问题是,将下面的 fstab 行转换为正确的 .mount 文件的正确方法是什么:
//192.168.50.10/Users/RsyncNAS/SharedNASData /media/SHAREDNAS cifs uid=root,credentials=/root/.smbcredentials,iocharset=utf8,sec=ntlm 0 0