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

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

Sock技術(shù)簡(jiǎn)介

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

Socks代理與應(yīng)用層代理涮总、HTTP層代理不通,Socks代理只是簡(jiǎn)單的傳遞數(shù)據(jù)包祷舀,而不必關(guān)心是何種協(xié)議(比如FTP妹卿、HTTP和NNTP請(qǐng)求)。所以蔑鹦,Socks代理比其他應(yīng)用層代理要快的多夺克。

Sock5代理服務(wù)器則是把你的網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求通過(guò)一條連接你和代理服務(wù)器之間的通道,由服務(wù)器轉(zhuǎn)發(fā)到目的地嚎朽。你沒(méi)有加入任何新的網(wǎng)絡(luò)铺纽,只是http/socks數(shù)據(jù)經(jīng)過(guò)代理服務(wù)器的轉(zhuǎn)發(fā)送出,并從代理服務(wù)器接收回應(yīng)哟忍。你與代理服務(wù)器通信過(guò)程不會(huì)被額外處理狡门,如果你用https,那本身就是加密的锅很。

搭建:

1其馏、參考安裝教程:http://totoro.site/index.php/archives/54? ,按照該教程安裝時(shí)爆安,出現(xiàn)錯(cuò)誤叛复,根據(jù)錯(cuò)誤提示,發(fā)現(xiàn)是 解壓 mbedtls-2.13.0-gpl.tgz 時(shí)格式不對(duì)造成的扔仓,經(jīng)過(guò)排查褐奥,該文件(mbedtls-2.13.0-gpl.tgz)不是一個(gè)壓縮包,是一個(gè)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)絡(luò)上該腳本中一個(gè)網(wǎng)址不存在夫否,已修改);添加執(zhí)行權(quán)限后 執(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、使用新建的用戶運(yùn)行:ss-server -a ss3 -c /home/ss3/ss3.json -u &

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

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

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

7、查看是否成功啟動(dòng)并監(jiān)聽(tīng)相應(yīng)端口

ps -aux | grep ss-server

netstat -anlp | grep ss-server

8为牍、若想中斷某個(gè)ss-server進(jìn)程哼绑,先通過(guò) ps -aux 找到pid,之后通過(guò) kill [pid] 強(qiáng)制中斷碉咆。


附錄:

可以將一下代碼復(fù)制到Linux的一個(gè)腳本中抖韩,直接運(yùn)行,便可安裝好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


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疫铜,一起剝皮案震驚了整個(gè)濱河市茂浮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壳咕,老刑警劉巖席揽,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谓厘,居然都是意外死亡幌羞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門竟稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)属桦,“玉大人,你說(shuō)我怎么就攤上這事住练〉貑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵讲逛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岭埠,道長(zhǎng)盏混,這世上最難降的妖魔是什么蔚鸥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮许赃,結(jié)果婚禮上止喷,老公的妹妹穿的比我還像新娘。我一直安慰自己混聊,他們只是感情好弹谁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著句喜,像睡著了一般预愤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咳胃,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天植康,我揣著相機(jī)與錄音,去河邊找鬼展懈。 笑死销睁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的存崖。 我是一名探鬼主播冻记,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼来惧!你這毒婦竟也來(lái)了檩赢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤违寞,失蹤者是張志新(化名)和其女友劉穎贞瞒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趁曼,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡军浆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挡闰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乒融。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摄悯,靈堂內(nèi)的尸體忽然破棺而出赞季,到底是詐尸還是另有隱情,我是刑警寧澤奢驯,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布申钩,位于F島的核電站,受9級(jí)特大地震影響瘪阁,放射性物質(zhì)發(fā)生泄漏撒遣。R本人自食惡果不足惜邮偎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望义黎。 院中可真熱鬧禾进,春花似錦、人聲如沸廉涕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狐蜕。三九已至宠纯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馏鹤,已是汗流浹背征椒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湃累,地道東北人勃救。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像治力,于是被迫代替她去往敵國(guó)和親蒙秒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 Google Play應(yīng)用市場(chǎng)對(duì)于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求宵统。從 2018 年...
    申國(guó)駿閱讀 64,085評(píng)論 14 98
  • 《來(lái)马澈,我們說(shuō)說(shuō)孤獨(dú)》 1·他們都在寫孤獨(dú) 一個(gè)詩(shī)人 如果 不說(shuō)說(shuō) 內(nèi)心的孤獨(dú) 不將孤獨(dú) 寫進(jìn)詩(shī)里 是不是很掉價(jià)呢 ...
    聽(tīng)太陽(yáng)升起閱讀 4,376評(píng)論 1 7
  • 自幼貧民窟長(zhǎng)大的女子瓢省,僥幸多念了兩本書(shū),枉以為可以與人平起平坐痊班∏诨椋可是人生從來(lái)都是接力賽,我們卻天真的當(dāng)成了百米沖刺...
    Leeanran閱讀 5,770評(píng)論 1 5
  • 云舒老師涤伐,姓甚名誰(shuí)馒胆,男的女的,多大歲數(shù)凝果,這些我全然不知祝迂。之所以要寫寫云舒老師,完全是因?yàn)樗麑懙奈恼缕骶唬缫粋€(gè)巨大的磁...
    數(shù)豆者m閱讀 2,351評(píng)論 6 9
  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中型雳,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 2,890評(píng)論 0 5