shadowsocks-libev 安裝及使用(多用戶、多IP)

shadowsocks是一套技術和相關工具的總稱,常備簡稱為ss,可以簡單總結為:一套基于Sock5代理方式的網(wǎng)絡加密傳輸數(shù)據(jù)包的技術 = 用Socks5 技術加密的技術。

Sock技術簡介

采用sock協(xié)議的代理服務器就是 Socks 服務器,是一種通用的代理服務器。

Socks代理與應用層代理、HTTP層代理不通,Socks代理只是簡單的傳遞數(shù)據(jù)包,而不必關心是何種協(xié)議(比如FTP、HTTP和NNTP請求)。所以,Socks代理比其他應用層代理要快的多。

Sock5代理服務器則是把你的網(wǎng)絡數(shù)據(jù)請求通過一條連接你和代理服務器之間的通道,由服務器轉發(fā)到目的地。你沒有加入任何新的網(wǎng)絡,只是http/socks數(shù)據(jù)經過代理服務器的轉發(fā)送出,并從代理服務器接收回應。你與代理服務器通信過程不會被額外處理,如果你用https,那本身就是加密的。

搭建:

1、參考安裝教程:http://totoro.site/index.php/archives/54? ,按照該教程安裝時,出現(xiàn)錯誤,根據(jù)錯誤提示,發(fā)現(xiàn)是 解壓 mbedtls-2.13.0-gpl.tgz 時格式不對造成的,經過排查,該文件(mbedtls-2.13.0-gpl.tgz)不是一個壓縮包,是一個ASCII文件,更改安裝腳本中 mbedtls-2.13.0-gpl.tgz 的下載地址: https://down.24kplus.com/linux/mbedtls/mbedtls-2.16.3-gpl.tgz,然后重新執(zhí)行腳本,安裝完成。

2、安裝 shadowsocks-libev.sh (網(wǎng)絡上該腳本中一個網(wǎng)址不存在,已修改);添加執(zhí)行權限后 執(zhí)行便可: ./shadowsocks-libev.sh

3、增加用戶:useradd ss3

4、添加子接口:ifconfig eth0:0 2.2.2.2/24 或 ip addr add 2.2.2.2/24 dev eth0 label eth0:0 清除網(wǎng)卡子接口,刪除ip別名 ifconfig eth0:1 down? 或 ip addr del 2.2.2.2/24 dev eth0 label eth0:0? ;

若是想永久生效,創(chuàng)建:/etc/sysconfig/network-scripts/ifcfg-eth0:0 添加:(文件中僅有下面四行便可)

DEVICE=eth0:0

IPADDR=2.2.2.2

PREFIX=24

ONPARENT=yes

注:使用命令添加后立刻生效,增加配置文件是在系統(tǒng)重啟后生效,所以需要使用命令添加并且增加配置文件才可以立即增加且永久生效。

5、使用新建的用戶運行:ss-server -a ss3 -c /home/ss3/ss3.json -u &

6、防火墻放行相應端口(tcp放行就可以了,但是網(wǎng)上教程都放行了udp)

iptables -I INPUT -p tcp --dport 14278 -j ACCEPT

或:firewall-cmd --permanent --zone=public --add-port=11126/tcp

7、查看是否成功啟動并監(jiān)聽相應端口

ps -aux | grep ss-server

netstat -anlp | grep ss-server

8、若想中斷某個ss-server進程,先通過 ps -aux 找到pid,之后通過 kill [pid] 強制中斷。


附錄:

可以將一下代碼復制到Linux的一個腳本中,直接運行,便可安裝好shadowsocks-libev

#!/usr/bin/env bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

#===================================================================#

#? System Required:? CentOS 6 or 7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #

#? Description: Install Shadowsocks-libev server for CentOS 6 or 7 #

#? Author: Teddysun <i@teddysun.com>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #

#? Thanks: @madeye <https://github.com/madeye>? ? ? ? ? ? ? ? ? ? #

#? Intro:? https://teddysun.com/357.html? ? ? ? ? ? ? ? ? ? ? ? ? #

#===================================================================#

# Current folder

cur_dir=`pwd`

libsodium_file="libsodium-1.0.16"

libsodium_url="https://github.com/jedisct1/libsodium/releases/download/1.0.16/libsodium-1.0.16.tar.gz"

