目前,我使用 openvpn 连接到远程网络,然后当终端中出现“初始化序列完成”时,我在第二个窗口中运行脚本。 (这一切都无需输入我的密码。)
$ cat /etc/sudoers.d/openvpn
ron ALL = NOPASSWD: /usr/sbin/openvpn
xterm 1:
sudo openvpn --config foo.ovpn
xterm 2:
./snaggle.sh
不过,由于我很懒,我想将这两个命令合并为一个命令,但不知道如何操作。我所知道的一个是行不通的:
sudo nohup openvpn --config foo.ovpn &
编辑:将这些命令添加到 foo.ovpn 时,我注意到它们运行良好前”初始化序列完成” 出现:
user ron
group ron
script-security 2
up /home/ron/snaggle.sh
编辑2:这是snaggle.sh 的内容。 (重要的是:有时我需要连接到VPN没有运行这个脚本。)
#!/bin/bash
echo $HOME
cd $HOME/work
readonly TS=`TZ=UTC date +"%Y%m%d_%H%M"`
readonly TSHUMAN=`TZ=UTC date +"%F %H:%M %Z"`
readonly OUTFILE=results/prod_cluster_${TS}UTC.txt
for ip in 16 17 18;
do
node=10.0.83.${ip}
echo $node
echo -e "\n\n ${node} \n" >> ${OUTFILE}
ssh A467197@${node} "bash -s" <<EOF >> ${OUTFILE}
#/bin/bash
mysql -N -e "select 'Uptime is ', mysql.big_time_format(VARIABLE_VALUE) as Uptime from performance_schema.global_status where VARIABLE_NAME='Uptime';"
mysql -N -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster%';"
EOF
done
echo "" | mutt -s "Some private stuff at ${TSHUMAN}" -a ${OUTFILE} -- $(cat email_addrs.txt)
编辑3:
OpenVPN 2.3.10 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 22 2017
library versions: OpenSSL 1.0.2g 1 Mar 2016, LZO 2.08
Originally developed by James Yonan
Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <[email protected]>
Compile time defines: enable_crypto=yes enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=yes enable_fragment=yes enable_http_proxy=yes enable_iproute2=yes enable_libtool_lock=yes enable_lzo=yes enable_lzo_stub=no enable_maintainer_mode=no enable_management=yes enable_multi=yes enable_multihome=yes enable_pam_dlopen=no enable_password_save=yes enable_pedantic=no enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_server=yes enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_socks=yes enable_ssl=yes enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=yes enable_win32_dll=yes enable_x509_alt_username=yes with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_plugindir='${prefix}/lib/openvpn' with_sysroot=no
答案1
您可以使用该指令指定通过 openvpn 连接到 VPN 时要运行的脚本up
(以及其他一些将在初始化过程中不同时间运行的脚本)。您可能还需要为此设置脚本安全性。只需将以下内容附加到您的foo.ovpn
文件中:
script-security 2
up /path/to/script.sh
就您的情况而言,这应该是断开连接序列之前的最晚时间,因为您需要通过 VPN 进行连接:
script-security 2
route-up /path/to/script.sh
请注意,当此命令运行时,openvpn 不会处理任何数据包,因此此脚本需要是您的调用者脚本snaggle.sh
,如下所示:
#!/bin/bash
nohup /path/to/snaggle.sh &
exit 0
由于您还需要选择连接时是否运行脚本,因此您可以使用 2 个不同的.ovpn
文件或使用命令行参数形式 ( openvpn --config xxx.ovpn --script-security 2 --route-up /path/to/script.sh
),而不是在.ovpn
文件中包含这些选项。openvpnsnaggle
如果打字有问题,您甚至可以为其创建一个别名。
要了解有关运行命令的其他可用选项(身份验证后、IP 更改时、断开连接时等)的更多信息,您可以在文档。
答案2
!回复写给askubuntu
我在研究中偶然发现了解决这个问题的答案,我发现最好的解决方案是(使用 openvpn 服务器):
创建要执行的脚本:
# nano /etc/openvpn/up.sh
<file:contents>
#!/bin/sh
# export >> /var/log/openvpn/openvpn-up.log
D=`date "+%Y-%m-%d %H:%M"`
echo "[$D] ($local_port_1:$proto_1) $X509_0_CN: $trusted_ip => $ifconfig_pool_remote_ip" >> /var/log/openvpn/openvpn-up.log
</file>
将以下行添加到 openvpn 配置(通常为 /etc/openvpn/server.conf)中。在上面的答案中,它被向上和向下使用,它们在服务器启动(重新启动)时使用。当客户端连接(断开)时使用指令 client-connect (和 client-disconnect)
# nano /etc/openvpn/server.conf
<file:add>
script-security 2
client-connect /etc/openvpn/up.sh
</file>
答案3
就我而言,我不需要它,但是,正如 Mathias Sundman 在一篇文章中所说,您可以执行以下操作(仅限 Windows): 1. 使用所有代码创建一个 .bat 文件 - 如果您的 openvpn 配置文件名为 office- network.ovpn 然后, - .bat 文件应命名为 office-network_up.bat 2. 将 .bat 文件放入 openvpn config 文件夹(靠近 ovpn 文件) 3. 注意不要使用暂停或其他等待的 cmd/shell 命令用户输入,它将破坏 openvpn 4 的初始化。如果您需要用户交互,请使用:
start /I "next.bat"
在office-network_up.bat中
列出环境变量的 .bat 示例
@echo off
date /t > %TEMP%\openvpn.log
for %%i in (%0 %1 %2 %3 %4 %5 %6 %7 %8 %9) do echo Argument %%i >> %TEMP%\openvpn.log
set >> %TEMP%\openvpn.log
start /I type %TEMP%\openvpn.log
答案4
在遵循多项建议之后,我遇到的一个问题是“--up”和--route-up”在整个“初始化序列完成”之前执行。
对我来说,我必须在完全初始化后打开端口..所以我按照下面的操作..
#1) 创建 up.sh 异步启动端口打开脚本(proxyports.sh)
#2) 创建 down.sh,关闭 proxyports.sh 中异步打开的端口
up.sh 内容...
#!/bin/bash
( ( sleep 1 ; ~/proxyports.sh) & echo "Open the ports" )
proxyports.sh 内容...
#!/bin/bash
HOME=/home/venkatdesu
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
if [[ ! -z "$PID" ]]; then
echo "SSH Socks Process $PID running with " $(ps "$PID");
kill -9 $PID;
sleep 1;
fi;
ssh -D 1080 -Nf [email protected]
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
echo "Socks running at $PID"
down.sh内容...
#!/bin/bash
PID=$(/usr/sbin/lsof -i :1080 | grep LISTEN|awk '{print $2}'|sort|uniq);
if [[ ! -z "$PID" ]]; then
echo "SSH Socks Process $PID running with " $(ps "$PID");
kill -9 $PID;
fi;