github twitter email rss
当梯子不可用时可以自动重启梯子的脚本
Sep 15, 2016
2 minutes read

总有各种各样的原因会使梯子无法使用,此时往往重启服务是最快的选择。 然而并不是时刻你都有电脑在边上,手机打开 ssh,telnet 也并不方便。 “这就尴尬了。” 于是我便写下了这个脚本。适用各种支持 socks5、http 梯子。 以下都以 debian 系的 linux 例,centos 系请自行更改包管理和 daemon 管理的命令。


###服务端配置 * 安装必要组件

apt-get install -y lighttpd php5-cgi 
lighttpd-enable-mod auth
lighttpd-enable-mod fastcgi
lighttpd-enable-mod fastcgi-php
  • 配置 lighttpd 1.配置 http basic 认证,用于保护 site,先保存下面的脚本为 auth.sh
#!/bin/sh
user=$1
realm=$2
pass=$3
hash=`echo -n "$user:$realm:$pass" | md5sum | cut -b -32`
echo "$user:$realm:$hash" > /etc/lighttpd/lighttpd.user
cat>/etc/lighttpd/conf-enabled/05-auth.conf<<EOF
server.modules                += ( "mod_auth" )

auth.backend                 = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd.user"
auth.require = ( "/proxy" =>
(
	"method" => "basic",
	"realm" => "proxy",
	"require" => "user=$user"
)
)
EOF

2.运行 auth.sh,三个参数分别为用户名、域、密码

sh auth.sh <user> <realm> <password>

3.实现简易的 web 接口用来接收 client 端的 POST 请求

#!/bin/sh
mkdir -p /var/www/proxy
cd /var/www/proxy
echo 0 > restart.status
cat>/var/www/ifproxyworking.php<<EOF
<?php
$restart = $_POST['restart'];
$filename = "restart.status";
if (isset($restart) && is_numeric($restart) && $restart >= 0) {
	if ($restart != 0 && $restart != 1) {
		$restart = 0;
	}
	$fh = fopen($filename, "w");
	fwrite($fh, $restart, 1);
	fclose($fh);
}
?>
EOF
chown -R www-data:www-data /var/www/proxy
/etc/init.d/lighttpd force-reload
  • 配置 crontab 及监控 daemon 的脚本 1.保存以下脚本monitor.sh proc_name 填你梯子 daemon 的名称,如 shadowsocks, v2ray etc bash #!/bin/sh proc_name="YOUR PROXY NAME" require_restart=`cat /var/www/proxy/restart.status` if [ $require_restart -eq 1 ]; then /usr/sbin/service $proc_name restart echo 0 > /var/www/proxy/restart.status exit 0 fi number=`ps -ef | grep $proc_name | grep -v grep | wc -l` if [ $number -eq 2 ]; then /usr/sbin/service $proc_name stop ps -ef | grep $proc_name | grep -v grep | awk '{print $2}' | xargs kill -9 sleep 1 /usr/sbin/service $proc_name start fi if [ $number -eq 0 ]; then /usr/sbin/service $proc_name start fi 2.将脚本加入 crontab, 由于需重启 daemon,请使用 root 的 crontab ```bash crontab -e 在最后一行加入, 注意将路径替换成你脚本保存的路径
  • * * * * /YOUR PATH/monitor.sh >/dev/null 2>&1 ```

###客户端配置 * 保存以下脚本proxy_monitor.sh 其中的 vpsip 直接填服务端的 ip 或替换脚本中的 YOUR DOMAIN 为服务端的域名 testip 中 curl 后的socks5://127.0.0.1:1080为 proxy 的地址,请自行替换 将 YOUR PROXY DAEMON NAME 改成客户端的 Daemon 名字

#!/bin/bash

vpsip=`nslookup YOUR DOMAIN | awk '/^Address: / { print $2 }'`
testip=`curl -sx socks5://127.0.0.1:1080 http://icanhazip.com -m 2`
rs=$?

if [[ $rs -eq 0 ]] && [[ ${testip} = ${vpsip} ]]; then
	exit 0
elif [[ $rs -eq 28 ]]; then
	echo `date +%X` 'Proxy stucked, restarting'
	curl --user YOURUSERNAME:YOURPASSWORD --data "restart=1" http://YOURDOMAIN.COM/proxy/ifproxyworking.php
	/usr/sbin/service YOUR PROXY DAEMON NAME restart
elif [[ $rs -eq 7 ]]; then
	echo `date +%X` 'Proxy not running'
fi

exit $rs
  • 将脚本加入 crontab, 由于需重启 daemon,请使用 root 的 crontab
crontab -e
在最后一行加入, 注意将路径替换成你脚本保存的路径
* * * * * /YOUR PATH/proxy_monitor.sh >/dev/null 2>&1

Back to posts


comments powered by Disqus