好久之前就想有什么方法实现linux上的shell代理,因为有很多时候用shell下载东西的时候奇慢。今天我终于找到了,太不容易了吧
原理:使用shadowsocks代理,代理需要提供服务器,而我们可以找到免费的vpn用,所以这个问题就解决了。第二个问题是shadowsocks使用的是socks5协议,而大多数时候我们使用的是http协议,所以需要proxychains来转换。
安装: 1 pacman -S shadowsocks proxychains-ng
配置shadowsocks shadowsocks的配置文件在/etc/shadowsocks/
下,复制一个作为配置文件
1 cp example.json config.json
然后在这个里面填上免费的vpn服务器信息。地址在:不需要翻墙 需要翻墙
1 2 3 4 5 6 7 8 9 10 11 12 { "server":"23.160.193.75", "server_port":2133, "local_address": "127.0.0.1", "local_port":1080, "password":"www.eieee.cn", "timeout":300, "method":"aes-256-cfb", "fast_open": false, "workers": 1, "prefer_ipv6": false }
启动 用shadowsocks客户端启动:指定到我们的配置文件,并放到后台运行
1 nohup sslocal -c /etc/shadowsocks/config.json >/dev/null 2>&1 &
还可以不指定配置文件,直接在命令行里面指定
1 sslocal -s server_address -p server_port -l local_port -k password -m encryption_method
使用proxychains proxychains用来实现协议的转换,并指定需要代理的软件,或者设置为全局代理
编辑proxychains的配置文件:
1 2 3 vim /etc/proxychains.conf # 在最后面添加转换的地址 socks5 127.0.0.1 1080
然后就是使用代理了
1 2 # 例如代理firefox浏览器 proxychains firefox &
1 2 # 也可以代理shell proxychains zsh
既然每次都要打开网页去找免费的代理,那么何不写个自动化脚本呢? 建立一个软链接,用户自己的shell放置的位置为/usr/local/bin
下面:
1 ln -s /home/jc/Document/script/shell/shadowsocks.sh /usr/local/bin/sslink
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 # !/bin/zsh clear echo -e -n "\033[32m do you wanna to scartch another new vpn file ? yes or no : \033[0m" read wanna realdir=`whereis sslink | awk -F ":" '{print $2}' | xargs ls -l | awk -F ">" '{print $2}' | xargs dirname` cd $realdir if [[ $wanna == "yes" ]];then #curl https://www.youneed.win/free-ss > tmp.txt | sed -n '/^<td/p' | awk -F">" '{print $2}' | awk -F "<" '{print $1}' | sed -n '1,/ /p' | sed 's/ / /g' | xargs -n6 > account.txt curl https://www.flywind.ml/free-ss > tmp.txt | sed -n '/^<td/p' | awk -F">" '{print $2}' | awk -F "<" '{print $1}' | sed -n '1,/ /p' | sed 's/ / /g' | xargs -n6 > account.txt fi i=1 j=`cat account.txt | wc -l` while [[ $j -gt 0 ]] do s=`sed -n ''"$i"'p' account.txt | awk '{print $1}'` p=`sed -n ''"$i"'p' account.txt | awk '{print $2}'` k=`sed -n ''"$i"'p' account.txt | awk '{print $3}'` m=`sed -n ''"$i"'p' account.txt | awk '{print $4}'` c=`sed -n ''"$i"'p' account.txt | awk '{print $6}'` ss="sslocal -s $s -p $p -k $k -m $m -l 1080 & #$c" sum[$ i]=${ss} ((i++)) ((j--)) done select m in ${sum[*]} do for (( k=1;k<${#sum[@]};k++ )) do case $m in ${sum[k]}) id=`ps -ef | grep sslocal | grep -v grep | awk '{print $2}'` if [[ $id -gt 0 ]];then killall sslocal echo -e "\033[32m the sslocal process has been killed successfully \033[0m" fi echo -e "\033[32m connecting ....................................................................................... \033[0m" eval $m 2>/dev/null 1>&2 & ;; esac done done rm tmp.txt
这样每次都只需要运行sslink
这个命令就ok了