我正在努力实现以下目标:
./vpnconnect.sh start
应与服务器建立VPN连接。./vpnconnect.sh stop
应终止VPN连接。
下面是尝试的shell脚本,它没有按预期工作。它给出了错误:
~$ ./vpnconnect.sh stop
Stopping VPN connection:
./vpnconnect.sh: 22: ./vpnconnect.sh: root: not found
./vpnconnect.sh: 26: ./vpnconnect.sh: 14128: not found
脚本:
#!/bin/sh
#
#
#
#
PIDOCN=""
VAR2=""
# Start the VPN
start() {
echo "Starting VPN Connection"
eval $(echo 'TestVpn&!' | sudo openconnect -q -b --no-cert-check 127.0.0.1 -u myUser --passwd-on-stdin)
success $"VPN Connection established"
}
# Stop the VPN
stop() {
echo "Stopping VPN connection:"
VAR2=eval $(sudo ps -aef | grep openconnect)
echo $VAR2
eval $(sudo kill -9 $VAR2)
PIDOCN=eval $(pidof openconnect)
echo $PIDOCN
eval $(sudo kill -9 $PIDOCN)
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status openconnect
;;
restart|reload|condrestart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit 0
2条答案
按热度按时间iaqfqrcu1#
错误消息:
来自这些行:
这几行是没有意义的,shell获取
$(...)
子shell的输出,并试图将它们作为命令执行,同时将VAR2
和PIDOCN
变量设置为“eval”,这肯定不是您想要的。也许你正在寻找更像这样的东西:
lqfhib0f2#
eval
存在此问题:这里,
eval
将尝试执行sudo ps -aef | grep openconnect
命令的输出,这就是您看到错误的原因。将其改写为:
它只是将
sudo
命令管道的输出赋给VAR2
变量,但是,您不能将VAR2
用作kill
的参数,因为它包含了其他标记,如用户名沿着PID。在其他地方,你正在做
eval $(command)
,所有你需要的是command
。您可以使用
pkill openconnect
终止任何现有的openconnect
进程,而不是找出PID并对其发出kill
。pgrep
和pkill
对于像您这样的启动/停止/重新启动脚本非常方便。