mbedtls_file="mbedtls-2.16.3"

mbedtls_url="https://down.24kplus.com/linux/mbedtls/mbedtls-2.16.3-gpl.tgz"

# Stream Ciphers

ciphers=(

aes-256-gcm

aes-192-gcm

aes-128-gcm

aes-256-ctr

aes-192-ctr

aes-128-ctr

aes-256-cfb

aes-192-cfb

aes-128-cfb

camellia-128-cfb

camellia-192-cfb

camellia-256-cfb

xchacha20-ietf-poly1305

chacha20-ietf-poly1305

chacha20-ietf

chacha20

salsa20

rc4-md5

)

# Color

red='\033[0;31m'

green='\033[0;32m'

yellow='\033[0;33m'

plain='\033[0m'

# Make sure only root can run our script

[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1

# Disable selinux

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

}

get_ip(){

? ? local 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 )

? ? [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )

? ? [ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )

? ? [ ! -z ${IP} ] && echo ${IP} || echo

}

get_ipv6(){

? ? local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com)

? ? if [ -z ${ipv6} ]; then

? ? ? ? return 1

? ? else

? ? ? ? return 0

? ? fi

}

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

}

get_latest_version(){

? ? ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4)

? ? [ -z ${ver} ] && echo "Error: Get shadowsocks-libev latest version failed" && exit 1

? ? shadowsocks_libev_ver="shadowsocks-libev-$(echo ${ver} | sed -e 's/^[a-zA-Z]//g')"

? ? download_link="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${ver}/${shadowsocks_libev_ver}.tar.gz"

? ? init_script_link="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev"

}

check_installed(){

? ? if [ "$(command -v "$1")" ]; then

? ? ? ? return 0

? ? else

? ? ? ? return 1

? ? fi

}

check_version(){

? ? check_installed "ss-server"

? ? if [ $? -eq 0 ]; then

? ? ? ? installed_ver=$(ss-server -h | grep shadowsocks-libev | cut -d' ' -f2)

? ? ? ? get_latest_version

? ? ? ? latest_ver=$(echo ${ver} | sed -e 's/^[a-zA-Z]//g')

? ? ? ? if [ "${latest_ver}" == "${installed_ver}" ]; then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? else

? ? ? ? return 2

? ? fi

}

print_info(){

? ? clear

? ? echo "#############################################################"

? ? echo "# Install Shadowsocks-libev server for CentOS 6 or 7? ? ? ? #"

? ? echo "# Intro:? https://teddysun.com/357.html? ? ? ? ? ? ? ? ? ? #"

? ? echo "# Author: Teddysun <i@teddysun.com>? ? ? ? ? ? ? ? ? ? ? ? #"

? ? echo "# Github: https://github.com/shadowsocks/shadowsocks-libev? #"

? ? echo "#############################################################"

? ? echo

}

# Check system

check_sys(){

? ? local checkType=$1

? ? local value=$2

? ? local release=''

? ? local systemPackage=''

? ? if [[ -f /etc/redhat-release ]]; then

? ? ? ? release="centos"

? ? ? ? systemPackage="yum"

? ? elif grep -Eqi "debian|raspbian" /etc/issue; then

? ? ? ? release="debian"

? ? ? ? systemPackage="apt"

? ? elif grep -Eqi "ubuntu" /etc/issue; then

? ? ? ? release="ubuntu"

? ? ? ? systemPackage="apt"

? ? elif grep -Eqi "centos|red hat|redhat" /etc/issue; then

? ? ? ? release="centos"

? ? ? ? systemPackage="yum"

? ? elif grep -Eqi "debian|raspbian" /proc/version; then

? ? ? ? release="debian"

? ? ? ? systemPackage="apt"

? ? elif grep -Eqi "ubuntu" /proc/version; then

? ? ? ? release="ubuntu"

? ? ? ? systemPackage="apt"

? ? elif grep -Eqi "centos|red hat|redhat" /proc/version; then

? ? ? ? release="centos"

? ? ? ? systemPackage="yum"

? ? fi

? ? if [[ "${checkType}" == "sysRelease" ]]; then

? ? ? ? if [ "${value}" == "${release}" ]; then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? elif [[ "${checkType}" == "packageManager" ]]; then

? ? ? ? if [ "${value}" == "${systemPackage}" ]; then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? fi

}

