1
0

shadowsocks.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #!/bin/bash
  2. # Author: yeho <lj2007331 AT gmail.com>
  3. # BLOG: https://blog.linuxeye.com
  4. #
  5. # Notes: OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+
  6. # Install Shadowsocks Server
  7. #
  8. # Project home page:
  9. # http://oneinstack.com
  10. # https://github.com/lj2007331/oneinstack
  11. export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  12. clear
  13. printf "
  14. #######################################################################
  15. # OneinStack for CentOS/RadHat 6+ Debian 6+ and Ubuntu 12+ #
  16. # Install Shadowsocks Server #
  17. # For more information please visit http://oneinstack.com #
  18. #######################################################################
  19. "
  20. cd src
  21. . ../options.conf
  22. . ../include/color.sh
  23. . ../include/check_os.sh
  24. . ../include/download.sh
  25. # Check if user is root
  26. [ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must be root to run this script${CEND}"; exit 1; }
  27. PUBLIC_IPADDR=`../include/get_public_ipaddr.py`
  28. [ "$CentOS_RHEL_version" == '5' ] && { echo "${CWARNING}Shadowsocks only support CentOS6,7 or Debian or Ubuntu! ${CEND}"; exit 1; }
  29. Check_shadowsocks() {
  30. [ -f /usr/local/bin/ss-server ] && SS_version=1
  31. [ -f /usr/bin/ssserver -o -f /usr/local/bin/ssserver ] && SS_version=2
  32. }
  33. AddUser_shadowsocks() {
  34. while :
  35. do
  36. echo
  37. read -p "Please input password for shadowsocks: " Shadowsocks_password
  38. [ -n "`echo $Shadowsocks_password | grep '[+|&]'`" ] && { echo "${CWARNING}input error,not contain a plus sign (+) and & ${CEND}"; continue; }
  39. (( ${#Shadowsocks_password} >= 5 )) && break || echo "${CWARNING}Shadowsocks password least 5 characters! ${CEND}"
  40. done
  41. }
  42. Iptables_set() {
  43. if [ -e '/etc/sysconfig/iptables' ];then
  44. Shadowsocks_Already_port=`grep -oE '9[0-9][0-9][0-9]' /etc/sysconfig/iptables | head -n 1`
  45. elif [ -e '/etc/iptables.up.rules' ];then
  46. Shadowsocks_Already_port=`grep -oE '9[0-9][0-9][0-9]' /etc/iptables.up.rules | head -n 1`
  47. fi
  48. if [ -n "$Shadowsocks_Already_port" ];then
  49. Shadowsocks_Default_port=`expr $Shadowsocks_Already_port + 1`
  50. else
  51. Shadowsocks_Default_port=9001
  52. fi
  53. while :
  54. do
  55. echo
  56. read -p "Please input Shadowsocks port(Default: $Shadowsocks_Default_port): " Shadowsocks_port
  57. [ -z "$Shadowsocks_port" ] && Shadowsocks_port=$Shadowsocks_Default_port
  58. if [ $Shadowsocks_port -ge 9000 >/dev/null 2>&1 -a $Shadowsocks_port -le 10000 >/dev/null 2>&1 ];then
  59. break
  60. else
  61. echo "${CWARNING}input error! Input range: 9001~9999${CEND}"
  62. fi
  63. done
  64. if [ "$OS" == 'CentOS' ];then
  65. if [ -z "`grep -E $Shadowsocks_port /etc/sysconfig/iptables`" ];then
  66. iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport $Shadowsocks_port -j ACCEPT
  67. iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport $Shadowsocks_port -j ACCEPT
  68. service iptables save
  69. fi
  70. elif [[ $OS =~ ^Ubuntu$|^Debian$ ]];then
  71. if [ -z "`grep -E $Shadowsocks_port /etc/iptables.up.rules`" ];then
  72. iptables -I INPUT 4 -p udp -m state --state NEW -m udp --dport $Shadowsocks_port -j ACCEPT
  73. iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport $Shadowsocks_port -j ACCEPT
  74. iptables-save > /etc/iptables.up.rules
  75. fi
  76. else
  77. echo "${CWARNING}This port is already in iptables${CEND}"
  78. fi
  79. }
  80. Def_parameter() {
  81. if [ "$OS" == 'CentOS' ]; then
  82. while :; do echo
  83. echo 'Please select Shadowsocks server version:'
  84. echo -e "\t${CMSG}1${CEND}. Install Shadowsocks-libev"
  85. echo -e "\t${CMSG}2${CEND}. Install Shadowsocks-python"
  86. read -p "Please input a number:(Default 1 press Enter) " SS_version
  87. [ -z "$SS_version" ] && SS_version=1
  88. if [[ ! $SS_version =~ ^[1-2]$ ]];then
  89. echo "${CWARNING}input error! Please only input number 1,2${CEND}"
  90. else
  91. break
  92. fi
  93. done
  94. AddUser_shadowsocks
  95. Iptables_set
  96. for Package in wget unzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel git
  97. do
  98. yum -y install $Package
  99. done
  100. elif [[ $OS =~ ^Ubuntu$|^Debian$ ]];then
  101. SS_version=2
  102. AddUser_shadowsocks
  103. Iptables_set
  104. apt-get -y update
  105. for Package in python-dev python-pip curl wget unzip gcc swig automake make perl cpio git
  106. do
  107. apt-get -y install $Package
  108. done
  109. fi
  110. }
  111. Install_shadowsocks-python() {
  112. src_url=http://mirrors.linuxeye.com/oneinstack/src/ez_setup.py && Download_src
  113. which pip > /dev/null 2>&1
  114. [ $? -ne 0 ] && [ "$OS" == 'CentOS' ] && { python ez_setup.py install; sleep 1; easy_install pip; }
  115. if [ -f /usr/bin/pip ]; then
  116. pip install M2Crypto
  117. pip install greenlet
  118. pip install gevent
  119. pip install shadowsocks
  120. if [ -f /usr/bin/ssserver -o -f /usr/local/bin/ssserver ]; then
  121. /bin/cp ../init.d/Shadowsocks-python-init /etc/init.d/shadowsocks
  122. chmod +x /etc/init.d/shadowsocks
  123. [ "$OS" == 'CentOS' ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
  124. [[ $OS =~ ^Ubuntu$|^Debian$ ]] && update-rc.d shadowsocks defaults
  125. [ ! -e /usr/bin/ssserver -a -e /usr/local/bin/ssserver ] && sed -i 's@Shadowsocks_bin=.*@Shadowsocks_bin=/usr/local/bin/ssserver@' /etc/init.d/shadowsocks
  126. else
  127. echo
  128. echo "${CQUESTION}Shadowsocks-python install failed! Please visit http://oneinstack.com${CEND}"
  129. exit 1
  130. fi
  131. fi
  132. }
  133. Install_shadowsocks-libev() {
  134. git clone https://github.com/shadowsocks/shadowsocks-libev.git
  135. cd shadowsocks-libev
  136. ./configure
  137. make && make install
  138. cd ..
  139. if [ -f /usr/local/bin/ss-server ];then
  140. /bin/cp ../init.d/Shadowsocks-libev-init /etc/init.d/shadowsocks
  141. chmod +x /etc/init.d/shadowsocks
  142. [ "$OS" == 'CentOS' ] && { chkconfig --add shadowsocks; chkconfig shadowsocks on; }
  143. else
  144. echo
  145. echo "${CQUESTION}Shadowsocks-libev install failed! Please visit http://oneinstack.com${CEND}"
  146. exit 1
  147. fi
  148. }
  149. Uninstall_shadowsocks(){
  150. while :
  151. do
  152. echo
  153. read -p "Do you want to uninstall Shadowsocks? [y/n]: " Shadowsocks_yn
  154. if [[ ! $Shadowsocks_yn =~ ^[y,n]$ ]];then
  155. echo "${CWARNING}input error! Please only input 'y' or 'n'${CEND}"
  156. else
  157. break
  158. fi
  159. done
  160. if [ "$Shadowsocks_yn" == 'y' ]; then
  161. [ -n "`ps -ef | grep -v grep | grep -iE "ssserver|ss-server"`" ] && /etc/init.d/shadowsocks stop
  162. [ "$OS" == 'CentOS' ] && chkconfig --del shadowsocks
  163. [[ $OS =~ ^Ubuntu$|^Debian$ ]] && update-rc.d -f shadowsocks remove
  164. rm -rf /etc/shadowsocks /var/run/shadowsocks.pid /etc/init.d/shadowsocks
  165. if [ "$SS_version" == '1' ];then
  166. rm -f /usr/local/bin/ss-local
  167. rm -f /usr/local/bin/ss-tunnel
  168. rm -f /usr/local/bin/ss-server
  169. rm -f /usr/local/bin/ss-manager
  170. rm -f /usr/local/bin/ss-redir
  171. rm -f /usr/local/lib/libshadowsocks.a
  172. rm -f /usr/local/lib/libshadowsocks.la
  173. rm -f /usr/local/include/shadowsocks.h
  174. rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc
  175. rm -f /usr/local/share/man/man1/ss-local.1
  176. rm -f /usr/local/share/man/man1/ss-tunnel.1
  177. rm -f /usr/local/share/man/man1/ss-server.1
  178. rm -f /usr/local/share/man/man1/ss-manager.1
  179. rm -f /usr/local/share/man/man1/ss-redir.1
  180. rm -f /usr/local/share/man/man8/shadowsocks.8
  181. if [ $? -eq 0 ]; then
  182. echo "${CSUCCESS}Shadowsocks-libev uninstall success! ${CEND}"
  183. else
  184. echo "${CFAILURE}Shadowsocks-libev uninstall failed! ${CEND}"
  185. fi
  186. elif [ "$SS_version" == '2' ];then
  187. pip uninstall -y shadowsocks
  188. if [ $? -eq 0 ]; then
  189. echo "${CSUCCESS}Shadowsocks-python uninstall success! ${CEND}"
  190. else
  191. echo "${CFAILURE}Shadowsocks-python uninstall failed! ${CEND}"
  192. fi
  193. fi
  194. else
  195. echo "${CMSG}Shadowsocks uninstall cancelled! ${CEND}"
  196. fi
  197. }
  198. Config_shadowsocks(){
  199. [ ! -d '/etc/shadowsocks' ] && mkdir /etc/shadowsocks
  200. [ "$SS_version" == '1' ] && cat > /etc/shadowsocks/config.json<<EOF
  201. {
  202. "server":"0.0.0.0",
  203. "server_port":$Shadowsocks_port,
  204. "local_address":"127.0.0.1",
  205. "local_port":1080,
  206. "password":"$Shadowsocks_password",
  207. "timeout":300,
  208. "method":"aes-256-cfb",
  209. }
  210. EOF
  211. [ "$SS_version" == '2' ] && cat > /etc/shadowsocks/config.json<<EOF
  212. {
  213. "server":"0.0.0.0",
  214. "local_address":"127.0.0.1",
  215. "local_port":1080,
  216. "port_password":{
  217. "$Shadowsocks_port":"$Shadowsocks_password"
  218. },
  219. "timeout":300,
  220. "method":"aes-256-cfb",
  221. "fast_open":false
  222. }
  223. EOF
  224. }
  225. AddUser_Config_shadowsocks(){
  226. [ ! -e /etc/shadowsocks/config.json ] && { echo "${CFAILURE}Shadowsocks is not installed! ${CEND}"; exit 1; }
  227. [ -z "`grep \"$Shadowsocks_port\" /etc/shadowsocks/config.json`" ] && sed -i "s@\"port_password\":{@\"port_password\":{\n\t\"$Shadowsocks_port\":\"$Shadowsocks_password\",@" /etc/shadowsocks/config.json || { echo "${CWARNING}This port is already in /etc/shadowsocks/config.json${CEND}"; exit 1; }
  228. }
  229. Print_User_shadowsocks(){
  230. printf "
  231. Your Server IP: ${CMSG}$PUBLIC_IPADDR${CEND}
  232. Your Server Port: ${CMSG}$Shadowsocks_port${CEND}
  233. Your Password: ${CMSG}$Shadowsocks_password${CEND}
  234. Your Local IP: ${CMSG}127.0.0.1${CEND}
  235. Your Local Port: ${CMSG}1080${CEND}
  236. Your Encryption Method: ${CMSG}aes-256-cfb${CEND}
  237. "
  238. }
  239. case "$1" in
  240. install)
  241. Def_parameter
  242. [ "$SS_version" == '1' ] && Install_shadowsocks-libev
  243. [ "$SS_version" == '2' ] && Install_shadowsocks-python
  244. Config_shadowsocks
  245. service shadowsocks start
  246. Print_User_shadowsocks
  247. ;;
  248. adduser)
  249. Check_shadowsocks
  250. if [ "$SS_version" == '2' ];then
  251. AddUser_shadowsocks
  252. Iptables_set
  253. AddUser_Config_shadowsocks
  254. service shadowsocks restart
  255. Print_User_shadowsocks
  256. else
  257. printf "
  258. Sorry, we have no plan to support multi port configuration. Actually you can use multiple instances instead. For example:
  259. ss-server -c /etc/shadowsocks/config1.json -f /var/run/shadowsocks-server/pid1
  260. ss-server -c /etc/shadowsocks/config2.json -f /var/run/shadowsocks-server/pid2
  261. ss-server -c /etc/shadowsocks/config3.json -f /var/run/shadowsocks-server/pid3
  262. "
  263. fi
  264. ;;
  265. uninstall)
  266. Check_shadowsocks
  267. Uninstall_shadowsocks
  268. ;;
  269. *)
  270. echo
  271. echo $"Usage: ${CMSG}$0${CEND} { ${CMSG}install${CEND} | ${CMSG}adduser${CEND} | ${CMSG}uninstall${CEND} }"
  272. echo
  273. exit 1
  274. esac