Created
November 15, 2016 16:36
-
-
Save lxxself/d55c330150128c39b8eae757e1f8dc58 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin | |
export PATH | |
#=================================================================# | |
# System Required: CentOS 6,7, Debian, Ubuntu # | |
# Description: One click Install ShadowsocksR Server # | |
# Author: AlphaBrock <https://alphabrock.cn> # | |
# Thanks: @breakwa11 <https://twitter.com/breakwa11> # | |
# Thanks: @Teddysun <i@teddysun.com> # | |
# Intro: https://shadowsocks.be/9.html # | |
#=================================================================# | |
clear | |
echo | |
echo | |
#Current folder | |
cur_dir=`pwd` | |
# Get public IP address | |
IP=$(ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1) | |
if [[ "$IP" = "" ]]; then | |
IP=$(wget -qO- -t1 -T2 ipv4.icanhazip.com) | |
fi | |
# Make sure only root can run our script | |
function rootness(){ | |
if [[ $EUID -ne 0 ]]; then | |
echo "Error:This script must be run as root!" 1>&2 | |
exit 1 | |
fi | |
} | |
# Check OS | |
function checkos(){ | |
if [ -f /etc/redhat-release ];then | |
OS='CentOS' | |
elif [ ! -z "`cat /etc/issue | grep bian`" ];then | |
OS='Debian' | |
elif [ ! -z "`cat /etc/issue | grep Ubuntu`" ];then | |
OS='Ubuntu' | |
else | |
echo "Not support OS, Please reinstall OS and retry!" | |
exit 1 | |
fi | |
} | |
# Get version | |
function getversion(){ | |
if [[ -s /etc/redhat-release ]];then | |
grep -oE "[0-9.]+" /etc/redhat-release | |
else | |
grep -oE "[0-9.]+" /etc/issue | |
fi | |
} | |
# CentOS version | |
function centosversion(){ | |
local code=$1 | |
local version="`getversion`" | |
local main_ver=${version%%.*} | |
if [ $main_ver == $code ];then | |
return 0 | |
else | |
return 1 | |
fi | |
} | |
# Disable selinux | |
function disable_selinux(){ | |
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then | |
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config | |
setenforce 0 | |
fi | |
} | |
# Pre-installation settings | |
function pre_install(){ | |
# Not support CentOS 5 | |
if centosversion 5; then | |
echo "Not support CentOS 5, please change OS to CentOS 6+/Debian 7+/Ubuntu 12+ and retry." | |
exit 1 | |
fi | |
# Set ShadowsocksR config password | |
echo "Please input password for ShadowsocksR:" | |
read -p "(Default password: alphabrock.cn):" shadowsockspwd | |
[ -z "$shadowsockspwd" ] && shadowsockspwd="alphabrock.cn" | |
echo | |
echo "---------------------------" | |
echo "password = $shadowsockspwd" | |
echo "---------------------------" | |
echo | |
# Set ShadowsocksR config port | |
while true | |
do | |
echo -e "Please input port for ShadowsocksR [1-65535]:" | |
read -p "(Default port: 8989):" shadowsocksport | |
[ -z "$shadowsocksport" ] && shadowsocksport="8989" | |
expr $shadowsocksport + 0 &>/dev/null | |
if [ $? -eq 0 ]; then | |
if [ $shadowsocksport -ge 1 ] && [ $shadowsocksport -le 65535 ]; then | |
echo | |
echo "---------------------------" | |
echo "port = $shadowsocksport" | |
echo "---------------------------" | |
echo | |
break | |
else | |
echo "Input error! Please input correct number." | |
fi | |
else | |
echo "Input error! Please input correct number." | |
fi | |
done | |
get_char(){ | |
SAVEDSTTY=`stty -g` | |
stty -echo | |
stty cbreak | |
dd if=/dev/tty bs=1 count=1 2> /dev/null | |
stty -raw | |
stty echo | |
stty $SAVEDSTTY | |
} | |
echo | |
echo "Press any key to start...or Press Ctrl+C to cancel" | |
char=`get_char` | |
# Install necessary dependencies | |
if [ "$OS" == 'CentOS' ]; then | |
yum install -y wget unzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent git ntpdate ntp | |
yum install -y m2crypto automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel | |
yum -y install ntpdate ntp | |
else | |
apt-get -y update | |
apt-get -y install python python-dev python-pip python-m2crypto curl wget unzip gcc swig automake make perl cpio build-essential git ntpdate ntp | |
fi | |
cd $cur_dir | |
} | |
# Download files | |
function download_files(){ | |
# Download libsodium file | |
if ! wget --no-check-certificate -O libsodium-1.0.10.tar.gz https://github.com/jedisct1/libsodium/releases/download/1.0.10/libsodium-1.0.10.tar.gz; then | |
echo "Failed to download libsodium file!" | |
exit 1 | |
fi | |
# Download ShadowsocksR file | |
# if ! wget --no-check-certificate -O manyuser.zip https://raw.githubusercontent.com/lxxgithub/ssr-ml/master/shadowsocks-ml.zip; then | |
# echo "Failed to download ShadowsocksR file!" | |
# exit 1 | |
# fi | |
# Download ShadowsocksR chkconfig file | |
if [ "$OS" == 'CentOS' ]; then | |
if ! wget --no-check-certificate https://raw.githubusercontent.com/AlphaBrock/shadowsocks_install/master/shadowsocksR -O /etc/init.d/shadowsocks; then | |
echo "Failed to download ShadowsocksR chkconfig file!" | |
exit 1 | |
fi | |
else | |
if ! wget --no-check-certificate https://raw.githubusercontent.com/AlphaBrock/shadowsocks_install/master/shadowsocksR-debian -O /etc/init.d/shadowsocks; then | |
echo "Failed to download ShadowsocksR chkconfig file!" | |
exit 1 | |
fi | |
fi | |
} | |
# firewall set | |
function firewall_set(){ | |
echo "firewall set start..." | |
if centosversion 6; then | |
/etc/init.d/iptables status > /dev/null 2>&1 | |
if [ $? -eq 0 ]; then | |
iptables -L -n | grep '${shadowsocksport}' | grep 'ACCEPT' > /dev/null 2>&1 | |
if [ $? -ne 0 ]; then | |
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${shadowsocksport} -j ACCEPT | |
iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${shadowsocksport} -j ACCEPT | |
/etc/init.d/iptables save | |
/etc/init.d/iptables restart | |
else | |
echo "port ${shadowsocksport} has been set up." | |
fi | |
else | |
echo "WARNING: iptables looks like shutdown or not installed, please manually set it if necessary." | |
fi | |
elif centosversion 7; then | |
systemctl status firewalld > /dev/null 2>&1 | |
if [ $? -eq 0 ];then | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/tcp | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/udp | |
firewall-cmd --reload | |
else | |
echo "Firewalld looks like not running, try to start..." | |
systemctl start firewalld | |
if [ $? -eq 0 ];then | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/tcp | |
firewall-cmd --permanent --zone=public --add-port=${shadowsocksport}/udp | |
firewall-cmd --reload | |
else | |
echo "WARNING: Try to start firewalld failed. please enable port ${shadowsocksport} manually if necessary." | |
fi | |
fi | |
fi | |
echo "firewall set completed..." | |
} | |
# Config ShadowsocksR | |
function config_shadowsocks(){ | |
cat > /etc/shadowsocks.json<<-EOF | |
{ | |
"server": "0.0.0.0", | |
"server_ipv6": "::", | |
"server_port": ${shadowsocksport}, | |
"local_address": "127.0.0.1", | |
"local_port": 1081, | |
"password": "${shadowsockspwd}", | |
"timeout": 120, | |
"udp_timeout": 60, | |
"method": "chacha20", | |
"protocol": "auth_sha1_compatible", | |
"protocol_param": "", | |
"obfs": "http_simple_compatible", | |
"obfs_param": "", | |
"dns_ipv6": false, | |
"connect_verbose_info": 0, | |
"redirect": "", | |
"fast_open": false, | |
"workers": 1 | |
} | |
EOF | |
} | |
# Install ShadowsocksR | |
function install_ss(){ | |
# Install libsodium | |
tar zxf libsodium-1.0.10.tar.gz | |
cd $cur_dir/libsodium-1.0.10 | |
./configure && make && make install | |
echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf | |
ldconfig | |
# Install ShadowsocksR | |
cd $cur_dir | |
# unzip -q manyuser.zip | |
# mv shadowsocks-manyuser/shadowsocks /usr/local/ | |
git clone https://github.com/AlphaBrock/ssr-ml.git /usr/local/shadowsocks | |
if [ -f /usr/local/shadowsocks/server.py ]; then | |
chmod +x /etc/init.d/shadowsocks | |
chmod 755 /usr/local/shadowsocks/shadowsocks/server.py | |
# Add run on system start up | |
if [ "$OS" == 'CentOS' ]; then | |
chkconfig --add shadowsocks | |
chkconfig shadowsocks on | |
else | |
update-rc.d -f shadowsocks defaults | |
fi | |
# Run ShadowsocksR in the background | |
/etc/init.d/shadowsocks start | |
clear | |
echo | |
echo "Congratulations, ShadowsocksR install completed!" | |
echo -e "Server IP: \033[41;37m ${IP} \033[0m" | |
echo -e "Server Port: \033[41;37m ${shadowsocksport} \033[0m" | |
echo -e "Password: \033[41;37m ${shadowsockspwd} \033[0m" | |
echo -e "Local IP: \033[41;37m 127.0.0.1 \033[0m" | |
echo -e "Local Port: \033[41;37m 1080 \033[0m" | |
echo -e "Protocol: \033[41;37m auth_sha1 \033[0m" | |
echo -e "obfs: \033[41;37m http_simple \033[0m" | |
echo -e "Encryption Method: \033[41;37m chacha20 \033[0m" | |
echo | |
echo "Welcome to visit:https://shadowsocks.be/9.html" | |
echo "If you want to change protocol & obfs, reference URL:" | |
echo "https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup" | |
echo | |
echo "Enjoy it!" | |
echo | |
else | |
echo "Shadowsocks install failed!" | |
install_cleanup | |
exit 1 | |
fi | |
} | |
#改成北京时间 | |
function check_datetime(){ | |
service ntpd start | |
rm -rf /etc/localtime | |
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime | |
ntpdate stdtime.sinica.edu.tw | |
} | |
# Install cleanup | |
function install_cleanup(){ | |
cd $cur_dir | |
rm -f libsodium-1.0.10.tar.gz | |
rm -rf libsodium-1.0.10 | |
} | |
# Uninstall ShadowsocksR | |
function uninstall_shadowsocks(){ | |
printf "Are you sure uninstall ShadowsocksR? (y/n) " | |
printf "\n" | |
read -p "(Default: n):" answer | |
if [ -z $answer ]; then | |
answer="n" | |
fi | |
if [ "$answer" = "y" ]; then | |
/etc/init.d/shadowsocks status > /dev/null 2>&1 | |
if [ $? -eq 0 ]; then | |
/etc/init.d/shadowsocks stop | |
fi | |
checkos | |
if [ "$OS" == 'CentOS' ]; then | |
chkconfig --del shadowsocks | |
else | |
update-rc.d -f shadowsocks remove | |
fi | |
rm -f /etc/shadowsocks.json | |
rm -f /etc/init.d/shadowsocks | |
rm -rf /usr/local/shadowsocks | |
echo "ShadowsocksR uninstall success!" | |
else | |
echo "uninstall cancelled, Nothing to do" | |
fi | |
} | |
# Install ShadowsocksR | |
function install_shadowsocks(){ | |
checkos | |
rootness | |
disable_selinux | |
pre_install | |
download_files | |
config_shadowsocks | |
install_ss | |
if [ "$OS" == 'CentOS' ]; then | |
firewall_set > /dev/null 2>&1 | |
fi | |
check_datetime | |
install_cleanup | |
} | |
# Initialization step | |
action=$1 | |
[ -z $1 ] && action=install | |
case "$action" in | |
install) | |
install_shadowsocks | |
;; | |
uninstall) | |
uninstall_shadowsocks | |
;; | |
*) | |
echo "Arguments error! [${action} ]" | |
echo "Usage: `basename $0` {install|uninstall}" | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment