diff --git a/shadowsocks-go b/shadowsocks-go new file mode 100644 index 0000000..e1fc361 --- /dev/null +++ b/shadowsocks-go @@ -0,0 +1,113 @@ +#!/bin/bash +# Start/stop shadowsocks. +# +### BEGIN INIT INFO +# Provides: shadowsocks +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: shadowsocks is a lightweight tunneling proxy +# Description: Modified from Linode's nginx fastcgi startup script +### END INIT INFO + +# Note: this script requires sudo in order to run shadowsocks as the specified +# user. + +BIN=/usr/bin/shadowsocks-server +CONFIG_FILE=/etc/shadowsocks/config.json +#LOG_FILE=/var/log/shadowsocks +USER=nobody +GROUP=nobody +PID_DIR=/var/run +PID_FILE=$PID_DIR/shadowsocks.pid +RET_VAL=0 + +[ -x $BIN ] || exit 0 + +check_running() { + if [[ -r $PID_FILE ]]; then + read PID <$PID_FILE + if [[ -d "/proc/$PID" ]]; then + return 0 + else + rm -f $PID_FILE + return 1 + fi + else + return 2 + fi +} + +do_status() { + check_running + case $? in + 0) + echo "shadowsocks-go running with PID $PID" + ;; + 1) + echo "shadowsocks-go not running, remove PID file $PID_FILE" + ;; + 2) + echo "Could not find PID file $PID_FILE, shadowsocks-go does not appear to be running" + ;; + esac + return 0 +} + +do_start() { + if [[ ! -d $PID_DIR ]]; then + mkdir $PID_DIR || echo "failed creating PID directory $PID_DIR"; exit 1 + chown $USER:$GROUP $PID_DIR || echo "failed creating PID directory $PID_DIR"; exit 1 + chmod 0770 $PID_DIR + fi + if check_running; then + echo "shadowsocks-go already running with PID $PID" + return 0 + fi + if [[ ! -r $CONFIG_FILE ]]; then + echo "config file $CONFIG_FILE not found" + return 1 + fi + echo "starting shadowsocks-go" + # sudo will set the group to the primary group of $USER + sudo -u $USER $BIN -c $CONFIG_FILE & + PID=$! + echo $PID > $PID_FILE + sleep 0.3 + if ! check_running; then + echo "start failed" + return 1 + fi + echo "shadowsocks-go running with PID $PID" + return 0 +} + +do_stop() { + if check_running; then + echo "stopping shadowsocks-go with PID $PID" + kill $PID + rm -f $PID_FILE + else + echo "Could not find PID file $PID_FILE" + fi +} + +do_restart() { + do_stop + do_start +} + +case "$1" in + start|stop|restart|status) + do_$1 + ;; + *) + echo "Usage: shadowsocks {start|stop|restart|status}" + RET_VAL=1 + ;; +esac + +exit $RET_VAL diff --git a/shadowsocks-go.sh b/shadowsocks-go.sh new file mode 100644 index 0000000..3ffb357 --- /dev/null +++ b/shadowsocks-go.sh @@ -0,0 +1,265 @@ +#! /bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +#=============================================================================================== +# System Required: CentOS6.x (32bit/64bit) +# Description: Install Shadowsocks(go) for CentOS +# Author: Teddysun +# Intro: http://teddysun.com/357.html +#=============================================================================================== + +clear +echo "#############################################################" +echo "# Install Shadowsocks(go) for CentOS 6.x (32bit/64bit)" +echo "# Intro: http://teddysun.com/357.html" +echo "#" +echo "# Author: Teddysun " +echo "#" +echo "#############################################################" +echo "" + +# Install Shadowsocks-go +function install_shadowsocks_go(){ + rootness + disable_selinux + pre_install + download_files + config_shadowsocks + iptables_set + install +} + +# 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 +} + +# 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 +} + +# is 64bit or not +function is_64bit(){ + if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; 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.x and 7.x + if centosversion 5; then + echo "Not support CentOS 5.x, please change to CentOS 6.x and try again." + exit 1 + elif centosversion 7; then + echo "Not support CentOS 7.x, please change to CentOS 6.x and try again." + exit 1 + fi + # Set shadowsocks-go config password + echo "Please input password for shadowsocks-go:" + read -p "(Default password: teddysun.com):" shadowsockspwd + if [ "$shadowsockspwd" = "" ]; then + shadowsockspwd="teddysun.com" + fi + echo "password:$shadowsockspwd" + echo "####################################" + 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 + yum install -y wget unzip gzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent + yum install -y automake make curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel + # Get IP address + echo "Getting Public IP address, Please wait a moment..." + IP=`curl -s checkip.dyndns.com | cut -d' ' -f 6 | cut -d'<' -f 1` + if [ -z $IP ]; then + IP=`curl -s ifconfig.me/ip` + fi + #Current folder + cur_dir=`pwd` +} + +# Download shadowsocks-go +function download_files(){ + cd $cur_dir + if is_64bit; then + if ! wget -c http://lamp.teddysun.com/shadowsocks/shadowsocks-server-linux64-1.1.3.gz;then + echo "Failed to download shadowsocks-server-linux64-1.1.3.gz" + exit 1 + fi + gzip -d shadowsocks-server-linux64-1.1.3.gz + if [ $? -eq 0 ];then + echo "Decompress shadowsocks-server-linux64-1.1.3.gz success." + else + echo "Decompress shadowsocks-server-linux64-1.1.3.gz failed! Please check gzip command." + exit 1 + fi + mv -f shadowsocks-server-linux64-1.1.3 /usr/bin/shadowsocks-server + else + if ! wget -c http://lamp.teddysun.com/shadowsocks/shadowsocks-server-linux32-1.1.3.gz;then + echo "Failed to download shadowsocks-server-linux32-1.1.3.gz" + exit 1 + fi + gzip -d shadowsocks-server-linux32-1.1.3.gz + if [ $? -eq 0 ];then + echo "Decompress shadowsocks-server-linux32-1.1.3.gz success." + else + echo "Decompress shadowsocks-server-linux32-1.1.3.gz failed! Please check gzip command." + exit 1 + fi + mv -f shadowsocks-server-linux32-1.1.3 /usr/bin/shadowsocks-server + fi + + # Download start script + if ! wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go; then + echo "Failed to download shadowsocks-go start script!" + exit 1 + fi +} + +# Config shadowsocks +function config_shadowsocks(){ + if [ ! -d /etc/shadowsocks ];then + mkdir /etc/shadowsocks + fi + cat > /etc/shadowsocks/config.json<<-EOF +{ + "server":"${IP}", + "server_port":8989, + "local_port":1080, + "password":"${shadowsockspwd}", + "method":"aes-256-cfb", + "timeout":600 +} +EOF +} + +# iptables set +function iptables_set(){ + /sbin/service iptables status 1>/dev/null 2>&1 + if [ $? -eq 0 ]; then + /etc/init.d/iptables status | grep '8989' | grep 'ACCEPT' >/dev/null 2>&1 + if [ $? -ne 0 ]; then + /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT + /etc/init.d/iptables save + /etc/init.d/iptables restart + fi + fi +} + + +# Install +function install(){ + # Install shadowsocks-go + if [ -s /usr/bin/shadowsocks-server ];then + echo "shadowsocks-go install success!" + mv $cur_dir/shadowsocks-go /etc/init.d/shadowsocks + chmod +x /etc/init.d/shadowsocks + # Add run on system start up + chkconfig --add shadowsocks + chkconfig shadowsocks on + # Start shadowsocks + /etc/init.d/shadowsocks start + if [ $? -eq 0 ]; then + echo "Shadowsocks-go start success!" + else + echo "Shadowsocks-go start failure!" + fi + else + echo "shadowsocks-go install failed!" + exit 0 + fi + cd $cur_dir + clear + echo "" + echo "Congratulations, shadowsocks-go install completed!" + echo -e "Your Server IP: \033[41;37m ${IP} \033[0m" + echo -e "Your Server Port: \033[41;37m 8989 \033[0m" + echo -e "Your Password: \033[41;37m ${shadowsockspwd} \033[0m" + echo -e "Your Local Port: \033[41;37m 1080 \033[0m" + echo -e "Your Encryption Method: \033[41;37m aes-256-cfb \033[0m" + echo "" + echo "Welcome to visit:http://teddysun.com/357.html" + echo "Enjoy it!" + echo "" +} + +# Uninstall Shadowsocks-go +function uninstall_shadowsocks_go(){ + printf "Are you sure uninstall shadowsocks-go? (y/n) " + printf "\n" + read -p "(Default: n):" answer + if [ -z $answer ]; then + answer="n" + fi + if [ "$answer" = "y" ]; then + ps -ef | grep -v grep | grep -v ps | grep -i "shadowsocks-server" > /dev/null 2>&1 + if [ $? -eq 0 ]; then + /etc/init.d/shadowsocks stop + fi + chkconfig --del shadowsocks + # delete config file + rm -rf /etc/shadowsocks + # delete shadowsocks + rm -f /etc/init.d/shadowsocks + rm -f /usr/bin/shadowsocks-server + echo "Shadowsocks-go uninstall success!" + else + echo "Uninstall cancelled, Nothing to do" + fi +} + +# Initialization step +action=$1 +[ -z $1 ] && action=install +case "$action" in +install) + install_shadowsocks_go + ;; +uninstall) + uninstall_shadowsocks_go + ;; +*) + echo "Arguments error! [${action} ]" + echo "Usage: `basename $0` {install|uninstall}" + ;; +esac \ No newline at end of file