version_gt(){

? ? test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"

}

check_kernel_version(){

? ? local kernel_version=$(uname -r | cut -d- -f1)

? ? if version_gt ${kernel_version} 3.7.0; then

? ? ? ? return 0

? ? else

? ? ? ? return 1

? ? fi

}

check_kernel_headers(){

? ? if check_sys packageManager yum; then

? ? ? ? if rpm -qa | grep -q headers-$(uname -r); then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? elif check_sys packageManager apt; then

? ? ? ? if dpkg -s linux-headers-$(uname -r) > /dev/null 2>&1; then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? fi

? ? return 1

}

# Get version

getversion(){

? ? if [[ -s /etc/redhat-release ]]; then

? ? ? ? grep -oE? "[0-9.]+" /etc/redhat-release

? ? else

? ? ? ? grep -oE? "[0-9.]+" /etc/issue

? ? fi

}

# CentOS version

centosversion(){

? ? if check_sys sysRelease centos; then

? ? ? ? local code=$1

? ? ? ? local version="$(getversion)"

? ? ? ? local main_ver=${version%%.*}

? ? ? ? if [ "$main_ver" == "$code" ]; then

? ? ? ? ? ? return 0

? ? ? ? else

? ? ? ? ? ? return 1

? ? ? ? fi

? ? else

? ? ? ? return 1

? ? fi

}

# Pre-installation settings

pre_install(){

? ? # Check OS system

? ? if check_sys sysRelease centos; then

? ? ? ? # Not support CentOS 5

? ? ? ? if centosversion 5; then

? ? ? ? ? ? echo -e "[${red}Error${plain}] Not support CentOS 5, please change to CentOS 6 or 7 and try again."

? ? ? ? ? ? exit 1

? ? ? ? fi

? ? else

? ? ? ? echo -e "[${red}Error${plain}] Your OS is not supported to run it, please change OS to CentOS and try again."

? ? ? ? exit 1

? ? fi

? ? # Check version

? ? check_version

? ? status=$?

? ? if [ ${status} -eq 0 ]; then

? ? ? ? echo -e "[${green}Info${plain}] Latest version ${green}${shadowsocks_libev_ver}${plain} has already been installed, nothing to do..."

? ? ? ? exit 0

? ? elif [ ${status} -eq 1 ]; then

? ? ? ? echo -e "Installed version: ${red}${installed_ver}${plain}"

? ? ? ? echo -e "Latest version: ${red}${latest_ver}${plain}"

? ? ? ? echo -e "[${green}Info${plain}] Upgrade shadowsocks libev to latest version..."

? ? ? ? ps -ef | grep -v grep | grep -i "ss-server" > /dev/null 2>&1

? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? /etc/init.d/shadowsocks stop

? ? ? ? fi

? ? elif [ ${status} -eq 2 ]; then

? ? ? ? print_info

? ? ? ? get_latest_version

? ? ? ? echo -e "[${green}Info${plain}] Latest version: ${green}${shadowsocks_libev_ver}${plain}"

? ? ? ? echo

? ? fi

? ? # Set shadowsocks-libev config password

? ? echo "Please enter password for shadowsocks-libev:"

? ? read -p "(Default password: teddysun.com):" shadowsockspwd

? ? [ -z "${shadowsockspwd}" ] && shadowsockspwd="teddysun.com"

? ? echo

? ? echo "---------------------------"

? ? echo "password = ${shadowsockspwd}"

? ? echo "---------------------------"

? ? echo

? ? # Set shadowsocks-libev config port

? ? while true

? ? do

? ? dport=$(shuf -i 9000-19999 -n 1)

? ? echo -e "Please enter a port for shadowsocks-libev [1-65535]"

? ? read -p "(Default port: ${dport}):" shadowsocksport

? ? [ -z "$shadowsocksport" ] && shadowsocksport=${dport}

? ? expr ${shadowsocksport} + 1 &>/dev/null

? ? if [ $? -eq 0 ]; then

? ? ? ? if [ ${shadowsocksport} -ge 1 ] && [ ${shadowsocksport} -le 65535 ] && [ ${shadowsocksport:0:1} != 0 ]; then

? ? ? ? ? ? echo

? ? ? ? ? ? echo "---------------------------"

? ? ? ? ? ? echo "port = ${shadowsocksport}"

? ? ? ? ? ? echo "---------------------------"

? ? ? ? ? ? echo

? ? ? ? ? ? break

? ? ? ? fi

? ? fi

? ? echo -e "[${red}Error${plain}] Please enter a correct number [1-65535]"

? ? done

? ? # Set shadowsocks config stream ciphers

? ? while true

? ? do

? ? echo -e "Please select stream cipher for shadowsocks-libev:"

? ? for ((i=1;i<=${#ciphers[@]};i++ )); do

? ? ? ? hint="${ciphers[$i-1]}"

? ? ? ? echo -e "${green}${i}${plain}) ${hint}"

? ? done

? ? read -p "Which cipher you'd select(Default: ${ciphers[0]}):" pick

? ? [ -z "$pick" ] && pick=1

? ? expr ${pick} + 1 &>/dev/null

? ? if [ $? -ne 0 ]; then

? ? ? ? echo -e "[${red}Error${plain}] Please enter a number"

? ? ? ? continue

? ? fi

? ? if [[ "$pick" -lt 1 || "$pick" -gt ${#ciphers[@]} ]]; then

? ? ? ? echo -e "[${red}Error${plain}] Please enter a number between 1 and ${#ciphers[@]}"

? ? ? ? continue

? ? fi

? ? shadowsockscipher=${ciphers[$pick-1]}

? ? echo

? ? echo "---------------------------"

? ? echo "cipher = ${shadowsockscipher}"

? ? echo "---------------------------"

? ? echo

? ? break

? ? done

? ? echo

? ? echo "Press any key to start...or press Ctrl+C to cancel"

? ? char=`get_char`

? ? #Install necessary dependencies

? ? echo -e "[${green}Info${plain}] Checking the EPEL repository..."

? ? if [ ! -f /etc/yum.repos.d/epel.repo ]; then

? ? ? ? yum install -y -q epel-release

? ? fi

? ? [ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1

? ? [ ! "$(command -v yum-config-manager)" ] && yum install -y -q yum-utils

? ? if [ x"`yum-config-manager epel | grep -w enabled | awk '{print $3}'`" != x"True" ]; then

? ? ? ? yum-config-manager --enable epel

? ? fi

? ? echo -e "[${green}Info${plain}] Checking the EPEL repository complete..."

? ? yum install -y -q unzip openssl openssl-devel gettext gcc autoconf libtool automake make asciidoc xmlto libev-devel pcre pcre-devel git c-ares-devel

}

download() {

? ? local filename=${1}

? ? local cur_dir=`pwd`

? ? if [ -s ${filename} ]; then

? ? ? ? echo -e "[${green}Info${plain}] ${filename} [found]"

? ? else

? ? ? ? echo -e "[${green}Info${plain}] ${filename} not found, download now..."

? ? ? ? wget --no-check-certificate -cq -t3 -T60 -O ${1} ${2}

? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? echo -e "[${green}Info${plain}] ${filename} download completed..."

? ? ? ? else

? ? ? ? ? ? echo -e "[${red}Error${plain}] Failed to download ${filename}, please download it to ${cur_dir} directory manually and try again."

? ? ? ? ? ? exit 1

? ? ? ? fi

? ? fi

}

# Download latest shadowsocks-libev

download_files(){

? ? cd ${cur_dir}

? ? download "${shadowsocks_libev_ver}.tar.gz" "${download_link}"

? ? download "${libsodium_file}.tar.gz" "${libsodium_url}"

? ? download "${mbedtls_file}-gpl.tgz" "${mbedtls_url}"

? ? download "/etc/init.d/shadowsocks" "${init_script_link}"

}

install_libsodium() {

? ? if [ ! -f /usr/lib/libsodium.a ]; then

? ? ? ? cd ${cur_dir}

? ? ? ? tar zxf ${libsodium_file}.tar.gz

? ? ? ? cd ${libsodium_file}

? ? ? ? ./configure --prefix=/usr && make && make install

? ? ? ? if [ $? -ne 0 ]; then

? ? ? ? ? ? echo -e "[${red}Error${plain}] ${libsodium_file} install failed."

? ? ? ? ? ? exit 1

? ? ? ? fi

? ? else

? ? ? ? echo -e "[${green}Info${plain}] ${libsodium_file} already installed."

? ? fi

}

install_mbedtls() {

? ? if [ ! -f /usr/lib/libmbedtls.a ]; then

? ? ? ? cd ${cur_dir}

? ? ? ? tar xf ${mbedtls_file}-gpl.tgz

? ? ? ? cd ${mbedtls_file}

? ? ? ? make SHARED=1 CFLAGS=-fPIC

? ? ? ? make DESTDIR=/usr install

? ? ? ? if [ $? -ne 0 ]; then

? ? ? ? ? ? echo -e "[${red}Error${plain}] ${mbedtls_file} install failed."

? ? ? ? ? ? exit 1

? ? ? ? fi

? ? else

? ? ? ? echo -e "[${green}Info${plain}] ${mbedtls_file} already installed."

? ? fi

}

# Config shadowsocks

config_shadowsocks(){

? ? local server_value="\"0.0.0.0\""

? ? if get_ipv6; then

? ? ? ? server_value="[\"[::0]\",\"0.0.0.0\"]"

? ? fi

? ? if check_kernel_version && check_kernel_headers; then

? ? ? ? fast_open="true"

? ? else

? ? ? ? fast_open="false"

? ? fi

? ? if [ ! -d /etc/shadowsocks-libev ]; then

? ? ? ? mkdir -p /etc/shadowsocks-libev

? ? fi

? ? cat > /etc/shadowsocks-libev/config.json<<-EOF

{

? ? "server":${server_value},

? ? "server_port":${shadowsocksport},

? ? "password":"${shadowsockspwd}",

? ? "timeout":300,

? ? "user":"nobody",

? ? "method":"${shadowsockscipher}",

? ? "fast_open":${fast_open},

? ? "nameserver":"8.8.8.8",

? ? "mode":"tcp_and_udp"

}

EOF

}

# Firewall set

firewall_set(){

? ? echo -e "[${green}Info${plain}] firewall set start..."

? ? if centosversion 6; then

? ? ? ? /etc/init.d/iptables status > /dev/null 2>&1

? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? iptables -L -n | grep -i ${shadowsocksport} > /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 -e "[${green}Info${plain}] port ${shadowsocksport} has been set up."

? ? ? ? ? ? fi

? ? ? ? else

? ? ? ? ? ? echo -e "[${yellow}Warning${plain}] 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 -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary."

? ? ? ? fi

? ? fi

? ? echo -e "[${green}Info${plain}] firewall set completed..."

}

# Install Shadowsocks-libev

install_shadowsocks(){

? ? install_libsodium

? ? install_mbedtls

? ? ldconfig

? ? cd ${cur_dir}

? ? tar zxf ${shadowsocks_libev_ver}.tar.gz

? ? cd ${shadowsocks_libev_ver}

? ? ./configure --disable-documentation

? ? make && make install

? ? if [ $? -eq 0 ]; then

? ? ? ? chmod +x /etc/init.d/shadowsocks

? ? ? ? chkconfig --add shadowsocks

? ? ? ? chkconfig shadowsocks on

? ? ? ? # Start shadowsocks

? ? ? ? /etc/init.d/shadowsocks start

? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? echo -e "[${green}Info${plain}] Shadowsocks-libev start success!"

? ? ? ? else

? ? ? ? ? ? echo -e "[${yellow}Warning${plain}] Shadowsocks-libev start failure!"

? ? ? ? fi

? ? else

? ? ? ? echo

? ? ? ? echo -e "[${red}Error${plain}] Shadowsocks-libev install failed. please visit https://teddysun.com/357.html and contact."

? ? ? ? exit 1

? ? fi

? ? cd ${cur_dir}

? ? rm -rf ${shadowsocks_libev_ver} ${shadowsocks_libev_ver}.tar.gz

? ? rm -rf ${libsodium_file} ${libsodium_file}.tar.gz

? ? rm -rf ${mbedtls_file} ${mbedtls_file}-gpl.tgz

? ? clear

? ? echo

? ? echo -e "Congratulations, Shadowsocks-libev server install completed!"

? ? echo -e "Your Server IP? ? ? ? : \033[41;37m $(get_ip) \033[0m"

? ? echo -e "Your Server Port? ? ? : \033[41;37m ${shadowsocksport} \033[0m"

? ? echo -e "Your Password? ? ? ? : \033[41;37m ${shadowsockspwd} \033[0m"

? ? echo -e "Your Encryption Method: \033[41;37m ${shadowsockscipher} \033[0m"

? ? echo

? ? echo "Welcome to visit:https://teddysun.com/357.html"

? ? echo "Enjoy it!"

? ? echo

}

# Install Shadowsocks-libev

install_shadowsocks_libev(){

? ? disable_selinux

? ? pre_install

? ? download_files

? ? config_shadowsocks

? ? firewall_set

? ? install_shadowsocks

}

# Uninstall Shadowsocks-libev

uninstall_shadowsocks_libev(){

? ? clear

? ? print_info

? ? printf "Are you sure uninstall Shadowsocks-libev? (y/n)"

? ? printf "\n"

? ? read -p "(Default: n):" answer

? ? [ -z ${answer} ] && answer="n"

? ? if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then

? ? ? ? ps -ef | grep -v grep | grep -i "ss-server" > /dev/null 2>&1

? ? ? ? if [ $? -eq 0 ]; then

? ? ? ? ? ? /etc/init.d/shadowsocks stop

? ? ? ? fi

? ? ? ? chkconfig --del shadowsocks

? ? ? ? rm -fr /etc/shadowsocks-libev

? ? ? ? rm -f /usr/local/bin/ss-local

? ? ? ? rm -f /usr/local/bin/ss-tunnel

? ? ? ? rm -f /usr/local/bin/ss-server

? ? ? ? rm -f /usr/local/bin/ss-manager

? ? ? ? rm -f /usr/local/bin/ss-redir

? ? ? ? rm -f /usr/local/bin/ss-nat

? ? ? ? rm -f /usr/local/lib/libshadowsocks-libev.a

? ? ? ? rm -f /usr/local/lib/libshadowsocks-libev.la

? ? ? ? rm -f /usr/local/include/shadowsocks.h

? ? ? ? rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc

? ? ? ? rm -f /usr/local/share/man/man1/ss-local.1

? ? ? ? rm -f /usr/local/share/man/man1/ss-tunnel.1

? ? ? ? rm -f /usr/local/share/man/man1/ss-server.1

? ? ? ? rm -f /usr/local/share/man/man1/ss-manager.1

? ? ? ? rm -f /usr/local/share/man/man1/ss-redir.1

? ? ? ? rm -f /usr/local/share/man/man1/ss-nat.1

? ? ? ? rm -f /usr/local/share/man/man8/shadowsocks-libev.8

? ? ? ? rm -fr /usr/local/share/doc/shadowsocks-libev

? ? ? ? rm -f /etc/init.d/shadowsocks

? ? ? ? echo "Shadowsocks-libev uninstall success!"

? ? else

? ? ? ? echo

? ? ? ? echo "uninstall cancelled, nothing to do..."

? ? ? ? echo

? ? fi

}

# Initialization step

action=$1

[ -z $1 ] && action=install

case "$action" in

? ? install|uninstall)

? ? ? ? ${action}_shadowsocks_libev

? ? ? ? ;;

? ? *)

? ? ? ? echo "Arguments error! [${action}]"

? ? ? ? echo "Usage: `basename $0` [install|uninstall]"

? ? ? ? ;;

esac


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前言 Google Play應用市場對于應用的targetSdkVersion有了更為嚴格的要求。從 2018 年...
    申國駿閱讀 65,787評論 15 98
  • 《來,我們說說孤獨》 1·他們都在寫孤獨 一個詩人 如果 不說說 內心的孤獨 不將孤獨 寫進詩里 是不是很掉價呢 ...
    聽太陽升起閱讀 4,600評論 1 7
  • 自幼貧民窟長大的女子,僥幸多念了兩本書,枉以為可以與人平起平坐??墒侨松鷱膩矶际墙恿?,我們卻天真的當成了百米沖刺...
    Leeanran閱讀 5,909評論 1 5
  • 云舒老師,姓甚名誰,男的女的,多大歲數(shù),這些我全然不知。之所以要寫寫云舒老師,完全是因為他寫的文章,如一個巨大的磁...
    數(shù)豆者m閱讀 2,537評論 6 9
  • """1.個性化消息: 將用戶的姓名存到一個變量中,并向該用戶顯示一條消息。顯示的消息應非常簡單,如“Hello ...
    她即我命閱讀 5,010評論 0 6

友情鏈接更多精彩內容