{"id":9,"date":"2017-03-04T02:15:44","date_gmt":"2017-03-03T18:15:44","guid":{"rendered":"http:\/\/www.zhangyijun.com\/?p=8"},"modified":"2017-03-04T02:15:44","modified_gmt":"2017-03-03T18:15:44","slug":"v16kcptun-%e6%9c%8d%e5%8a%a1%e7%ab%af%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e8%84%9a%e6%9c%ac%e5%96%9c%e9%97%bb%e4%b9%90%e8%a7%81%e7%9a%84%e5%a4%9a%e7%94%a8%e6%88%b7%e6%94%af%e6%8c%81","status":"publish","type":"post","link":"http:\/\/www.zhangyijun.com\/?p=9","title":{"rendered":"[v16]Kcptun \u670d\u52a1\u7aef\u4e00\u952e\u5b89\u88c5\u811a\u672c,\u559c\u95fb\u4e50\u89c1\u7684\u591a\u7528\u6237\u652f\u6301"},"content":{"rendered":"<p>\t\t\t\thttps:\/\/blog.kuoruan.com\/110.html<\/p>\n<p>\u7ecf\u5e38\u6709\u670b\u53cb\u62b1\u6028 Kcptun \u670d\u52a1\u7aef\u5b89\u88c5\u7e41\u7410\uff0c\u6211\u82b1\u65f6\u95f4\u5199\u4e86\u4e00\u4e2a\u4e00\u952e\u5b89\u88c5\u66f4\u65b0\u811a\u672c\u3002<\/p>\n<p>\u53c2\u8003\u4e86 @teddysun \u7684SS\u4e00\u952e\u5b89\u88c5\u811a\u672c\uff0c\u611f\u8c22 @\u9759\u9038\u8f69 \u63d0\u4f9b\u7684\u6d4b\u8bd5\u670d\u52a1\u5668\u3002<\/p>\n<p>\u7406\u8bba\u4e0a\u811a\u672c\u652f\u6301\uff1aCentOS 6+\u3001Ubuntu 12+\u548cDebian 7+\uff0c\u4f46\u662f\u7531\u4e8e\u6d4b\u8bd5\u4e0d\u5b8c\u5168\uff0c\u53ef\u80fd\u5b58\u5728\u5b89\u88c5\u5931\u8d25\u7684\u60c5\u51b5\u3002\u5982\u679c\u4f60\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u9047\u5230\u4efb\u4f55\u95ee\u9898\uff0c\u8bf7\u53cd\u9988\u7ed9\u6211\uff01\u53cd\u9988\u8bf7\u52a0QQ\u7fa4\uff1a43391448<\/p>\n<p>\u811a\u672c\u5df2\u66f4\u65b0\u5230v16\uff0c\u8bf7\u4ee5\u524d\u7248\u672c\u7684\u670b\u53cb\u66f4\u65b0\u4e00\u4e0b\uff1a<\/p>\n<p>\u8bf7\u5148\u5207\u6362\u5230 kcptun.sh \u6587\u4ef6\u76ee\u5f55\u4e0b\u8fd0\u884c<\/p>\n<div id=\"crayon-58b9290853798682250512\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b9290853798682250512-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b9290853798682250512-1\" class=\"crayon-line\"><span class=\"crayon-sy\">.<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-e\">.sh<\/span> <span class=\"crayon-v\">update<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u66f4\u65b0\u65e5\u5fd7\uff1a<\/p>\n<ol>\n<li>\u652f\u6301\u81ea\u5b9a\u4e49\u5b9e\u4f8b\u542f\u52a8\u7528\u6237;<\/li>\n<li>\u652f\u6301\u5220\u9664\u5b9e\u4f8b;<\/li>\n<li>\u5404\u79cd\u4f18\u5316;<\/li>\n<li>\u5b8c\u5584\u63d0\u793a\u4fe1\u606f<\/li>\n<\/ol>\n<p>\u540c\u65f6\u66f4\u65b0\u4e86 init \u811a\u672c<\/p>\n<ol>\n<li>\u4fee\u590d CentOS \u4e0a\u627e\u4e0d\u5230 Supervisor \u6267\u884c\u6587\u4ef6\u7684\u95ee\u9898;<\/li>\n<li>\u7531\u4e8e Supervisor \u7684\u7248\u672c\u4e0d\u540c, \u6267\u884c\u6587\u4ef6\u7684\u76ee\u5f55\u53ef\u80fd\u4e0d\u4e00\u6837, \u5982\u679c\u4f60\u51fa\u73b0\u65e0\u6cd5\u5b89\u88c5\u6216\u542f\u52a8\u5931\u8d25\u7684\u95ee\u9898, \u8bf7\u53ca\u65f6\u8054\u7cfb\u6211<\/li>\n<\/ol>\n<hr \/>\n<p>\u811a\u672c\u7684\u529f\u80fd\u6709\uff1a<\/p>\n<ol>\n<li>\u4e00\u952e\u5b89\u88c5\uff0c\u81ea\u52a8\u4e0b\u8f7d\u6700\u65b0\u7248\u672c\uff0c\u652f\u6301\u6240\u6709\u53c2\u6570\u914d\u7f6e\uff1b<\/li>\n<li>\u4e00\u952e\u66f4\u65b0\uff0c\u4e00\u952e\u5378\u8f7d\uff0c\u5b8c\u5168\u81ea\u52a8\u5316\uff1b<\/li>\n<li>\u652f\u6301\u7528\u6237\u624b\u52a8\u8f93\u5165\u7248\u672c\u5b89\u88c5\uff1b<\/li>\n<li>\u652f\u6301\u66f4\u65b0\u914d\u7f6e\uff0c\u81ea\u52a8\u8f93\u51fa\u63a8\u8350\u53c2\u6570\uff1b<\/li>\n<li>\u4f7f\u7528 Supervisor \u7ba1\u7406\u8fdb\u7a0b\uff0c\u66f4\u52a0\u4fbf\u6377\uff1b<\/li>\n<li>\u81ea\u52a8\u914d\u7f6e\u670d\u52a1\uff0c\u5e76\u968f\u5f00\u673a\u81ea\u542f\uff1b<\/li>\n<li>\u811a\u672c\u63d0\u793a\u5168\u4e2d\u6587\uff0c\u66f4\u5feb\u9501\u5b9a\u95ee\u9898\u3002<\/li>\n<\/ol>\n<p>\u7528 Putty \u4e0b\u4e2d\u6587\u663e\u793a\u53ef\u80fd\u4f1a\u51fa\u73b0\u4e71\u7801\u4e00\u7247\uff0c\u8bf7\u81ea\u884c\u89e3\u51b3\u4e71\u7801\u95ee\u9898\uff1b\u63a8\u8350\u4f7f\u7528 Xshell\uff0c\u624b\u673a\u4e0a\u53ef\u4ee5\u7528 JuiceSSH\uff0c\u90fd\u662f\u975e\u5e38\u597d\u7528\u7684 SSH \u5ba2\u6237\u7aef\u3002<\/p>\n<h2>\u4f7f\u7528\u811a\u672c\u5b89\u88c5\u670d\u52a1\u7aef<\/h2>\n<p>\u6ce8\u610f\uff1a\u5728\u914d\u7f6e\u4e4b\u524d\u8bf7\u786e\u8ba4\u4e00\u4e0b\u4f60\u7684\u52a0\u901f\u5730\u5740\uff0c\u5927\u90e8\u5206\u4e0d\u80fd\u52a0\u901f\u90fd\u662f\u7531\u4e8e\u52a0\u901f\u5730\u5740\u914d\u7f6e\u9519\u8bef\u3002<\/p>\n<p>\u9274\u4e8e\u5927\u90e8\u5206\u670b\u53cb\u662f\u7528\u6765\u52a0\u901f Shadowsocks\uff0c\u4e0b\u9762\u4ee5 Shadowsocks \u4e3a\u4f8b\uff0cShadowsocks \u6b63\u786e\u5b89\u88c5\u8fd0\u884c\u5728\u5f53\u524d\u670d\u52a1\u5668\u4e0a\u3002<\/p>\n<p>\u9996\u5148\u627e\u5230\u4f60\u7684 Shadowsocks \u7aef\u53e3\uff0c\u6bd4\u5982\u6211\u7684 Shadowsocks \u7aef\u53e3\u4e3a 8388\uff0c\u7136\u540e\u5728\u547d\u4ee4\u884c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div id=\"crayon-58b92908537a4127401175\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537a4127401175-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537a4127401175-1\" class=\"crayon-line\"><span class=\"crayon-v\">netstat<\/span> <span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">nl<\/span> <span class=\"crayon-o\">|<\/span> <span class=\"crayon-i\">grep<\/span> <span class=\"crayon-cn\">8388<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u5982\u679c\u63d0\u793a\u4ee5\u4e0a\u547d\u4ee4\u4e0d\u5b58\u5728\uff0c\u8bf7\u8f93\u5165\uff1a<\/p>\n<div id=\"crayon-58b92908537a8565333844\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537a8565333844-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537a8565333844-1\" class=\"crayon-line\"><span class=\"crayon-v\">ss<\/span> <span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">nl<\/span> <span class=\"crayon-o\">|<\/span> <span class=\"crayon-i\">grep<\/span> <span class=\"crayon-cn\">8388<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u6ce8\uff1a\u5c06 8388 \u66ff\u6362\u4e3a\u4f60\u7684 Shadowsocks \u7aef\u53e3\u3002<\/p>\n<p>\u7136\u540e\u4f60\u4f1a\u770b\u5230\u7c7b\u4f3c\u4e0b\u9762\u7684\u8f93\u51fa\uff08\u7740\u91cd\u770b\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u90e8\u5206\uff09\uff1a<\/p>\n<hr \/>\n<p>\u60c5\u51b5\u4e00\uff1a<\/p>\n<div id=\"crayon-58b92908537ab198151999\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537ab198151999-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537ab198151999-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537ab198151999-1\" class=\"crayon-line\"><span class=\"crayon-i\">tcp6<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LISTEN\u00a0\u00a0\u00a0\u00a0 <\/span><\/div>\n<div id=\"crayon-58b92908537ab198151999-2\" class=\"crayon-line\"><span class=\"crayon-i\">udp6<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u60c5\u51b52\uff1a<\/p>\n<div id=\"crayon-58b92908537ad193142092\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537ad193142092-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537ad193142092-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537ad193142092-1\" class=\"crayon-line\"><span class=\"crayon-i\">tcp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">127.0.0.1<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LISTEN\u00a0\u00a0\u00a0\u00a0 <\/span><\/div>\n<div id=\"crayon-58b92908537ad193142092-2\" class=\"crayon-line\"><span class=\"crayon-i\">udp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">127.0.0.1<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u60c5\u51b53\uff1a<\/p>\n<div id=\"crayon-58b92908537af929951623\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537af929951623-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537af929951623-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537af929951623-1\" class=\"crayon-line\"><span class=\"crayon-i\">tcp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.0.0.0<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LISTEN\u00a0\u00a0\u00a0\u00a0 <\/span><\/div>\n<div id=\"crayon-58b92908537af929951623-2\" class=\"crayon-line\"><span class=\"crayon-i\">udp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.0.0.0<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u60c5\u51b54\uff08\u5047\u5982 10.10.10.10 \u662f\u5f53\u524d\u670d\u52a1\u5668IP\uff09\uff1a<\/p>\n<div id=\"crayon-58b92908537b2991070477\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b2991070477-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b2991070477-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537b2991070477-1\" class=\"crayon-line\"><span class=\"crayon-i\">tcp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10.10.10.10<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">LISTEN\u00a0\u00a0\u00a0\u00a0 <\/span><\/div>\n<div id=\"crayon-58b92908537b2991070477-2\" class=\"crayon-line\"><span class=\"crayon-i\">udp<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">10.10.10.10<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-o\">::<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">*<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr \/>\n<p>\u82e5\u4e3a\u60c5\u51b51\u3001\u60c5\u51b52\u548c\u60c5\u51b53\uff0c\u90a3\u4e48\u4f60\u7684\u52a0\u901f\u5730\u5740\u53ef\u4ee5\u4e3a\uff1a\u52a0\u901f IP 127.0.0.1\uff0c\u52a0\u901f\u7aef\u53e3 8388\uff08\u4f60\u7684 Shadowsocks \u7aef\u53e3\uff09<\/p>\n<p>\u82e5\u4e3a\u60c5\u51b54\uff0c\u90a3\u4e48\u4f60\u7684\u52a0\u901f\u5730\u5740\u4e3a\uff1a\u52a0\u901fIP 10.10.10.10\uff08\u4f60\u7684\u670d\u52a1\u5668IP\uff09\uff0c\u52a0\u901f\u7aef\u53e38388\uff08\u4f60\u7684 Shadowsocks \u7aef\u53e3\uff09<\/p>\n<p>\u4f7f\u7528\u65b9\u6cd5\uff1a<\/p>\n<div id=\"crayon-58b92908537b4347266731\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b4347266731-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b4347266731-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b4347266731-3\">3<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537b4347266731-1\" class=\"crayon-line\"><span class=\"crayon-v\">wget<\/span> <span class=\"crayon-o\">&#8212;<\/span><span class=\"crayon-v\">no<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">check<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">certificate <\/span><span class=\"crayon-v\">https<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">raw<\/span><span class=\"crayon-e\">.githubusercontent<\/span><span class=\"crayon-e\">.com<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kuoruan<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun_installer<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">master<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-e\">.sh<\/span><\/div>\n<div id=\"crayon-58b92908537b4347266731-2\" class=\"crayon-line\"><span class=\"crayon-r\">chmod<\/span> <span class=\"crayon-o\">+<\/span><span class=\"crayon-i\">x<\/span> <span class=\"crayon-sy\">.<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-e\">.sh<\/span><\/div>\n<div id=\"crayon-58b92908537b4347266731-3\" class=\"crayon-line\"><span class=\"crayon-sy\">.<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-e\">.sh<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>1.\u8bbe\u7f6e Kcptun \u7684\u670d\u52a1\u7aef\u7aef\u53e3\uff1a<\/p>\n<div id=\"crayon-58b92908537b6314729721\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b6314729721-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b6314729721-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537b6314729721-1\" class=\"crayon-line\">\u8bf7\u8f93\u5165 <span class=\"crayon-e\">Kcptun <\/span><span class=\"crayon-i\">Server<\/span> \u7aef\u53e3 <span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">65535<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537b6314729721-2\" class=\"crayon-line\"><span class=\"crayon-sy\">(<\/span>\u9ed8\u8ba4<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">29900<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u8bf7\u8f93\u5165\u4e00\u4e2a\u672a\u88ab\u5360\u7528\u7684\u7aef\u53e3\uff0cKcptun \u8fd0\u884c\u65f6\u5c06\u4f7f\u7528\u6b64\u7aef\u53e3\u3002<\/p>\n<p>2.\u8bbe\u7f6e\u52a0\u901f\u7684 IP\uff1a<\/p>\n<div id=\"crayon-58b92908537b8762156417\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b8762156417-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537b8762156417-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537b8762156417-1\" class=\"crayon-line\">\u8bf7\u8f93\u5165\u9700\u8981\u52a0\u901f\u7684 <span class=\"crayon-i\">IP<\/span> <span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.0.0.0<\/span> <span class=\"crayon-o\">~<\/span> <span class=\"crayon-cn\">255.255.255.255<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537b8762156417-2\" class=\"crayon-line\"><span class=\"crayon-sy\">(<\/span>\u9ed8\u8ba4<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">127.0.0.1<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u586b\u5165\u4e0a\u9762\u83b7\u53d6\u5230\u7684\u52a0\u901f IP\u3002<\/p>\n<p>3.\u8bbe\u7f6e\u9700\u8981\u52a0\u901f\u7684\u7aef\u53e3\uff1a<\/p>\n<div id=\"crayon-58b92908537bb379426596\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537bb379426596-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537bb379426596-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537bb379426596-1\" class=\"crayon-line\">\u8bf7\u8f93\u5165\u9700\u8981\u52a0\u901f\u7684\u7aef\u53e3 <span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-cn\">65535<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537bb379426596-2\" class=\"crayon-line\"><span class=\"crayon-sy\">(<\/span>\u9ed8\u8ba4<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">12948<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u586b\u5165\u4e0a\u9762\u83b7\u53d6\u5230\u7684\u52a0\u901f\u7aef\u53e3\u3002<\/p>\n<p>\u7a0b\u5e8f\u4f1a\u68c0\u67e5\u5f53\u524d\u662f\u4e0d\u662f\u6709\u7a0b\u5e8f\u5360\u7528\u7740\u6b64\u7aef\u53e3\uff0c\u5982\u679c\u4f60\u7684 Shadowsocks \u6ca1\u5728\u8fd0\u884c\uff0c\u6216\u8005\u6ca1\u6709\u8f6f\u4ef6\u4f7f\u7528\u6b64\u7aef\u53e3\uff0c\u4f1a\u5f39\u51fa\u5982\u4e0b\u63d0\u793a\uff1a<\/p>\n<div id=\"crayon-58b92908537bd911345823\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537bd911345823-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537bd911345823-1\" class=\"crayon-line\">\u5f53\u524d\u6ca1\u6709\u8f6f\u4ef6\u4f7f\u7528\u6b64\u7aef\u53e3<span class=\"crayon-sy\">,<\/span> \u786e\u5b9a\u52a0\u901f\u6b64\u7aef\u53e3<span class=\"crayon-sy\">?<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">)<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u5982\u679c\u4f60\u786e\u8ba4 Shadowsocks \u8fd0\u884c\u65f6\u4f1a\u4f7f\u7528\u6b64\u7aef\u53e3\uff0c\u90a3\u4e48\u8f93\u5165 \u201cy\u201d \u56de\u8f66\u5373\u53ef\u3002<\/p>\n<p>4.\u8bbe\u7f6e Kcptun \u5bc6\u7801\uff1a<\/p>\n<div id=\"crayon-58b92908537bf993100027\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537bf993100027-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537bf993100027-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537bf993100027-1\" class=\"crayon-line\">\u8bf7\u8f93\u5165 <span class=\"crayon-i\">Kcptun<\/span> \u5bc6\u7801<span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537bf993100027-2\" class=\"crayon-line\"><span class=\"crayon-sy\">(<\/span>\u5982\u679c\u4e0d\u60f3\u4f7f\u7528\u5bc6\u7801\u8bf7\u7559\u7a7a<span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u8fd9\u5c31\u662f\u8bf4\uff0c\u4f60\u53ef\u4ee5\u4e3a Kcptun \u5355\u72ec\u8bbe\u7f6e\u4e00\u4e2a\u5bc6\u7801\uff0c\u9632\u6b62\u88ab\u4ed6\u4eba\u6076\u610f\u4f7f\u7528\u3002\u8fd9\u4e2a\u5bc6\u7801\u548c SS \u7684\u5bc6\u7801\u6ca1\u6709\u534a\u6bdb\u94b1\u5173\u7cfb\uff0c\u8bf7\u4e0d\u8981\u628a\u5b83\u4eec\u6df7\u6dc6\u4e86\u3002<\/p>\n<p>\u518d\u63d0\u4e00\u53e5\uff0cKcptun \u548c Shadowsocks \u6ca1\u6709\u4efb\u4f55\u5173\u7cfb\uff0c\u8bf7\u4e0d\u8981\u8111\u8865\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u4efb\u4f55\u8054\u7cfb\uff0cKcptun \u4f60\u53ef\u4ee5\u7406\u89e3\u4e3a\u4e00\u6b3e\u7f51\u7edc\u52a0\u901f\u8f6f\u4ef6\uff0c\u53ea\u4e0d\u8fc7\u5b83\u662f\u901a\u8fc7\u5c06 TCP \u534f\u8bae\u8f6c\u6362\u4e3a UDP \u534f\u8bae\uff0c\u7136\u540e\u518d\u901a\u8fc7\u5927\u91cf\u7684\u53d1\u9001\u6570\u636e\u5305\uff0c\u6d6a\u8d39\u4e86\u5e26\u5bbd\u4ee5\u6362\u53d6\u7f51\u901f\u7684\u63d0\u5347\u3002\u5b83\u80fd\u52a0\u901f\u6240\u6709\u4ee5 TCP \u534f\u8bae\u4f20\u8f93\u6570\u636e\u7684\u8f6f\u4ef6\uff0c\u4e0d\u5355\u5355\u662f Shadowsocks\u3002\u53ea\u662f\u5927\u5bb6\u90fd\u7528\u6765\u2026\u2026\u4f60\u61c2\u7684<\/p>\n<p>\u56de\u5230\u4e0a\u9762\u7684\u5bc6\u7801\u8bbe\u7f6e\u95ee\u9898\uff0c\u5982\u679c\u4f60\u8fd9\u91cc\u9009\u62e9\u76f4\u63a5\u56de\u8f66\uff0c\u4e5f\u5c31\u662f\u4ee3\u8868\u4f60\u4e0d\u81ea\u5b9a\u4e49\u5bc6\u7801\u3002\u4f46\u662f Kcptun \u6709\u4e00\u4e2a\u9ed8\u8ba4\u7684\u5bc6\u7801\uff0c\u8fd9\u4e2a\u5bc6\u7801\u662f\uff1a <span id=\"crayon-58b92908537c2054867770\" class=\"crayon-syntax crayon-syntax-inline crayon-syntax-inline-nowrap crayon-theme-github crayon-theme-github-inline crayon-font-consolas\"><span class=\"crayon-pre crayon-code\"><span class=\"crayon-i\">it<\/span>&#8216;<span class=\"crayon-i\">s<\/span> <span class=\"crayon-i\">a<\/span> <span class=\"crayon-v\">secrect<\/span><\/span><\/span>\u3002<\/p>\n<p>\u5982\u679c\u4f60\u8fd9\u91cc\u9009\u62e9\u4e0d\u8bbe\u7f6e\u5bc6\u7801\uff0c\u90a3\u4e48\u5ba2\u6237\u7aef\u7684\u53c2\u6570\u91cc\u8fb9\u5c31\u4e0d\u9700\u8981\u52a0 \u2013key \u8fd9\u4e00\u53c2\u6570\uff0c\u4f46\u662f Kcptun \u8fd8\u662f\u4f1a\u7528\u4e0a\u9762\u4e00\u4e2a\u5bc6\u7801\u505a\u9ed8\u8ba4\u503c\u3002<\/p>\n<p>5.\u7981\u7528\u538b\u7f29<\/p>\n<div id=\"crayon-58b92908537c4987365504\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c4987365504-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c4987365504-2\">2<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537c4987365504-1\" class=\"crayon-line\">\u662f\u5426\u7981\u7528\u6570\u636e\u538b\u7f29<span class=\"crayon-sy\">?<\/span><\/div>\n<div id=\"crayon-58b92908537c4987365504-2\" class=\"crayon-line\"><span class=\"crayon-sy\">(<\/span>\u9ed8\u8ba4<span class=\"crayon-o\">:<\/span> \u4e0d\u7981\u7528<span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">[<\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">n<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u8fd9\u4e2a\u9009\u9879\u662f\u4ec0\u4e48\u610f\u601d\u5462\uff1fKcptun \u9ed8\u8ba4\u662f\u542f\u7528\u538b\u7f29\u7684\uff0c\u5982\u679c\u4f60\u8fd9\u91cc\u8bbe\u7f6e\u4e3a y\uff0c\u4e5f\u5c31\u662f\u914d\u7f6e\u4e3a nocomp:true\uff0c\u90a3\u4e48\u5c31\u662f\u7981\u7528\u538b\u7f29\u3002<\/p>\n<p>\u8bb8\u591a\u670b\u53cb\u8fd9\u91cc\u8bbe\u7f6e\u7684\u662f\u4fdd\u6301\u9ed8\u8ba4\uff08\u542f\u7528\u538b\u7f29\uff09\uff0c\u800c\u504f\u504f\u5728\u8f6f\u4ef6\u4e4b\u4e2d\u8bbe\u7f6e\u4e3a\u7981\u7528\u538b\u7f29\uff0c\u5f53\u7136\u5c31\u8fde\u4e0d\u4e0a\u54af\u3002<\/p>\n<p>\u5176\u4ed6\u914d\u7f6e\u9879\u4e0d\u7528\u6211\u8bf4\u4e86\uff0c\u5982\u679c\u4f60\u4e86\u89e3\u5b83\u662f\u5e72\u4ec0\u4e48\u7684\uff0c\u53ef\u4ee5\u81ea\u5b9a\u4e49\u914d\u7f6e\u3002\u5982\u679c\u4e0d\u77e5\u9053\uff0c\u90a3\u4e48\u76f4\u63a5\u56de\u8f66\u4f7f\u7528\u9ed8\u8ba4\u53c2\u6570\u3002<\/p>\n<p>\u4f46\u662f\uff0c\u4f7f\u7528\u9ed8\u8ba4\u53c2\u6570\uff0c\u662f\u6709\u53ef\u80fd\u6d6a\u8d39\u5927\u91cf\u6d41\u91cf\u7684\uff0c\u4f60\u4f1a\u53d1\u73b0\u4f60\u7684\u6d41\u91cf\u50cf\u6cc4\u6d2a\u4e00\u6837\u5feb\u901f\u51cf\u5c11\uff0c\u4f60\u9700\u8981\u4f1a\u8c03\u8282\u53c2\u6570\uff0c\u5957\u7528\u5b98\u65b9\u7684\u8bf4\u660e<\/p>\n<p>\u7b80\u6613\u81ea\u6211\u8c03\u4f18\u65b9\u6cd5\uff1a<\/p>\n<ol>\n<li>\u540c\u65f6\u5728\u4e24\u7aef\u9010\u6b65\u589e\u5927 client rcvwnd \u548c server sndwnd ;<\/li>\n<li>\u5c1d\u8bd5\u4e0b\u8f7d\uff0c\u89c2\u5bdf\u5982\u679c\u5e26\u5bbd\u5229\u7528\u7387\uff08\u670d\u52a1\u5668\uff0b\u5ba2\u6237\u7aef\u4e24\u7aef\u90fd\u8981\u89c2\u5bdf\uff09\u63a5\u8fd1\u7269\u7406\u5e26\u5bbd\u5219\u505c\u6b62\uff0c\u5426\u5219\u8df3\u8f6c\u5230\u7b2c\u4e00\u6b65\u3002<\/li>\n<\/ol>\n<p>\u4efb\u4f55\u4e8b\u7269\u90fd\u662f\u6709\u4e24\u9762\u6027\u7684\uff0c\u9009\u62e9\u4e86\u901f\u5ea6\uff0c\u5c31\u53ea\u6709\u653e\u5f03\u6d41\u91cf\u3002\u90a3\u4e48\u6709\u6ca1\u6709\u65e2\u5feb\u5f97\u50cf\u706b\u7bad\uff0c\u71c3\u6599\u53c8\u7701\u5f97\u50cf\u7164\u6cb9\u706f\u7684\u65b9\u6cd5\u5462\uff1f\u5475\u5475\uff01<\/p>\n<p>\u5404\u53c2\u6570\u8be6\u7ec6\u4fe1\u606f\u8bf7\u67e5\u770b\uff1ahttps:\/\/github.com\/xtaci\/kcptun<\/p>\n<p>\u5982\u679c\u4f60\u7528\u56fd\u5185\u670d\u52a1\u5668\u5b89\u88c5\uff0c\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u4ef6\u4e0b\u8f7d\u5931\u8d25\u3002\u8fd9\u662f\u7531\u4e8e\u811a\u672c\u4f1a\u5230 Github \u4e0b\u8f7d\u6587\u4ef6\uff0c\u800c Github \u7684\u67d0\u4e9b\u4e0b\u8f7d\u5730\u5740\u5728\u56fd\u5185\u4f60\u61c2\u7684\u2026\u2026\u6240\u4ee5\u6587\u4ef6\u4e0b\u8f7d\u5931\u8d25\u771f\u4e0d\u662f\u6211\u7684\u9505\u3002<\/p>\n<p>\u5982\u679c\u5b89\u88c5\u6210\u529f\uff0c\u5e94\u8be5\u80fd\u770b\u5230\u5982\u4e0b\u8f93\u51fa\u4fe1\u606f\uff1a<\/p>\n<div id=\"crayon-58b92908537c7059850088\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-5\">5<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-7\">7<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-8\">8<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-9\">9<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-10\">10<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-11\">11<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-12\">12<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-13\">13<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-14\">14<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-15\">15<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-16\">16<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-17\">17<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-18\">18<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-19\">19<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-20\">20<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-21\">21<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-22\">22<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-23\">23<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-24\">24<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-25\">25<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-26\">26<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-27\">27<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-28\">28<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-29\">29<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-30\">30<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-31\">31<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-32\">32<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-33\">33<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-34\">34<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-35\">35<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-36\">36<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c7059850088-37\">37<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537c7059850088-1\" class=\"crayon-line\">\u606d\u559c<span class=\"crayon-sy\">,<\/span> <span class=\"crayon-i\">Kcptun<\/span> \u670d\u52a1\u7aef\u914d\u7f6e\u5b8c\u6bd5\uff01<\/div>\n<div id=\"crayon-58b92908537c7059850088-2\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-3\" class=\"crayon-line\">\u6b63\u5728\u83b7\u53d6\u5f53\u524d\u5b89\u88c5\u7684 <span class=\"crayon-i\">Kcptun<\/span> \u7248\u672c<span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-4\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-5\" class=\"crayon-line\">\u670d\u52a1\u5668<span class=\"crayon-v\">IP<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-cn\">10.10.10.10<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-6\" class=\"crayon-line\">\u7aef\u53e3<span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-cn\">29900<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-7\" class=\"crayon-line\">\u52a0\u901f\u5730\u5740<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">127.0.0.1<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-8\" class=\"crayon-line\">\u5bc6\u7801<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">123456<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-9\" class=\"crayon-line\">\u52a0\u5bc6\u65b9\u5f0f <span class=\"crayon-v\">Crypt<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-i\">salsa20<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-10\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-11\" class=\"crayon-line\">\u5f53\u524d\u5b89\u88c5\u7684 <span class=\"crayon-i\">Kcptun<\/span> \u7248\u672c\u4e3a<span class=\"crayon-o\">:<\/span> <span class=\"crayon-i\">v20160922<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-12\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-13\" class=\"crayon-line\">\u63a8\u8350\u7684\u5ba2\u6237\u7aef\u914d\u7f6e\u4e3a<span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-14\" class=\"crayon-line\"><span class=\"crayon-sy\">{<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-15\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;localaddr&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;:8388&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-16\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;remoteaddr&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;10.10.10.10:29900&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-17\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;key&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;123456&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-18\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;crypt&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;salsa20&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-19\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;mode&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;fast&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-20\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;mtu&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1350<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-21\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;sndwnd&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1024<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-22\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;rcvwnd&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1024<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-23\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;datashard&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-24\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;parityshard&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-25\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;dscp&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-26\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;conn&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-27\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;autoexpire&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">60<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-28\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;nocomp&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-t\">false<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-29\" class=\"crayon-line\"><span class=\"crayon-sy\">}<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-30\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-31\" class=\"crayon-line\">\u624b\u673a\u7aef\u53c2\u6570\u53ef\u4ee5\u4f7f\u7528\uff1a<\/div>\n<div id=\"crayon-58b92908537c7059850088-32\" class=\"crayon-line\"><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-i\">autoexpire<\/span> <span class=\"crayon-cn\">60<\/span> <span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-i\">key<\/span> <span class=\"crayon-s\">&#8220;123456&#8221;<\/span> <span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-i\">crypt<\/span> <span class=\"crayon-s\">&#8220;salsa20&#8221;<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-33\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-34\" class=\"crayon-line\">\u5176\u4ed6\u53c2\u6570\u8bf7\u81ea\u884c\u8ba1\u7b97\u6216\u8bbe\u7f6e<span class=\"crayon-sy\">,<\/span> \u8be6\u7ec6\u4fe1\u606f\u53ef\u4ee5\u67e5\u770b<span class=\"crayon-o\">:<\/span> <span class=\"crayon-v\">https<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-c\">\/\/github.com\/xtaci\/kcptun<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-35\" class=\"crayon-line\"><\/div>\n<div id=\"crayon-58b92908537c7059850088-36\" class=\"crayon-line\"><span class=\"crayon-i\">Kcptun<\/span> \u5b89\u88c5\u76ee\u5f55<span class=\"crayon-o\">:<\/span> <span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">usr<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">share<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-e\">kcptun<\/span><\/div>\n<div id=\"crayon-58b92908537c7059850088-37\" class=\"crayon-line\"><span class=\"crayon-i\">Kcptun<\/span> \u65e5\u5fd7\u6587\u4ef6\u76ee\u5f55<span class=\"crayon-o\">:<\/span> <span class=\"crayon-o\">\/<\/span><span class=\"crayon-t\">var<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">log<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-o\">\/<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u8bf7\u5c06\u4ee5\u4e0a\u7684\u63d0\u793a\u4fe1\u606f\u590d\u5236\u4fdd\u5b58\u4e0b\u6765\uff0c\u540e\u9762\u914d\u7f6e\u5ba2\u6237\u7aef\u4f1a\u7528\u5230\u8fd9\u4e9b\u63d0\u793a\u4fe1\u606f\u3002<\/p>\n<p>\u5b89\u88c5\u4e4b\u540e\uff0cKcptun \u670d\u52a1\u4ea4\u7531\u00a0Supervisor \u7ba1\u7406\u3002<\/p>\n<p>Supervisor \u76f8\u5173\u547d\u4ee4\uff1a<\/p>\n<div id=\"crayon-58b92908537c9780403676\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537c9780403676-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537c9780403676-1\" class=\"crayon-line\"><span class=\"crayon-e\">service<\/span> <span class=\"crayon-e\">supervisord<\/span> <span class=\"crayon-sy\">{<\/span><span class=\"crayon-v\">start<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">stop<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">restart<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">status<\/span><span class=\"crayon-sy\">}<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Kcptun \u76f8\u5173\u547d\u4ee4\uff1a<\/p>\n<div id=\"crayon-58b92908537cc436501232\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537cc436501232-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537cc436501232-1\" class=\"crayon-line\"><span class=\"crayon-e\">supervisorctl<\/span> <span class=\"crayon-sy\">{<\/span><span class=\"crayon-v\">start<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">stop<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">restart<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">status<\/span><span class=\"crayon-sy\">}<\/span> <span class=\"crayon-v\">kcptun<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Supervisor \u542f\u52a8\u7684\u65f6\u5019\u4f1a\u540c\u65f6\u542f\u52a8 Kcptun\uff0c\u8fd0\u884c kcptun \u76f8\u5173\u547d\u4ee4\u65f6\u5148\u786e\u4fdd\u00a0Supervisor \u5df2\u542f\u52a8\u3002<\/p>\n<p>\u624b\u52a8\u914d\u7f6e\u7684\u65b9\u6cd5\u8bf7\u770b\u8fd9\u91cc\uff1a<a href=\"https:\/\/blog.kuoruan.com\/102.html\" target=\"_blank\" rel=\"noopener noreferrer\">\u5c0f\u5185\u5b58\u798f\u97f3\uff0cKcptun Shadowsocks\u52a0\u901f\u65b9\u6848<\/a><\/p>\n<h2>\u5ba2\u6237\u7aef\u914d\u7f6e<\/h2>\n<p>1.\u5148\u5230\u4e0b\u8f7d\u4e00\u4e2a\u542f\u52a8 Kcptun \u7684\u5de5\u5177\u3002\u8bf7\u6ce8\u610f\uff0c\u8fd9\u53ea\u662f\u7528\u6765\u542f\u52a8 Kcptun \u7684\u5de5\u5177\uff0c\u800c\u4e0d\u662f Kcptun \u5ba2\u6237\u7aef\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/dfdragon\/kcptun_gclient\/releases\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\">https:\/\/github.com\/dfdragon\/kcptun_gclient\/releases<\/a><\/p>\n<p>2.\u7136\u540e\u4e0b\u8f7d\u670d\u52a1\u7aef\u5bf9\u5e94\u7248\u672c\u7684 Kcptun\uff08\u4fdd\u5b58\u4e0b\u6765\u7684\u63d0\u793a\u4fe1\u606f\u91cc\u6709\uff09\uff1a<\/p>\n<div id=\"crayon-58b92908537ce266204486\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537ce266204486-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537ce266204486-1\" class=\"crayon-line\">\u5f53\u524d\u5b89\u88c5\u7684 <span class=\"crayon-i\">Kcptun<\/span> \u7248\u672c\u4e3a<span class=\"crayon-o\">:<\/span> <span class=\"crayon-v\">v20160922<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/xtaci\/kcptun\/releases\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\">https:\/\/github.com\/xtaci\/kcptun\/releases<\/a><\/p>\n<p>32\u4f4d\u7cfb\u7edf\u4e0b\u8f7d\uff1akcptun-windows-386-20160922.tar.gz<\/p>\n<p>64\u4f4d\u7cfb\u7edf\u4e0b\u8f7d\uff1akcptun-windows-amd64-20160922.tar.gz<\/p>\n<p>\u6ce8\u610f\u770b\u7ea2\u5b57\u7684\u7248\u672c\u53f7\u548c\u670d\u52a1\u7aef\u7248\u672c\u4e00\u81f4\u3002\u7136\u540e\u5c06\u5b83\u4eec\u89e3\u538b\u5230\u4e00\u8d77\uff1a<\/p>\n<div id=\"crayon-58b92908537d0071000549\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d0071000549-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d0071000549-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d0071000549-3\">3<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537d0071000549-1\" class=\"crayon-line\"><span class=\"crayon-v\">kcptun_gclient<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">exe<\/span> <span class=\"crayon-o\">&#8212;<\/span> <span class=\"crayon-i\">Kcptun<\/span> \u542f\u52a8\u5de5\u5177<\/div>\n<div id=\"crayon-58b92908537d0071000549-2\" class=\"crayon-line\"><span class=\"crayon-v\">client_windows_amd64<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">exe<\/span> <span class=\"crayon-o\">&#8212;<\/span> <span class=\"crayon-i\">Kcptun<\/span> \u5ba2\u6237\u7aef\u7a0b\u5e8f<\/div>\n<div id=\"crayon-58b92908537d0071000549-3\" class=\"crayon-line\"><span class=\"crayon-v\">server_windows_amd64<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">exe<\/span> <span class=\"crayon-o\">&#8212;<\/span> <span class=\"crayon-i\">Kcptun<\/span> \u670d\u52a1\u7aef\u7a0b\u5e8f<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u6253\u5f00\u00a0Kcptun \u542f\u52a8\u5de5\u5177\uff0c\u754c\u9762\u5982\u4e0b\uff0c\u8bf7\u6309\u5e8f\u53f7\u64cd\u4f5c\u3002<\/p>\n<p><a href=\"https:\/\/blog.kuoruan.com\/wp-content\/uploads\/2016\/08\/Kcptun_GUI_config.png\" target=\"_blank\" data-lightbox=\"image_lg\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-385\" title=\"[v16]Kcptun \u670d\u52a1\u7aef\u4e00\u952e\u5b89\u88c5\u811a\u672c,\u559c\u95fb\u4e50\u89c1\u7684\u591a\u7528\u6237\u652f\u6301 - \u7b2c1\u5f20 | \u6269\u8f6f\u535a\u5ba2\" src=\"https:\/\/blog.kuoruan.com\/wp-content\/uploads\/2016\/08\/Kcptun_GUI_config-550x330.png\" alt=\"[v16]Kcptun \u670d\u52a1\u7aef\u4e00\u952e\u5b89\u88c5\u811a\u672c,\u559c\u95fb\u4e50\u89c1\u7684\u591a\u7528\u6237\u652f\u6301 - \u7b2c1\u5f20 | \u6269\u8f6f\u535a\u5ba2\" width=\"550\" height=\"330\" data-src=\"https:\/\/blog.kuoruan.com\/wp-content\/uploads\/2016\/08\/Kcptun_GUI_config-550x330.png\" \/><\/a><\/p>\n<p>1.\u76f4\u63a5\u5bfc\u5165\u914d\u7f6e\u6587\u4ef6<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u5c06\u63a8\u8350\u53c2\u6570\u4fdd\u5b58\u4e3a\u6587\u4ef6\uff0c\u627e\u5230\u5982\u4e0b\u8fd9\u90e8\u5206\uff1a<\/p>\n<div id=\"crayon-58b92908537d2158292064\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-5\">5<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-7\">7<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-8\">8<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-9\">9<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-10\">10<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-11\">11<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-12\">12<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-13\">13<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-14\">14<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-15\">15<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d2158292064-16\">16<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537d2158292064-1\" class=\"crayon-line\"><span class=\"crayon-sy\">{<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-2\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;localaddr&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;:8388&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-3\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;remoteaddr&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;10.10.10.10:29900&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-4\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;key&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;123456&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-5\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;crypt&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;salsa20&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-6\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;mode&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">&#8220;fast&#8221;<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-7\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;mtu&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1350<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-8\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;sndwnd&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1024<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-9\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;rcvwnd&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1024<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-10\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;datashard&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">10<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-11\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;parityshard&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-12\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;dscp&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-13\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;conn&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-14\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;autoexpire&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">60<\/span><span class=\"crayon-sy\">,<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-15\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-s\">&#8220;nocomp&#8221;<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-t\">false<\/span><\/div>\n<div id=\"crayon-58b92908537d2158292064-16\" class=\"crayon-line\"><span class=\"crayon-sy\">}<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u65b0\u5efa\u4e00\u4e2a\u8bb0\u4e8b\u672c\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u968f\u610f\uff08\u6bd4\u5982 config.txt \u6216\u8005 config.json\uff09\uff0c\u7136\u540e\u5c06\u4e0a\u9762\u5927\u62ec\u53f7\u91cc\u7684\u5185\u5bb9\u590d\u5236\u5230\u6587\u4ef6\u91cc\u8fb9\uff08\u5305\u62ec\u5927\u62ec\u53f7\uff09\uff0c\u786e\u4fdd\u5b83\u662f\u6807\u51c6\u7684 json \u683c\u5f0f\uff08\u53ef\u4ee5\u5230\u8fd9\u91cc\u6821\u9a8c\u683c\u5f0f \u00a0<a href=\"http:\/\/www.json.cn\/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\">http:\/\/www.json.cn\/<\/a>\uff09\u3002<\/p>\n<p>\u7136\u540e\u52fe\u9009\u201c\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u201d\uff0c\u9009\u62e9\u4f60\u65b0\u5efa\u7684\u6587\u4ef6\u5373\u53ef\uff0c\u4e0b\u9762\u7684\u53c2\u6570\u533a\u57df\u76f4\u63a5\u7559\u7a7a\uff0c\u70b9\u51fb\u542f\u52a8\u3002<\/p>\n<p>2.\u624b\u52a8\u914d\u7f6e\u53c2\u6570<\/p>\n<p>\u624b\u52a8\u914d\u7f6e\u7684\u65f6\u5019\u53ea\u9700\u8981\u770b\u4fdd\u5b58\u4e0b\u6765\u7684\u63d0\u793a\u4fe1\u606f\u4e0a\u9762\u4e00\u90e8\u5206\uff08\u6709\u6807\u7ea2\u90e8\u5206\uff0c\u975e\u5e38\u663e\u773c\uff09\uff1a<\/p>\n<div id=\"crayon-58b92908537d5815854991\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d5815854991-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d5815854991-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d5815854991-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d5815854991-4\">4<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537d5815854991-1\" class=\"crayon-line\">\u670d\u52a1\u5668<span class=\"crayon-v\">IP<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-cn\">10.10.10.10<\/span><\/div>\n<div id=\"crayon-58b92908537d5815854991-2\" class=\"crayon-line\">\u7aef\u53e3<span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-cn\">29900<\/span><\/div>\n<div id=\"crayon-58b92908537d5815854991-3\" class=\"crayon-line\">\u52a0\u901f\u5730\u5740<span class=\"crayon-o\">:<\/span> <span class=\"crayon-cn\">127.0.0.1<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">8388<\/span><\/div>\n<div id=\"crayon-58b92908537d5815854991-4\" class=\"crayon-line\">\u52a0\u5bc6\u65b9\u5f0f <span class=\"crayon-v\">Crypt<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-v\">salsa20<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u4e3a\u4e86\u89c4\u907f\u9519\u8bef\uff0c\u9075\u5faa\u8f83\u5c11\u914d\u7f6e\u539f\u5219\uff0c\u5728\u914d\u7f6e\u670d\u52a1\u7aef\u65f6\u6ca1\u6709\u4fee\u6539\u8fc7\u7684\u9009\u9879\u90fd\u4e0d\u9700\u8981\u914d\u7f6e\u3002\u914d\u7f6e\u5b8c\u6bd5\uff0c\u70b9\u51fb\u542f\u52a8\u3002<\/p>\n<p>\u51e0\u9879\u8bf4\u660e\uff1a<\/p>\n<ol>\n<li>\u672c\u5730\u76d1\u542c\u7aef\u53e3\uff0c\u8fd9\u4e2a\u7aef\u53e3\u4f60\u53ef\u4ee5\u968f\u610f\u8bbe\u7f6e\uff0c\u4e0d\u662f\u5fc5\u987b\u8bbe\u7f6e\u4e3a Shadowsocsk \u7684\u7aef\u53e3\uff1b<\/li>\n<li>KCP\u670d\u52a1\u5668\u5730\u5740\u4e3a\u4f60\u7684\u670d\u52a1\u5668IP\u5730\u5740\uff0c\u4e0d\u662f 127.0.0.1\uff0c\u7aef\u53e3\u4e3a\u670d\u52a1\u7aef\u00a0Kcptun \u7684\u7aef\u53e3\uff1b<\/li>\n<li>\u5982\u679c\u4f60\u60f3\u4f7f\u7528IPv6\u534f\u8bae\uff0c\u5728\u586b\u5199\u670d\u52a1\u5668IP\u5730\u5740\u7684\u65f6\u5019\u9700\u8981\u7528 [] \u5c06IPv6\u5730\u5740\u62ec\u8d77\u6765\uff0c\u5982\uff1a[2000:0:0:0:0:0:0:1]\uff1b<\/li>\n<li>\u901a\u4fe1\u5bc6\u94a5\u662f\u4f60\u914d\u7f6e\u7684 Kcptun \u5bc6\u7801\uff0c\u4e0d\u662f Shadowsocks \u7684\u5bc6\u7801\uff1b\u5728\u914d\u7f6e Kcptun \u7684\u65f6\u5019\uff0c\u4e0d\u7528\u7ba1\u00a0Shadowsocks \u7684\u914d\u7f6e\u53c2\u6570\uff1b<\/li>\n<li>\u53c2\u6570\u533a\u914d\u7f6e\u7684\u65f6\u5019\uff0c\u53ea\u9700\u8981\u914d\u7f6e\u4f60\u4fee\u6539\u8fc7\u7684\u90e8\u5206\u5c31\u884c\u4e86\uff0c\u5176\u4ed6\u90e8\u5206\u90fd\u4e0d\u7528\u6539\uff0c\u9664\u975e\u4f60\u4e86\u89e3\u6bcf\u9879\u53c2\u6570\u7684\u610f\u4e49\uff1b<\/li>\n<li>\u65e5\u5fd7\u533a\u975e\u5e38\u91cd\u8981\uff0c\u5728\u6392\u67e5\u95ee\u9898\u7684\u65f6\u5019\uff0c\u8fd9\u662f\u5fc5\u770b\u90e8\u5206\uff1b<\/li>\n<li>\u53f3\u4e0b\u89d2\u4e3a Kcptun \u6700\u4f4e\u9700\u6c42\u7248\u672c\uff0c\u66f4\u65b0\u670d\u52a1\u7aef\u4e4b\u540e\uff0c\u4e5f\u9700\u8981\u66f4\u65b0\u672c\u5730\u5ba2\u6237\u7aef\uff0c\u53ea\u9700\u8981\u66ff\u6362\u5ba2\u6237\u7aef\u6587\u4ef6\u5373\u53ef\u3002<\/li>\n<\/ol>\n<h2>Shadowsocks \u914d\u7f6e<\/h2>\n<p>\u5728 Shadowsocks \u5ba2\u6237\u7aef\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u9009\u9879\uff0c\u670d\u52a1\u5668IP\u56fa\u5b9a\u586b\u5199 127.0.0.1\uff0c\u670d\u52a1\u5668\u7aef\u53e3\u586b\u5199 Kcptun \u542f\u52a8\u5de5\u5177\u4e2d\u914d\u7f6e\u7684\u201c\u672c\u5730\u76d1\u542c\u7aef\u53e3\u201d\uff08\u5373\u8fd9\u91cc\u7684 8388\uff09\uff0c\u5bc6\u7801\u548c\u52a0\u5bc6\u914d\u7f6e\u7684\u662f Shadowsocks \u7684\u5bc6\u7801\u548c\u52a0\u5bc6\u3002<\/p>\n<p>\u57fa\u672c\u539f\u5219\uff0c\u914d\u7f6e Kcptun \u7684\u65f6\u5019\u4e0d\u7528\u7ba1 Shadowsocks \u7684\u53c2\u6570\uff0c\u914d\u7f6e Shadowsocks \u7684\u65f6\u5019\u4e0d\u7528\u7ba1 Kcptun \u7684\u53c2\u6570\uff0c\u522b\u628a\u5b83\u4eec\u7684\u914d\u7f6e\u53c2\u6570\u641e\u6df7\u4e86\u3002<\/p>\n<p>\u5c06\u4ee3\u7406\u5207\u6362\u5230\u65b0\u5efa\u7684\u9009\u9879\u4e0a\uff0c\u5c1d\u8bd5\u8bbf\u95ee\u3002\u67e5\u770b Kcptun \u542f\u52a8\u5de5\u5177\u4e2d\u7684\u65e5\u5fd7\u533a\uff0c\u4f1a\u6709\u5927\u91cf\u7684\u5982\u4e0b\u4fe1\u606f\u8f93\u51fa\uff1a<\/p>\n<div id=\"crayon-58b92908537d7990675549\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-5\">5<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d7990675549-7\">7<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537d7990675549-1\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">15<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">closed<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-2\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">15<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">opened<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-3\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">17<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">closed<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-4\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">17<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">closed<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-5\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">18<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">closed<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-6\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">19<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-i\">opened<\/span><\/div>\n<div id=\"crayon-58b92908537d7990675549-7\" class=\"crayon-line\"><span class=\"crayon-cn\">2016<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">09<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-cn\">24<\/span> <span class=\"crayon-cn\">11<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">57<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-cn\">19<\/span> <span class=\"crayon-e\">stream <\/span><span class=\"crayon-v\">closed<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u518d\u7528 shelll \u770b\u770b\u670d\u52a1\u7aef\u65e5\u5fd7\uff0c\u5982\u679c\u6709\u76f8\u540c\u7684\u4fe1\u606f\u8f93\u51fa\uff0c\u8bf4\u660e\u914d\u7f6e\u6b63\u786e\uff0c\u5e76\u80fd\u6b63\u5e38\u4f7f\u7528\u3002\u67e5\u770b\u670d\u52a1\u7aef\u65e5\u5fd7\u4f7f\u7528\uff1a<\/p>\n<div id=\"crayon-58b92908537d9347855730\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537d9347855730-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537d9347855730-1\" class=\"crayon-line\"><span class=\"crayon-sy\">.<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">sh <\/span><span class=\"crayon-v\">log<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Android \u7aef\u8bf7\u770b\u8fd9\u91cc\uff1a<a href=\"https:\/\/blog.kuoruan.com\/111.html\" target=\"_blank\" rel=\"noopener noreferrer\">Shadowsocks-Android\u5ba2\u6237\u7aef\u4e0a\u7684KCP\u914d\u7f6e\u8bf4\u660e<\/a><\/p>\n<p>OpenWrt \u4e0a\u4f7f\u7528\uff1a<a href=\"https:\/\/blog.kuoruan.com\/113.html\" target=\"_blank\" rel=\"noopener noreferrer\">OpenWrt\u5e73\u53f0Kcptun Web\u7ba1\u7406\u754c\u9762<\/a><\/p>\n<h2>\u5173\u4e8e\u5b89\u88c5\u9519\u8bef<\/h2>\n<p>\u5f88\u591a\u670b\u53cb\u53d1\u90ae\u4ef6\u544a\u8bc9\u6211\u8bf4\u51fa\u73b0\u4e86\u5b89\u88c5\u9519\u8bef\uff0c\u9519\u8bef\u65e5\u5fd7\u5982\u4e0b\uff1a<\/p>\n<div id=\"crayon-58b92908537db007828719\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-5\">5<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537db007828719-6\">6<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537db007828719-1\" class=\"crayon-line\"><span class=\"crayon-e\">Traceback<\/span> <span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">most <\/span><span class=\"crayon-e\">recent <\/span><span class=\"crayon-e\">call <\/span><span class=\"crayon-v\">last<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537db007828719-2\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-i\">File<\/span> <span class=\"crayon-s\">&#8220;\/usr\/bin\/easy_install&#8221;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-i\">line<\/span> <span class=\"crayon-cn\">5<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-st\">in<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">module<\/span><span class=\"crayon-o\">&gt;<\/span><\/div>\n<div id=\"crayon-58b92908537db007828719-3\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">pkg_resources <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">load_entry_point<\/span><\/div>\n<div id=\"crayon-58b92908537db007828719-4\" class=\"crayon-line\"><span class=\"crayon-e\">\u00a0\u00a0<\/span><span class=\"crayon-i\">File<\/span> <span class=\"crayon-s\">&#8220;build\/bdist.linux-x86_64\/egg\/pkg_resources.py&#8221;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-i\">line<\/span> <span class=\"crayon-cn\">2565<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-st\">in<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">module<\/span><span class=\"crayon-o\">&gt;<\/span><\/div>\n<div id=\"crayon-58b92908537db007828719-5\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-i\">File<\/span> <span class=\"crayon-s\">&#8220;build\/bdist.linux-x86_64\/egg\/pkg_resources.py&#8221;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-i\">line<\/span> <span class=\"crayon-cn\">519<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-st\">in<\/span> <span class=\"crayon-e\">resolve<\/span><\/div>\n<div id=\"crayon-58b92908537db007828719-6\" class=\"crayon-line\"><span class=\"crayon-v\">pkg_resources<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">DistributionNotFound<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-v\">distribute<\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-cn\">0.6.10<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u800c\u4f46\u51e1\u51fa\u73b0\u8fd9\u79cd\u9519\u8bef\u7684\u90fd\u662f\u51fa\u4e8e\u67d0\u79cd\u76ee\u7684\uff0c\u81ea\u5df1\u5347\u7ea7\u4e86 python \u7248\u672c\uff0c\u4f46\u662f\u53c8\u6ca1\u5904\u7406\u597d\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u624b\u52a8\u505a\u4e00\u4e2a\u8f6f\u94fe\u63a5\uff1a<\/p>\n<div id=\"crayon-58b92908537de407636678\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537de407636678-1\">1<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537de407636678-1\" class=\"crayon-line\"><span class=\"crayon-v\">ln<\/span> <span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-v\">s<\/span> <span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">usr<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">local<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">python2<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-cn\">7<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">bin<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">easy_install<\/span> <span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">usr<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">bin<\/span><span class=\"crayon-o\">\/<\/span><span class=\"crayon-v\">easy_install<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u6ce8\uff1a\u5176\u4e2d\u7684 \/usr\/local\/python2.7\u00a0\u5e94\u8be5\u4e3a\u4f60\u5b89\u88c5\u7684\u65b0\u7248 python \u7684\u8def\u5f84\u3002<\/p>\n<h2>\u5176\u4ed6\u8bf4\u660e<\/h2>\n<div id=\"crayon-58b92908537e0570758762\" class=\"crayon-syntax crayon-theme-github crayon-font-consolas crayon-os-mac print-yes notranslate crayon-wrapped\" data-settings=\" no-popup minimize scroll-always disable-anim wrap\">\n<div class=\"crayon-plain-wrap\"><\/div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-nums \" data-settings=\"show\">\n<div class=\"crayon-nums-content\">\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-1\">1<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-2\">2<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-3\">3<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-4\">4<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-5\">5<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-6\">6<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-7\">7<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-8\">8<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-9\">9<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-10\">10<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-11\">11<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-12\">12<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-13\">13<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-14\">14<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-15\">15<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-16\">16<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-17\">17<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-18\">18<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-19\">19<\/div>\n<div class=\"crayon-num\" data-line=\"crayon-58b92908537e0570758762-20\">20<\/div>\n<\/div>\n<\/td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-58b92908537e0570758762-1\" class=\"crayon-line\">\u8bf7\u4f7f\u7528<span class=\"crayon-o\">:<\/span> <span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">sh<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">option<\/span><span class=\"crayon-o\">&gt;<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-2\" class=\"crayon-line\">\u53ef\u4f7f\u7528\u7684\u53c2\u6570 <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">option<\/span><span class=\"crayon-o\">&gt;<\/span> \u5305\u62ec<span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-3\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">install<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\u5b89\u88c5<\/div>\n<div id=\"crayon-58b92908537e0570758762-4\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">uninstall<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\u5378\u8f7d<\/div>\n<div id=\"crayon-58b92908537e0570758762-5\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">update<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>\u68c0\u67e5\u66f4\u65b0<\/div>\n<div id=\"crayon-58b92908537e0570758762-6\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">manual<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>\u81ea\u5b9a\u4e49 <span class=\"crayon-i\">Kcptun<\/span> \u7248\u672c\u5b89\u88c5<\/div>\n<div id=\"crayon-58b92908537e0570758762-7\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">help<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>\u67e5\u770b\u811a\u672c\u4f7f\u7528\u8bf4\u660e<\/div>\n<div id=\"crayon-58b92908537e0570758762-8\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">add<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\u6dfb\u52a0\u4e00\u4e2a\u5b9e\u4f8b<span class=\"crayon-sy\">,<\/span> \u591a\u7528\u6237\u4f7f\u7528<\/div>\n<div id=\"crayon-58b92908537e0570758762-9\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">reconfig<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span>\u91cd\u65b0\u914d\u7f6e\u5b9e\u4f8b<\/div>\n<div id=\"crayon-58b92908537e0570758762-10\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">show<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\u663e\u793a\u5b9e\u4f8b\u8be6\u7ec6\u914d\u7f6e<\/div>\n<div id=\"crayon-58b92908537e0570758762-11\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">log<\/span> <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span>\u663e\u793a\u5b9e\u4f8b\u65e5\u5fd7<\/div>\n<div id=\"crayon-58b92908537e0570758762-12\" class=\"crayon-line\">\u6ce8<span class=\"crayon-o\">:<\/span> \u4e0a\u8ff0\u53c2\u6570\u4e2d\u7684 <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-o\">&gt;<\/span> \u53ef\u9009<span class=\"crayon-sy\">,<\/span> \u4ee3\u8868\u7684\u662f\u5b9e\u4f8b\u7684\u5e8f\u53f7<\/div>\n<div id=\"crayon-58b92908537e0570758762-13\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span>\u53ef\u4f7f\u7528 <span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-cn\">2<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-cn\">3<\/span> <span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span> \u5206\u522b\u5bf9\u5e94 <span class=\"crayon-v\">kcptun<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">kcptun2<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-i\">kcptun3<\/span> <span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-14\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span>\u82e5\u4e0d\u6307\u5b9a <span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-v\">id<\/span><span class=\"crayon-o\">&gt;<\/span><span class=\"crayon-sy\">,<\/span> \u5219\u9ed8\u8ba4\u4e3a <span class=\"crayon-cn\">1<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-15\" class=\"crayon-line\"><span class=\"crayon-i\">Supervisor<\/span> \u547d\u4ee4<span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-16\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">service<\/span> <span class=\"crayon-e\">supervisord<\/span> <span class=\"crayon-sy\">{<\/span><span class=\"crayon-v\">start<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">stop<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">restart<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">status<\/span><span class=\"crayon-sy\">}<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-17\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span>\u542f\u52a8<span class=\"crayon-o\">|<\/span>\u5173\u95ed<span class=\"crayon-o\">|<\/span>\u91cd\u542f<span class=\"crayon-o\">|<\/span>\u67e5\u770b\u72b6\u6001<span class=\"crayon-sy\">}<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-18\" class=\"crayon-line\"><span class=\"crayon-i\">Kcptun<\/span> \u76f8\u5173\u547d\u4ee4<span class=\"crayon-o\">:<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-19\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">supervisorctl<\/span> <span class=\"crayon-sy\">{<\/span><span class=\"crayon-v\">start<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">stop<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">restart<\/span><span class=\"crayon-o\">|<\/span><span class=\"crayon-v\">status<\/span><span class=\"crayon-sy\">}<\/span> <span class=\"crayon-e\">kcptun<\/span><span class=\"crayon-o\">&lt;<\/span><span class=\"crayon-e\">id<\/span><span class=\"crayon-o\">&gt;<\/span><\/div>\n<div id=\"crayon-58b92908537e0570758762-20\" class=\"crayon-line\"><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">{<\/span>\u542f\u52a8<span class=\"crayon-o\">|<\/span>\u5173\u95ed<span class=\"crayon-o\">|<\/span>\u91cd\u542f<span class=\"crayon-o\">|<\/span>\u67e5\u770b\u72b6\u6001<span class=\"crayon-sy\">}<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<h1><span style=\"color: #ff0000;\">kcptun.sh \u6e90\u7801<\/span><\/h1>\n<pre>#!\/bin\/bash\n\n: &lt;&lt;-'EOF'\nCopyright 2016 Xingwang Liao &lt;kuoruan@gmail.com&gt;\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n\thttp:\/\/www.apache.org\/licenses\/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\nEOF\n\nPATH=\/bin:\/sbin:\/usr\/bin:\/usr\/sbin:\/usr\/local\/bin:\/usr\/local\/sbin:~\/bin\nexport PATH\n\n## \u5b9a\u4e49\u5e38\u91cf\n\nSHELL_VERSION=16\nCONFIG_VERSION=5\nINIT_VERSION=3\n\nCUR_DIR=`pwd` # \u5f53\u524d\u76ee\u5f55\nKCPTUN_INSTALL_DIR=\/usr\/share\/kcptun # kcptun \u9ed8\u8ba4\u5b89\u88c5\u76ee\u5f55\nKCPTUN_LOG_DIR=\/var\/log\/kcptun # kcptun \u65e5\u5fd7\u76ee\u5f55\nKCPTUN_RELEASES_URL=\"https:\/\/api.github.com\/repos\/xtaci\/kcptun\/releases\"\nKCPTUN_TAGS_URL=\"https:\/\/github.com\/xtaci\/kcptun\/tags\"\nSHELL_VERSION_INFO_URL=\"https:\/\/raw.githubusercontent.com\/kuoruan\/kcptun_installer\/master\/kcptun.json\"\nJQ_LINUX32=\"https:\/\/github.com\/stedolan\/jq\/releases\/download\/jq-1.5\/jq-linux32\"\nJQ_LINUX64=\"https:\/\/github.com\/stedolan\/jq\/releases\/download\/jq-1.5\/jq-linux64\"\nJQ=\/usr\/bin\/jq\n\n## \u53c2\u6570\u9ed8\u8ba4\u503c\n# associative array\ndeclare -Ar DEFAULT=(\n\t[LISTEN]=29900\n\t[TARGET_IP]=\"127.0.0.1\"\n\t[TARGET_PORT]=12948\n\t[KEY]=\"it's a secrect\"\n\t[CRYPT]=\"aes\"\n\t[MODE]=\"fast\"\n\t[MTU]=1350\n\t[SNDWND]=1024\n\t[RCVWND]=1024\n\t[DATASHARD]=10\n\t[PARITYSHARD]=3\n\t[DSCP]=0\n\t[NOCOMP]=false\n\t[NODELAY]=0\n\t[INTERVAL]=20\n\t[RESEND]=2\n\t[NC]=1\n\t[ACKNODELAY]=false\n\t[SOCKBUF]=4194304\n\t[KEEPALIVE]=10\n\t[RUN_USER]=\"root\"\n)\n\ndeclare -ar CRYPTS=(\n\t\"aes\"\n\t\"aes-128\"\n\t\"aes-192\"\n\t\"salsa20\"\n\t\"blowfish\"\n\t\"twofish\"\n\t\"cast5\"\n\t\"3des\"\n\t\"tea\"\n\t\"xtea\"\n\t\"xor\"\n\t\"none\"\n)\n\ndeclare -ar MODES=(\n\t\"normal\"\n\t\"fast\"\n\t\"fast2\"\n\t\"fast3\"\n\t\"manual\"\n)\n\n# \u521d\u59cb\u5316\u53c2\u6570\nlisten_port=${DEFAULT[LISTEN]}\ntarget_ip=${DEFAULT[TARGET_IP]}\ntarget_port=${DEFAULT[TARGET_PORT]}\nkey=${DEFAULT[KEY]}\ncrypt=${DEFAULT[CRYPT]}\nmode=${DEFAULT[MODE]}\nmtu=${DEFAULT[MTU]}\nsndwnd=${DEFAULT[SNDWND]}\nrcvwnd=${DEFAULT[RCVWND]}\ndatashard=${DEFAULT[DATASHARD]}\nparityshard=${DEFAULT[PARITYSHARD]}\ndscp=${DEFAULT[DSCP]}\nnocomp=${DEFAULT[NOCOMP]}\nnodelay=${DEFAULT[NODELAY]}\ninterval=${DEFAULT[INTERVAL]}\nresend=${DEFAULT[RESEND]}\nnc=${DEFAULT[NC]}\nacknodelay=${DEFAULT[ACKNODELAY]}\nsockbuf=${DEFAULT[SOCKBUF]}\nkeepalive=${DEFAULT[KEEPALIVE]}\nrun_user=${DEFAULT[RUN_USER]}\n\ncurrent_id=\"\"\n\nclear\n\ncat &gt;&amp;2 &lt;&lt;-'EOF'\n#########################################################\n# Kcptun \u670d\u52a1\u7aef\u4e00\u952e\u5b89\u88c5\u811a\u672c                             #\n# \u8be5\u811a\u672c\u652f\u6301 Kcptun \u670d\u52a1\u7aef\u7684\u5b89\u88c5\u3001\u66f4\u65b0\u3001\u5378\u8f7d\u53ca\u914d\u7f6e      #\n# \u811a\u672c\u4f5c\u8005: Index &lt;kuoruan@gmail.com&gt;                   #\n# \u4f5c\u8005\u535a\u5ba2: https:\/\/blog.kuoruan.com\/                   #\n# Github: https:\/\/github.com\/kuoruan\/kcptun_installer   #\n# QQ\u4ea4\u6d41\u7fa4: 43391448, 68133628                          #\n#########################################################\nEOF\n\n# \u68c0\u67e5\u547d\u4ee4\u662f\u5426\u5b58\u5728\ncommand_exists() {\n\tcommand -v \"$@\" &gt;\/dev\/null 2&gt;&amp;1\n}\n\n# \u68c0\u67e5\u53d8\u91cf\u662f\u5426\u4e3a\u6570\u5b57\nis_number() {\n\texpr $1 + 1 &gt;\/dev\/null 2&gt;&amp;1\n}\n\n# \u83b7\u53d6\u5b9e\u4f8b\u6570\u91cf\nget_instance_count() {\n\tls -l \/etc\/supervisor\/conf.d\/ | grep \"^-\" | awk '{print $9}' | grep -cP \"^kcptun\\d*\\.conf$\"\n}\n\n# \u83b7\u53d6\u5f53\u524d\u914d\u7f6e\u6587\u4ef6\nget_current_config_file() {\n\techo \"${KCPTUN_INSTALL_DIR}\/server-config${current_id}.json\"\n}\n\n# \u83b7\u53d6\u5f53\u524d\u65e5\u5fd7\u6587\u4ef6\nget_current_log_file() {\n\techo \"${KCPTUN_LOG_DIR}\/server${current_id}.log\"\n}\n\n# \u83b7\u53d6\u5f53\u524d\u5b9e\u4f8b\u7684 Supervisor \u914d\u7f6e\u6587\u4ef6\nget_current_supervisor_config_file() {\n\techo \"\/etc\/supervisor\/conf.d\/kcptun\"${current_id}\".conf\"\n}\n\n# \u83b7\u53d6\u5f53\u524d\u76d1\u542c\u7aef\u53e3\nget_current_listen_port() {\n\tlocal config_file=\"$(get_current_config_file)\"\n\n\tif [ -f \"$config_file\" ]; then\n\t\tlocal listen=$($JQ -r \".listen\" \"$config_file\")\n\t\tlocal current_listen_port=$(cut -d ':' -f2 &lt;&lt;&lt; \"$listen\")\n\n\t\tif [ -n \"$current_listen_port\" ] &amp;&amp; is_number $current_listen_port; then\n\t\t\techo \"$current_listen_port\"\n\t\tfi\n\tfi\n}\n\n# \u68c0\u67e5\u5f53\u524d\u7528\u6237\u662f\u5426\u62e5\u6709\u7ba1\u7406\u5458\u6743\u9650\npermission_check() {\n\tif [ $EUID -ne 0 ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u6743\u9650\u9519\u8bef, \u8bf7\u4f7f\u7528 root \u7528\u6237\u8fd0\u884c\u6b64\u811a\u672c!\n\t\tEOF\n\t\texit 1\n\tfi\n}\n\n# \u68c0\u67e5\u5e76\u83b7\u53d6\u7cfb\u7edf\u4fe1\u606f\nlinux_check() {\n\tif $(grep -qi \"CentOS\" \/etc\/issue) || $(grep -q \"CentOS\" \/etc\/*-release); then\n\t\tOS=\"CentOS\"\n\telif $(grep -qi \"Ubuntu\" \/etc\/issue) || $(grep -q \"Ubuntu\" \/etc\/*-release); then\n\t\tOS=\"Ubuntu\"\n\telif $(grep -qi \"Debian\" \/etc\/issue) || $(grep -q \"Debian\" \/etc\/*-release); then\n\t\tOS=\"Debian\"\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672c\u811a\u672c\u4ec5\u652f\u6301 CentOS 6+, Debian 7+ \u6216\u8005 Ubuntu 12+, \u5176\u4ed6\u7cfb\u7edf\u8bf7\u5411\u811a\u672c\u4f5c\u8005\u53cd\u9988\u4ee5\u5bfb\u6c42\u652f\u6301!\n\t\tEOF\n\t\texit 1\n\tfi\n\n\tOS_VSRSION=$(grep -oEh \"[0-9]+\" \/etc\/*-release | head -n 1) || {\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u65e0\u6cd5\u83b7\u53d6\u64cd\u4f5c\u7cfb\u7edf\u7248\u672c, \u8bf7\u8054\u7cfb\u811a\u672c\u4f5c\u8005\u53cd\u9988\u9519\u8bef!\n\t\tEOF\n\t\texit 1\n\t}\n\n\tif [ \"$OS\" = \"CentOS\" -a $OS_VSRSION -lt 6 ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u6682\u4e0d\u652f\u6301 CentOS 6 \u4ee5\u4e0b\u7248\u672c, \u8bf7\u5347\u7ea7\u7cfb\u7edf\u6216\u5411\u811a\u672c\u4f5c\u8005\u53cd\u9988\u4ee5\u5bfb\u6c42\u652f\u6301!\n\t\tEOF\n\n\t\texit 1\n\tfi\n\n\tif [ \"$OS\" = \"Ubuntu\" -a $OS_VSRSION -lt 12 ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u6682\u4e0d\u652f\u6301 Ubuntu 12 \u4ee5\u4e0b\u7248\u672c, \u8bf7\u5347\u7ea7\u7cfb\u7edf\u6216\u5411\u811a\u672c\u4f5c\u8005\u53cd\u9988\u4ee5\u5bfb\u6c42\u652f\u6301!\n\t\tEOF\n\t\texit 1\n\tfi\n\n\tif [ \"$OS\" = \"Debian\" -a $OS_VSRSION -lt 7 ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u6682\u4e0d\u652f\u6301 Debian 7 \u4ee5\u4e0b\u7248\u672c, \u8bf7\u5347\u7ea7\u7cfb\u7edf\u6216\u5411\u811a\u672c\u4f5c\u8005\u53cd\u9988\u4ee5\u5bfb\u6c42\u652f\u6301!\n\t\tEOF\n\t\texit 1\n\tfi\n}\n\n# \u83b7\u53d6\u7cfb\u7edf\u4f4d\u6570\nget_arch() {\n\tif $(uname -m | grep -q \"64\") || $(getconf LONG_BIT | grep -q \"64\"); then\n\t\tARCH=64\n\t\tSPRUCE_TYPE=\"linux-amd64\"\n\t\tFILE_SUFFIX=\"linux_amd64\"\n\telse\n\t\tARCH=32\n\t\tSPRUCE_TYPE=\"linux-386\"\n\t\tFILE_SUFFIX=\"linux_386\"\n\tfi\n}\n\n# \u83b7\u53d6\u670d\u52a1\u5668\u7684IP\u5730\u5740\nget_server_ip() {\n\tSERVER_IP=$(ip addr | grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\" | \\\n\t\tgrep -Ev \"^192\\.168|^172\\.1[6-9]\\.|^172\\.2[0-9]\\.|^172\\.3[0-2]\\.|^10\\.|^127\\.|^255\\.|^0\\.\" | \\\n\t\thead -n 1)\n\t[ -z \"$SERVER_IP\" ] &amp;&amp; SERVER_IP=$(wget -q -O - ipv4.icanhazip.com)\n}\n\n# \u7981\u7528 selinux\ndisable_selinux() {\n\tif [ -s \/etc\/selinux\/config ] &amp;&amp; $(grep -q \"SELINUX=enforcing\" \/etc\/selinux\/config); then\n\t\tsed -i \"s\/SELINUX=enforcing\/SELINUX=disabled\/g\" \/etc\/selinux\/config\n\t\tsetenforce 0\n\tfi\n}\n\n# \u975e\u6b63\u5e38\u9000\u51fa\nexit_with_error() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\tKcptun \u670d\u52a1\u7aef\u5b89\u88c5\u6216\u914d\u7f6e\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef!\n\t\u5e0c\u671b\u4f60\u80fd\u8bb0\u5f55\u4e0b\u9519\u8bef\u4fe1\u606f, \u7136\u540e\u5c06\u9519\u8bef\u4fe1\u606f\u53d1\u9001\u7ed9\u6211\n\tQQ\u7fa4: 43391448, 68133628\n\t\u90ae\u7bb1: kuoruan@gmail.com\n\t\u535a\u5ba2: https:\/\/blog.kuoruan.com\/\n\tEOF\n\texit 1\n}\n\n# \u4efb\u610f\u952e\u7ee7\u7eed\nany_key_to_continue() {\n\tSAVEDSTTY=`stty -g`\n\tstty -echo\n\tstty cbreak\n\tdd if=\/dev\/tty bs=1 count=1 2&gt; \/dev\/null\n\tstty -raw\n\tstty echo\n\tstty $SAVEDSTTY\n}\n\n# \u68c0\u67e5\u662f\u5426\u5df2\u7ecf\u5b89\u88c5\ninstalled_check() {\n\tif [ -s \/etc\/supervisord.conf ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u68c0\u6d4b\u5230\u4f60\u66fe\u7ecf\u901a\u8fc7\u5176\u4ed6\u65b9\u5f0f\u5b89\u88c5\u8fc7 Supervisor , \u8fd9\u4f1a\u548c\u672c\u811a\u672c\u5b89\u88c5\u7684 Supervisor \u4ea7\u751f\u51b2\u7a81\n\t\t\u63a8\u8350\u4f60\u5907\u4efd\u5f53\u524d Supervisor \u914d\u7f6e\u540e\u5378\u8f7d\u539f\u6709\u7248\u672c\n\t\t\u5df2\u5b89\u88c5\u7684 Supervisor \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u4e3a: \/etc\/supervisord.conf\n\t\t\u901a\u8fc7\u672c\u811a\u672c\u5b89\u88c5\u7684 Supervisor \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u4e3a: \/etc\/supervisor\/supervisord.conf\n\t\t\u4f60\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u5378\u8f7d\u6e05\u7406\u539f\u6709\u7248\u672c:\n\n\t\t    mv \/etc\/supervisord.conf \/etc\/supervisord.conf.bak\n\t\t    $([ \"${OS}\" = \"CentOS\" ] &amp;&amp; echo -n \"yum remove supervisor\" || echo -n \"apt-get remove --purge supervisor\")\n\n\t\t\u7136\u540e, \u8bf7\u91cd\u65b0\u8fd0\u884c\u811a\u672c\u5b89\u88c5\n\t\tEOF\n\n\t\texit_with_error\n\tfi\n\n\tif [ -d \/etc\/supervisor\/conf.d\/ ]; then\n\t\tlocal instance_count=$(get_instance_count)\n\n\t\tif [ $instance_count -gt 0 ] &amp;&amp; [ -d \"$KCPTUN_INSTALL_DIR\" ]; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u68c0\u6d4b\u5230\u4f60\u5df2\u5b89\u88c5 Kcptun \u670d\u52a1\u7aef, \u5df2\u914d\u7f6e\u7684\u5b9e\u4f8b\u4e2a\u6570\u4e3a ${instance_count} \u4e2a\n\t\t\tEOF\n\t\t\twhile :\n\t\t\tdo\n\t\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\t\u8bf7\u9009\u62e9\u4f60\u5e0c\u671b\u7684\u64cd\u4f5c:\n\t\t\t\t(1) \u8986\u76d6\u5b89\u88c5\n\t\t\t\t(2) \u91cd\u65b0\u914d\u7f6e\n\t\t\t\t(3) \u6dfb\u52a0\u5b9e\u4f8b(\u591a\u7528\u6237)\n\t\t\t\t(4) \u68c0\u67e5\u66f4\u65b0\n\t\t\t\t(5) \u67e5\u770b\u914d\u7f6e\n\t\t\t\t(6) \u67e5\u770b\u65e5\u5fd7\u8f93\u51fa\n\t\t\t\t(7) \u81ea\u5b9a\u4e49\u7248\u672c\u5b89\u88c5\n\t\t\t\t(8) \u5220\u9664\u5b9e\u4f8b\n\t\t\t\t(9) \u5b8c\u5168\u5378\u8f7d\n\t\t\t\t(10) \u9000\u51fa\u811a\u672c\n\t\t\t\tEOF\n\t\t\t\tread -p \"(\u9ed8\u8ba4: 1) \u8bf7\u9009\u62e9 [1~10]: \" sel\n\t\t\t\techo\n\t\t\t\t[ -z \"$sel\" ] &amp;&amp; sel=1\n\n\t\t\t\tcase $sel in\n\t\t\t\t\t1)\n\t\t\t\t\t\techo \"\u5f00\u59cb\u8986\u76d6\u5b89\u88c5 Kcptun \u670d\u52a1\u7aef...\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t\t;;\n\t\t\t\t\t2)\n\t\t\t\t\t\tselect_instance\n\t\t\t\t\t\treconfig_instance\n\t\t\t\t\t\t;;\n\t\t\t\t\t3)\n\t\t\t\t\t\tadd_instance\n\t\t\t\t\t\t;;\n\t\t\t\t\t4)\n\t\t\t\t\t\tcheck_update\n\t\t\t\t\t\t;;\n\t\t\t\t\t5)\n\t\t\t\t\t\tselect_instance\n\t\t\t\t\t\tshow_instance_config\n\t\t\t\t\t\t;;\n\t\t\t\t\t6)\n\t\t\t\t\t\tselect_instance\n\t\t\t\t\t\tshow_instance_log\n\t\t\t\t\t\t;;\n\t\t\t\t\t7)\n\t\t\t\t\t\tmanual_install\n\t\t\t\t\t\t;;\n\t\t\t\t\t8)\n\t\t\t\t\t\tselect_instance\n\t\t\t\t\t\tdel_instance\n\t\t\t\t\t\t;;\n\t\t\t\t\t9)\n\t\t\t\t\t\tuninstall_kcptun\n\t\t\t\t\t\t;;\n\t\t\t\t\t10)\n\t\t\t\t\t\t;;\n\t\t\t\t\t*)\n\t\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~10!\"\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t;;\n\t\t\t\tesac\n\n\t\t\t\texit 0\n\t\t\tdone\n\t\tfi\n\tfi\n}\n\n# \u68c0\u6d4b\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\ncheck_port() {\n\t[ $# -lt 1 ] &amp;&amp; return 1\n\tlocal port=$1\n\n\tif command_exists netstat; then\n\t\treturn $(netstat -ntul | grep -qE \"[0-9:]:${port}\\s\")\n\telif command_exists ss; then\n\t\treturn $(ss -ntul | grep -qE \"[0-9:]:${port}\\s\")\n\telse\n\t\treturn 1\n\tfi\n}\n\n# \u8bbe\u7f6e Kcptun \u7aef\u53e3\nset_listen_port() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8f93\u5165 Kcptun \u670d\u52a1\u7aef\u8fd0\u884c\u7aef\u53e3 [1~65535]\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[LISTEN]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif is_number $input &amp;&amp; [ $input -ge 1 -a $input -le 65535 ]; then\n\t\t\t\tlisten_port=\"$input\"\n\t\t\telse\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165 1~65535 \u4e4b\u95f4\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\t\tfi\n\n\t\tcurrent_listen_port=$(get_current_listen_port)\n\t\tif check_port $listen_port &amp;&amp; [ \"$listen_port\" != \"$current_listen_port\" ]; then\n\t\t\techo \"\u7aef\u53e3\u5df2\u88ab\u5360\u7528, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\tcontinue\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t\u7aef\u53e3 = ${listen_port}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u7981\u7528 IPv6\nset_disable_ipv6() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u7981\u7528 IPv6?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u4e0d\u7981\u7528) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tlisten_addr=$SERVER_IP\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\tunset listen_addr\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t$([ -z \"${listen_addr}\" ] &amp;&amp; echo \"\u4e0d\u7981\u7528IPv6\" || echo \"\u7981\u7528IPv6\")\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u52a0\u901f\u7684ip\u5730\u5740\nset_target_ip() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8f93\u5165\u9700\u8981\u52a0\u901f\u7684 IP [0.0.0.0 ~ 255.255.255.255]\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[TARGET_IP]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tgrep -qE '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' &lt;&lt;&lt; \"$input\"\n\t\t\tif [ $? -ne 0 ]; then\n\t\t\t\techo \"IP \u5730\u5740\u683c\u5f0f\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\ttarget_ip=\"$input\"\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t\u52a0\u901f IP = ${target_ip}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u52a0\u901f\u7684\u7aef\u53e3\nset_target_port() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8f93\u5165\u9700\u8981\u52a0\u901f\u7684\u7aef\u53e3 [1~65535]\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[TARGET_PORT]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif is_number $input &amp;&amp; [ $input -ge 1 -a $input -le 65535 ]; then\n\t\t\t\tif [ $input -eq $listen_port ]; then\n\t\t\t\t\techo \"\u52a0\u901f\u7aef\u53e3\u4e0d\u80fd\u548c Kcptun \u7aef\u53e3\u4e00\u81f4!\"\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\n\t\t\t\ttarget_port=$input\n\t\t\telse\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165 1~65535 \u4e4b\u95f4\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\t\tfi\n\n\t\tif [ \"$target_ip\" = \"${DEFAULT[TARGET_IP]}\" ]; then\n\t\t\tif ! check_port $target_port; then\n\t\t\t\tread -p \"\u5f53\u524d\u6ca1\u6709\u8f6f\u4ef6\u4f7f\u7528\u6b64\u7aef\u53e3, \u786e\u5b9a\u52a0\u901f\u6b64\u7aef\u53e3? [y\/n]: \" yn\n\t\t\t\t[ -z \"$yn\" ] &amp;&amp; yn=\"y\"\n\t\t\t\tcase ${yn:0:1} in\n\t\t\t\t\ty|Y)\n\t\t\t\t\t\t;;\n\t\t\t\t\t*)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tfi\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t\u52a0\u901f\u7aef\u53e3 = ${target_port}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e Kcptun \u5bc6\u7801\nset_key() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u8bf7\u8f93\u5165 Kcptun \u5bc6\u7801\n\tEOF\n\tread -p \"(\u9ed8\u8ba4\u5bc6\u7801: ${DEFAULT[KEY]}): \" input\n\techo\n\t[ -n \"$input\" ] &amp;&amp; key=\"$input\"\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t---------------------------\n\t\u5bc6\u7801 = ${key}\n\t---------------------------\n\tEOF\n}\n\n# \u8bbe\u7f6e\u52a0\u5bc6\u65b9\u5f0f\nset_crypt() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u9009\u62e9\u52a0\u5bc6\u65b9\u5f0f(crypt):\n\t\tEOF\n\n\t\tfor ((i=0; i&lt;${#CRYPTS[@]}; i++)); do\n\t\t\techo \"($(($i + 1))) ${CRYPTS[$i]}\"\n\t\tdone\n\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[CRYPT]}) \u8bf7\u9009\u62e9 [1~$i]: \" sel\n\t\techo\n\t\tif [ -n \"$sel\" ]; then\n\t\t\tif is_number $sel &amp;&amp; [ $sel -ge 1 -a $sel -le $i ]; then\n\t\t\t\tcrypt=${CRYPTS[$(($sel - 1))]}\n\t\t\telse\n\t\t\t\techo \"\u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~$i!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t-----------------------------\n\t\t\u52a0\u5bc6\u65b9\u5f0f = ${crypt}\n\t\t-----------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u52a0\u901f\u6a21\u5f0f\nset_mode() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u9009\u62e9\u52a0\u901f\u6a21\u5f0f(mode):\n\t\tEOF\n\n\t\tfor ((i=0; i&lt;${#MODES[@]}; i++)); do\n\t\t\techo \"($(($i + 1))) ${MODES[$i]}\"\n\t\tdone\n\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[MODE]}) \u8bf7\u9009\u62e9 [1~$i]: \" sel\n\t\techo\n\t\tif [ -n \"$sel\" ]; then\n\t\t\tif is_number $sel &amp;&amp; [ $sel -ge 1 -a $sel -le $i ]; then\n\t\t\t\tmode=${MODES[$(($sel - 1))]}\n\t\t\telse\n\t\t\t\techo \"\u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~$i!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t\u52a0\u901f\u6a21\u5f0f = ${mode}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n\n\t[ \"$mode\" = \"manual\" ] &amp;&amp; set_manual_parameters\n}\n\n# \u8bbe\u7f6e\u624b\u52a8\u6321\u53c2\u6570\nset_manual_parameters() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u624b\u52a8\u6321\u53c2\u6570(\u9884\u8bbe\u503c\u6216\u624b\u52a8\u8bbe\u7f6e):\n\t\t(1) \u7b56\u75651: \u901a\u8fc7\u8d85\u65f6\u91cd\u4f20\uff0b\u5feb\u901f\u91cd\u4f20, \u54cd\u5e94\u901f\u5ea6\u4f18\u5148 (\u6700\u5927\u5316\u54cd\u5e94\u65f6\u95f4, \u9002\u7528\u4e8e\u7f51\u9875\u8bbf\u95ee)\n\t\t(2) \u7b56\u75652-1: \u4ec5\u4ec5\u901a\u8fc7\u8d85\u65f6\u91cd\u4f20, \u5e26\u5bbd\u6548\u7387\u4f18\u5148 (\u6709\u6548\u8f7d\u6bd4\u4f18\u5148, \u9002\u7528\u4e8e\u89c6\u9891\u89c2\u770b)\n\t\t(3) \u7b56\u75652-2: \u540c\u4e0a, \u4e0e \u7b56\u75652-1 \u53c2\u6570\u7565\u4e0d\u76f8\u540c\n\t\t(4) \u7b56\u75653: \u5c3d\u53ef\u80fd\u901a\u8fc7 FEC \u7ea0\u5220, \u6700\u5927\u5316\u4f20\u8f93\u901f\u5ea6 (\u8f83\u4e3a\u4e2d\u5eb8, \u517c\u987e\u7f51\u9875\u548c\u89c6\u9891)\n\t\t(5) \u81ea\u5b9a\u4e49\u624b\u52a8\u6321\u53c2\u6570\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: 5) \u8bf7\u9009\u62e9 [1~5]: \" sel\n\t\techo\n\t\t[ -z \"$sel\" ] &amp;&amp; sel=5\n\t\tcase $sel in\n\t\t\t1)\n\t\t\t\tnodelay=1\n\t\t\t\tinterval=20\n\t\t\t\tresend=2\n\t\t\t\tnc=1\n\t\t\t\t;;\n\t\t\t2)\n\t\t\t\tnodelay=1\n\t\t\t\tinterval=40\n\t\t\t\tresend=0\n\t\t\t\tnc=1\n\t\t\t\t;;\n\t\t\t3)\n\t\t\t\tnodelay=0\n\t\t\t\tinterval=20\n\t\t\t\tresend=0\n\t\t\t\tnc=1\n\t\t\t\t;;\n\t\t\t4)\n\t\t\t\tnodelay=0\n\t\t\t\tinterval=40\n\t\t\t\tresend=0\n\t\t\t\tnc=1\n\t\t\t\tdatashard=5\n\t\t\t\tparityshard=2\n\t\t\t\t;;\n\t\t\t5)\n\t\t\t\tset_manual_detail_parameters\n\t\t\t\tbreak\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\techo \"\u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~5!\"\n\t\t\t\tcontinue\n\t\t\t\t;;\n\t\tesac\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tnodelay = ${nodelay}\n\t\tinterval = ${interval}\n\t\tresend = ${resend}\n\t\tnc = ${nc}\n\t\tdatashard = ${datashard}\n\t\tparityshard = ${parityshard}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u624b\u52a8\u6a21\u5f0f\u8be6\u7ec6\u53c2\u6570\nset_manual_detail_parameters() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u914d\u7f6e\u624b\u52a8\u6321\u53c2\u6570...\n\tEOF\n\n\tset_nodelay\n\tset_interval\n\tset_resend\n\tset_nc\n}\n\nset_nodelay() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u542f\u7528 nodelay \u6a21\u5f0f?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u4e0d\u542f\u7528) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tnodelay=1\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\tnodelay=0\n\t\t\t\t\t;;\n\t\t\t\t*  )\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tnodelay = ${nodelay}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_interval() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u534f\u8bae\u5185\u90e8\u5de5\u4f5c\u7684 interval\n\t\tEOF\n\t\tread -p \"(\u5355\u4f4d: ms, \u9ed8\u8ba4: ${DEFAULT[INTERVAL]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tinterval=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tinterval = ${interval}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_resend() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u542f\u7528\u5feb\u901f\u91cd\u4f20\u6a21\u5f0f(resend)?\n\t\t(1) \u4e0d\u542f\u7528\n\t\t(2) \u542f\u7528\n\t\t(3) 2\u6b21ACK\u8de8\u8d8a\u91cd\u4f20\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: 3) \u8bf7\u9009\u62e9 [1~3]: \" sel\n\t\techo\n\t\tif [ -n \"$sel\" ]; then\n\t\t\tcase $sel in\n\t\t\t\t1)\n\t\t\t\t\tresend=0\n\t\t\t\t\t;;\n\t\t\t\t2)\n\t\t\t\t\tresend=1\n\t\t\t\t\t;;\n\t\t\t\t3)\n\t\t\t\t\tresend=2\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\t\t\u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~3!\n\t\t\t\t\tEOF\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tresend = ${resend}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_nc() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u5173\u95ed\u6d41\u63a7(nc)?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u5173\u95ed) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tnc=1\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\tnc=0\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tnc = ${nc}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_mtu() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e UDP \u6570\u636e\u5305\u7684 MTU (\u6700\u5927\u4f20\u8f93\u5355\u5143)\u503c\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[MTU]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tmtu=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tMTU = ${mtu}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_sndwnd() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u53d1\u9001\u7a97\u53e3\u5927\u5c0f(sndwnd)\n\t\tEOF\n\t\tread -p \"(\u6570\u636e\u5305\u6570\u91cf, \u9ed8\u8ba4: ${DEFAULT[SNDWND]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tsndwnd=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tsndwnd = ${sndwnd}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_rcvwnd() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u63a5\u6536\u7a97\u53e3\u5927\u5c0f(rcvwnd)\n\t\tEOF\n\t\tread -p \"(\u6570\u636e\u5305\u6570\u91cf, \u9ed8\u8ba4: ${DEFAULT[RCVWND]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\trcvwnd=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\trcvwnd = ${rcvwnd}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_datashard() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u524d\u5411\u7ea0\u9519 datashard\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[DATASHARD]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -lt 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e\u7b49\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tdatashard=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tdatashard = ${datashard}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_parityshard() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u524d\u5411\u7ea0\u9519 parityshard\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[PARITYSHARD]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -lt 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e\u7b49\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tparityshard=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tparityshard = ${parityshard}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_dscp() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u5dee\u5206\u670d\u52a1\u4ee3\u7801\u70b9(DSCP)\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[DSCP]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -lt 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e\u7b49\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tdscp=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tDSCP = ${dscp}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_nocomp() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u7981\u7528\u6570\u636e\u538b\u7f29?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u4e0d\u7981\u7528) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tnocomp=true\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\tnocomp=false\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tnocomp = ${nocomp}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u9690\u85cf\u53c2\u6570\nset_hidden_parameters() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u914d\u7f6e\u9690\u85cf\u53c2\u6570...\n\tEOF\n\tset_acknodelay\n\tset_sockbuf\n\tset_keepalive\n}\n\nset_acknodelay() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u542f\u7528 acknodelay \u6a21\u5f0f?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u4e0d\u542f\u7528) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tacknodelay=\"true\"\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\tacknodelay=\"false\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tacknodelay = ${acknodelay}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_sockbuf() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e UDP \u6536\u53d1\u7f13\u51b2\u533a\u5927\u5c0f(sockbuf)\n\t\tEOF\n\t\tread -p \"(\u5355\u4f4d: MB, \u9ed8\u8ba4: $((${DEFAULT[SOCKBUF]} \/ 1024 \/ 1024))): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tsockbuf=$(($input * 1024 * 1024))\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tsockbuf = ${sockbuf}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\nset_keepalive() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e Keepalive \u7684\u95f4\u9694\u65f6\u95f4\n\t\tEOF\n\t\tread -p \"(\u5355\u4f4d: s, \u9ed8\u8ba4\u503c: ${DEFAULT[KEEPALIVE]}, \u524d\u503c: 5): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! is_number $input || [ $input -le 0 ]; then\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tkeepalive=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\tkeepalive = ${keepalive}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u8fd0\u884c\u7528\u6237\nset_run_user() {\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u8bbe\u7f6e\u4ee5\u54ea\u4e2a\u7528\u6237\u8fd0\u884c\u5f53\u524d Kcptun \u5b9e\u4f8b\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: ${DEFAULT[RUN_USER]}): \" input\n\t\techo\n\t\tif [ -n \"$input\" ]; then\n\t\t\tif ! grep -q \"^${input}:\" \/etc\/passwd; then\n\t\t\t\techo \"\u672a\u53d1\u73b0\u8be5\u7528\u6237, \u8bf7\u5148\u4f7f\u7528 useradd \u624b\u52a8\u521b\u5efa\u7528\u6237 ${input}\"\n\t\t\t\tcontinue\n\t\t\tfi\n\n\t\t\tif [ \"$input\" != \"${DEFAULT[RUN_USER]}\" -a \"$listen_port\" -lt 1024 ]; then\n\t\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t\t\t\u4f60\u8bbe\u7f6e\u7684 Kcptun \u76d1\u542c\u7aef\u53e3\u4e3a ${listen_port}\n\t\t\t\t\u7531\u4e8e linux \u7cfb\u7edf\u9650\u5236, \u4ec5\u6709 root \u7528\u6237\u80fd\u542f\u7528\u5c0f\u4e8e 1024 \u7684\u7aef\u53e3\n\t\t\t\t\u811a\u672c\u5df2\u81ea\u52a8\u5c06\u7528\u6237\u8bbe\u7f6e\u4e3a root\n\t\t\t\tEOF\n\t\t\t\tinput=${DEFAULT[RUN_USER]}\n\t\t\tfi\n\n\t\t\trun_user=$input\n\t\tfi\n\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t---------------------------\n\t\t\u7528\u6237 = ${run_user}\n\t\t---------------------------\n\t\tEOF\n\t\tbreak\n\tdone\n}\n\n# \u8bbe\u7f6e\u53c2\u6570\nset_kcptun_config() {\n\techo\n\techo \"\u5f00\u59cb\u914d\u7f6e\u53c2\u6570...\"\n\n\tset_listen_port\n\tset_disable_ipv6\n\tset_target_ip\n\tset_target_port\n\tset_key\n\tset_crypt\n\tset_mode\n\tset_mtu\n\tset_sndwnd\n\tset_rcvwnd\n\tset_datashard\n\tset_parityshard\n\tset_dscp\n\tset_nocomp\n\tset_run_user\n\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u662f\u5426\u8c03\u6574\u9690\u85cf\u53c2\u6570?\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: \u5426) [y\/n]: \" yn\n\t\techo\n\t\tif [ -n \"$yn\" ]; then\n\t\t\tcase ${yn:0:1} in\n\t\t\t\ty|Y)\n\t\t\t\t\tset_hidden_parameters\n\t\t\t\t\t;;\n\t\t\t\tn|N)\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\t\tbreak\n\tdone\n\n\techo \"\u914d\u7f6e\u5b8c\u6210, \u6309\u4efb\u610f\u952e\u7ee7\u7eed...\u6216\u8005 Ctrl+C \u53d6\u6d88\"\n\tany_key_to_continue\n}\n\n# \u5b89\u88c5\u9700\u8981\u7684\u4f9d\u8d56\u8f6f\u4ef6\ninstall_dependence() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u5b89\u88c5\u4f9d\u8d56\u8f6f\u4ef6...\n\tEOF\n\n\tif [ \"$OS\" = \"CentOS\" ]; then\n\t\tyum makecache\n\t\tyum update -y ca-certificates\n\t\tyum install -y curl wget python-setuptools tar\n\telse\n\t\tapt-get -y update\n\t\tapt-get -y install curl wget python-setuptools tar || {\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u5b89\u88c5\u4f9d\u8d56\u8f6f\u4ef6\u5305\u5931\u8d25!\n\t\t\tEOF\n\t\t\texit_with_error\n\t\t}\n\tfi\n\n\t[ ! -x \"$JQ\" ] &amp;&amp; install_jq\n\n\tif ! easy_install supervisor; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u5b89\u88c5 Supervisor \u5931\u8d25!\n\t\tEOF\n\t\texit_with_error\n\tfi\n\n\t[ -d \/etc\/supervisor\/conf.d ] || mkdir -p \/etc\/supervisor\/conf.d\n\n\tif [ ! -s \/etc\/supervisor\/supervisord.conf ]; then\n\n\t\tif ! command_exists echo_supervisord_conf; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u672a\u627e\u5230 echo_supervisord_conf, \u65e0\u6cd5\u81ea\u52a8\u521b\u5efa Supervisor \u914d\u7f6e\u6587\u4ef6!\n\t\t\t\u53ef\u80fd\u662f\u5f53\u524d\u5b89\u88c5\u7684 supervisor \u7248\u672c\u8fc7\u4f4e\n\t\t\tEOF\n\t\t\texit_with_error\n\t\telse\n\t\t\tif ! echo_supervisord_conf &gt; \/etc\/supervisor\/supervisord.conf; then\n\t\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\t\u521b\u5efa Supervisor \u914d\u7f6e\u6587\u4ef6\u5931\u8d25!\n\t\t\t\tEOF\n\t\t\t\texit_with_error\n\t\t\tfi\n\t\tfi\n\tfi\n}\n\n# \u5b89\u88c5 Json \u89e3\u6790\u5de5\u5177 JQ\ninstall_jq() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u5b89\u88c5 Json \u89e3\u6790\u5de5\u5177 jq ...\n\tEOF\n\tlocal jq_url\n\tif [ \"$ARCH\" = '64' ]; then\n\t\tjq_url=\"$JQ_LINUX64\"\n\telse\n\t\tjq_url=\"$JQ_LINUX32\"\n\tfi\n\n\tif ! wget --no-check-certificate -O \"$JQ\" \"$jq_url\"; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u81ea\u52a8\u5b89\u88c5 jq \u5931\u8d25, \u8bf7\u624b\u52a8\u4e0b\u8f7d\u5b89\u88c5!\n\n\t\t    wget --no-check-certificate -O ${JQ} ${jq_url}\n\t\t    chmod a+x ${JQ}\n\n\t\t\u5b89\u88c5\u5b8c\u6210\u4e4b\u540e\u8bf7\u91cd\u65b0\u8fd0\u884c\u811a\u672c\n\t\tEOF\n\t\texit_with_error\n\tfi\n\n\tchmod a+x \"$JQ\"\n\tif [ ! -x \"$JQ\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u65e0\u6cd5\u8bbe\u7f6e\u6267\u884c\u6743\u9650, \u8bf7\u624b\u52a8\u8bbe\u7f6e:\n\n\t\t    chmod a+x ${JQ}\n\n\t\t\u8bbe\u7f6e\u597d\u4e4b\u540e\u8bf7\u91cd\u65b0\u8fd0\u884c\u811a\u672c\n\t\tEOF\n\t\texit_with_error\n\tfi\n}\n\n# \u901a\u8fc7\u7f51\u7edc\u83b7\u53d6\u9700\u8981\u7684\u4fe1\u606f\nget_kcptun_version_info() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u83b7\u53d6\u7f51\u7edc\u4fe1\u606f...\n\tEOF\n\n\t[ ! -x \"$JQ\" ] &amp;&amp; install_jq\n\n\tlocal request_version=$1\n\tlocal kcptun_release_content\n\n\tif [ -n \"$request_version\" ]; then\n\t\tkcptun_release_content=$(curl --silent --insecure --fail $KCPTUN_RELEASES_URL | $JQ -r \".[] | select(.tag_name == \\\"${request_version}\\\")\")\n\telse\n\t\tkcptun_release_content=$(curl --silent --insecure --fail $KCPTUN_RELEASES_URL | $JQ -r \".[0]\")\n\tfi\n\n\tif [ -n \"$kcptun_release_content\" ]; then\n\t\tkcptun_release_name=$($JQ -r \".name\" &lt;&lt;&lt; \"$kcptun_release_content\")\n\t\tkcptun_release_tag_name=$($JQ -r \".tag_name\" &lt;&lt;&lt; \"$kcptun_release_content\")\n\t\tkcptun_release_prerelease=$($JQ -r \".prerelease\" &lt;&lt;&lt; \"$kcptun_release_content\")\n\t\tkcptun_release_html_url=$($JQ -r \".html_url\" &lt;&lt;&lt; \"$kcptun_release_content\")\n\n\t\tkcptun_release_download_url=$($JQ -r \".assets[] | select(.name | contains(\\\"$SPRUCE_TYPE\\\")) | .browser_download_url\" &lt;&lt;&lt; \"$kcptun_release_content\" | head -n 1) || {\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u83b7\u53d6 Kcptun \u4e0b\u8f7d\u5730\u5740\u5931\u8d25, \u8bf7\u91cd\u8bd5...\n\t\t\tEOF\n\t\t\texit_with_error\n\t\t}\n\telse\n\t\tif [ -n \"$request_version\" ]; then\n\t\t\treturn 2\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u83b7\u53d6 Kcptun \u7248\u672c\u4fe1\u606f\u5931\u8d25, \u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5!\n\t\t\tEOF\n\t\t\texit_with_error\n\t\tfi\n\tfi\n}\n\n# \u83b7\u53d6shell\u811a\u672c\u66f4\u65b0\nget_shell_version_info() {\n\tlocal shell_version_content=$(curl --silent --insecure --fail $SHELL_VERSION_INFO_URL)\n\tif [ $? -eq 0 ]; then\n\t\tnew_shell_version=$($JQ -r \".shell_version\" &lt;&lt;&lt; \"$shell_version_content\" | grep -oE \"[0-9]+\" )\n\t\tnew_config_version=$($JQ -r \".config_version\" &lt;&lt;&lt; \"$shell_version_content\" | grep -oE \"[0-9]+\" )\n\t\tnew_init_version=$($JQ -r \".init_version\" &lt;&lt;&lt; \"$shell_version_content\" | grep -oE \"[0-9]+\")\n\n\t\tshell_change_log=$($JQ -r \".change_log\" &lt;&lt;&lt; \"$shell_version_content\")\n\t\tconfig_change_log=$($JQ -r \".config_change_log\" &lt;&lt;&lt; \"$shell_version_content\")\n\t\tinit_change_log=$($JQ -r \".init_change_log\" &lt;&lt;&lt; \"$shell_version_content\")\n\n\t\tnew_shell_url=$($JQ -r \".shell_url\" &lt;&lt;&lt; \"$shell_version_content\")\n\telse\n\t\tnew_shell_version=0\n\t\tnew_config_version=0\n\t\tnew_init_version=0\n\tfi\n}\n\n# \u4e0b\u8f7d\u6587\u4ef6\ndownload_file(){\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u4e0b\u8f7d\u6587\u4ef6...\n\tEOF\n\n\tcd \"$CUR_DIR\"\n\tif [ `pwd` != \"$CUR_DIR\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u5207\u6362\u76ee\u5f55\u5931\u8d25...\n\t\tEOF\n\t\texit_with_error\n\tfi\n\n\tkcptun_file_name=\"kcptun-${kcptun_release_tag_name}.tar.gz\"\n\tif [ -f \"$kcptun_file_name\" ] &amp;&amp; tar -tf \"$kcptun_file_name\" &amp;&gt;\/dev\/null; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u5df2\u627e\u5230 Kcptun \u6587\u4ef6\u538b\u7f29\u5305, \u8df3\u8fc7\u4e0b\u8f7d...\n\t\tEOF\n\t\treturn 0\n\tfi\n\n\tif ! wget --no-check-certificate -c -t 3 -O \"$kcptun_file_name\" \"$kcptun_release_download_url\"; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u4e0b\u8f7d Kcptun \u6587\u4ef6\u538b\u7f29\u5305\u5931\u8d25, \u4f60\u53ef\u4ee5\u5c1d\u8bd5\u624b\u52a8\u4e0b\u8f7d\u6587\u4ef6:\n\t\t1. \u4e0b\u8f7d ${kcptun_release_download_url}\n\t\t2. \u5c06\u6587\u4ef6\u91cd\u547d\u540d\u4e3a ${file_name}\n\t\t3. \u4e0a\u4f20\u6587\u4ef6\u81f3\u811a\u672c\u5f53\u524d\u76ee\u5f55 ${CUR_DIR}\n\t\t4. \u91cd\u65b0\u8fd0\u884c\u811a\u672c\u5f00\u59cb\u5b89\u88c5\n\t\tEOF\n\t\texit_with_error\n\tfi\n\n}\n\n# \u89e3\u538b\u6587\u4ef6\nunpack_file() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u89e3\u538b\u6587\u4ef6...\n\tEOF\n\n\tcd \"$CUR_DIR\"\n\t[ -d \"$KCPTUN_INSTALL_DIR\" ] || mkdir -p \"$KCPTUN_INSTALL_DIR\"\n\ttar -zxf \"$kcptun_file_name\" -C \"$KCPTUN_INSTALL_DIR\"\n\n\tlocal kcptun_server_exec=\"$KCPTUN_INSTALL_DIR\"\/server_\"$FILE_SUFFIX\"\n\tif [ -f \"$kcptun_server_exec\" ]; then\n\t\tif ! chmod a+x \"$kcptun_server_exec\"; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u65e0\u6cd5\u8bbe\u7f6e\u6267\u884c\u6743\u9650...\n\t\t\tEOF\n\t\t\texit_with_error\n\t\tfi\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u5728\u89e3\u538b\u6587\u4ef6\u4e2d\u627e\u5230 Kcptun \u670d\u52a1\u7aef\u6267\u884c\u6587\u4ef6, \u8bf7\u91cd\u8bd5!\n\t\tEOF\n\t\texit_with_error\n\tfi\n}\n\n# \u521b\u5efa\u914d\u7f6e\u6587\u4ef6\nconfig_kcptun() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u5199\u5165\u914d\u7f6e...\n\tEOF\n\n\tif [ -f \/etc\/supervisor\/supervisord.conf ]; then\n\t\t# sed -i 's\/^\\[include\\]$\/&amp;\\nfiles = \\\/etc\\\/supervisor\\\/conf.d\\\/\\*\\.conf\/; \\\n\t\t# t;$a [include]\\nfiles = \/etc\/supervisor\/conf.d\/*.conf' \/etc\/supervisor\/supervisord.conf\n\n\t\t$(grep -q \"^files\\s*=\\s*\\\/etc\\\/supervisor\\\/conf\\.d\\\/\\*\\.conf$\" \/etc\/supervisor\/supervisord.conf) || {\n\t\t\tif grep -q \"^\\[include\\]$\" \/etc\/supervisor\/supervisord.conf; then\n\t\t\t\tsed -i '\/^\\[include\\]$\/a files = \\\/etc\\\/supervisor\\\/conf.d\\\/\\*\\.conf' \/etc\/supervisor\/supervisord.conf\n\t\t\telse\n\t\t\t\tsed -i '$a [include]\\nfiles = \/etc\/supervisor\/conf.d\/*.conf' \/etc\/supervisor\/supervisord.conf\n\t\t\tfi\n\t\t}\n\n\t\t# \u521b\u5efa\u6587\u4ef6\u5939\n\t\t[ -d \"$KCPTUN_INSTALL_DIR\" ] || mkdir -p \"$KCPTUN_INSTALL_DIR\"\n\n\t\tlocal config_file=\"$(get_current_config_file)\"\n\t\tlocal supervisor_config_file=\"$(get_current_supervisor_config_file)\"\n\n\t\tcat &gt; \"$config_file\"&lt;&lt;-EOF\n\t\t{\n\t\t    \"listen\": \"${listen_addr}:${listen_port}\",\n\t\t    \"target\": \"${target_ip}:${target_port}\",\n\t\t    \"key\": \"${key}\",\n\t\t    \"crypt\": \"${crypt}\",\n\t\t    \"mode\": \"${mode}\",\n\t\t    \"mtu\": ${mtu},\n\t\t    \"sndwnd\": ${rcvwnd},\n\t\t    \"rcvwnd\": ${sndwnd},\n\t\t    \"datashard\": ${datashard},\n\t\t    \"parityshard\": ${parityshard},\n\t\t    \"dscp\": ${dscp},\n\t\t    \"nocomp\": ${nocomp},\n\t\t    \"acknodelay\": ${acknodelay},\n\t\t    \"nodelay\": ${nodelay},\n\t\t    \"interval\": ${interval},\n\t\t    \"resend\": ${resend},\n\t\t    \"nc\": ${nc},\n\t\t    \"sockbuf\": ${sockbuf},\n\t\t    \"keepalive\": ${keepalive}\n\t\t}\n\t\tEOF\n\n\t\tcat &gt; \"$supervisor_config_file\"&lt;&lt;-EOF\n\t\t[program:kcptun${current_id}]\n\t\tuser=${run_user}\n\t\tdirectory=${KCPTUN_INSTALL_DIR}\n\t\tcommand=${KCPTUN_INSTALL_DIR}\/server_${FILE_SUFFIX} -c \"${config_file}\"\n\t\tprocess_name=%(program_name)s\n\t\tautostart=true\n\t\tredirect_stderr=true\n\t\tstdout_logfile=$(get_current_log_file)\n\t\tstdout_logfile_maxbytes=1MB\n\t\tstdout_logfile_backups=0\n\t\tEOF\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u627e\u5230 Supervisor \u914d\u7f6e\u6587\u4ef6!\n\t\t\u8bf7\u5148\u4f7f\u7528\u811a\u672c\u5b89\u88c5 Kcptun \u670d\u52a1\u7aef\n\t\tEOF\n\t\texit_with_error\n\tfi\n}\n\n# \u4e0b\u8f7d\u670d\u52a1\u811a\u672c\ndownlod_init_script() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u4e0b\u8f7d\u670d\u52a1\u811a\u672c...\n\tEOF\n\n\tlocal init_file_url\n\tif [ \"$OS\" = \"CentOS\" ]; then\n\t\tinit_file_url=\"https:\/\/raw.githubusercontent.com\/kuoruan\/kcptun_installer\/master\/redhat.init\"\n\telse\n\t\tinit_file_url=\"https:\/\/raw.githubusercontent.com\/kuoruan\/kcptun_installer\/master\/ubuntu.init\"\n\tfi\n\n\tif ! wget --no-check-certificate -O \/etc\/init.d\/supervisord \"$init_file_url\"; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u4e0b\u8f7d Supervisor init \u811a\u672c\u5931\u8d25!\n\t\tEOF\n\t\texit_with_error\n\tfi\n\n\tif ! chmod a+x \/etc\/init.d\/supervisord; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bbe\u7f6e\u6267\u884c\u6743\u9650\u5931\u8d25...\n\t\tEOF\n\t\texit_with_error\n\tfi\n}\n\n# \u5b89\u88c5\u670d\u52a1\ninstall_service() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u914d\u7f6e\u7cfb\u7edf\u670d\u52a1...\n\tEOF\n\n\tif [ \"$OS\" = \"CentOS\" ]; then\n\t\tchkconfig --add supervisord\n\t\tchkconfig supervisord on\n\telse\n\t\tupdate-rc.d -f supervisord defaults\n\tfi\n\n\trestart_supervisor\n}\n\n# \u8bbe\u7f6e\u9632\u706b\u5899\nconfig_firewall() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u5f00\u59cb\u8bbe\u7f6e\u9632\u706b\u5899...\n\tEOF\n\n\tif command_exists iptables; then\n\t\tif service iptables status &gt;\/dev\/null 2&gt;&amp;1; then\n\t\t\tif [ -n \"$current_listen_port\" ]; then\n\t\t\t\tiptables -D INPUT -p udp --dport ${current_listen_port} -j ACCEPT &gt;\/dev\/null 2&gt;&amp;1\n\t\t\tfi\n\t\t\tiptables -nL | grep \"$listen_port\" | grep -q \"ACCEPT\"\n\t\t\tif [ $? -ne 0 ]; then\n\t\t\t\tiptables -I INPUT -p udp --dport ${listen_port} -j ACCEPT\n\t\t\t\tservice iptables save\n\t\t\t\tservice iptables restart\n\t\t\tfi\n\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\tUDP \u7aef\u53e3 ${listen_port} \u5df2\u5f00\u653e!\n\t\t\tEOF\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\tiptables \u672a\u542f\u52a8\u6216\u672a\u914d\u7f6e\n\t\t\t\u5982\u6709\u5fc5\u8981, \u8bf7\u624b\u52a8\u6dfb\u52a0\u7aef\u53e3 ${listen_port} \u7684\u9632\u706b\u5899\u89c4\u5219:\n\n\t\t\t    iptables -I INPUT -p udp --dport ${listen_port} -j ACCEPT\n\t\t\t    service iptables save\n\t\t\t    service iptables restart\n\t\t\tEOF\n\t\tfi\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\tiptables \u672a\u5b89\u88c5, \u8df3\u8fc7\u914d\u7f6e\n\t\tEOF\n\tfi\n\n\tif command_exists firewall-cmd; then\n\t\tif systemctl status firewalld &gt;\/dev\/null 2&gt;&amp;1; then\n\t\t\tif [ -n \"$current_listen_port\" ]; then\n\t\t\t\tfirewall-cmd --zone=public --remove-port=${current_listen_port}\/udp &gt;\/dev\/null 2&gt;&amp;1\n\t\t\tfi\n\t\t\tfirewall-cmd --zone=public --query-port=${listen_port}\/udp &gt;\/dev\/null 2&gt;&amp;1\n\t\t\tif [ $? -ne 0 ]; then\n\t\t\t\tfirewall-cmd --permanent --zone=public --add-port=${listen_port}\/udp\n\t\t\t\tfirewall-cmd --reload\n\t\t\tfi\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\tUDP \u7aef\u53e3 ${listen_port} \u5df2\u5f00\u653e!\n\t\t\tEOF\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\tfirewalld \u672a\u542f\u52a8\u6216\u672a\u914d\u7f6e\n\t\t\t\u5982\u679c\u6709\u5fc5\u8981, \u8bf7\u624b\u52a8\u6dfb\u52a0\u7aef\u53e3 ${listen_port} \u7684\u9632\u706b\u5899\u89c4\u5219:\n\n\t\t\t    firewall-cmd --permanent --zone=public --add-port=${listen_port}\/udp\n\t\t\t    firewall-cmd --reload\n\t\t\tEOF\n\t\tfi\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\tfirewalld \u672a\u5b89\u88c5, \u8df3\u8fc7\u914d\u7f6e\n\t\tEOF\n\tfi\n}\n\n# \u5b89\u88c5\u6e05\u7406\ninstall_cleanup() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u6e05\u7406\u65e0\u7528\u6587\u4ef6...\n\tEOF\n\n\tcd \"$CUR_DIR\"\n\trm -f \"$kcptun_file_name\"\n\trm -f \"$KCPTUN_INSTALL_DIR\"\/client_\"$FILE_SUFFIX\"\n}\n\n# \u663e\u793a\u914d\u7f6e\u4fe1\u606f\nshow_config_info() {\n\techo\n\techo -e \"\u670d\u52a1\u5668IP: \\033[41;37m ${SERVER_IP} \\033[0m\"\n\techo -e \"\u7aef\u53e3: \\033[41;37m ${listen_port} \\033[0m\"\n\techo -e \"\u52a0\u901f\u5730\u5740: ${target_ip}:${target_port}\"\n\t[ \"$key\" != \"${DEFAULT[KEY]}\" ]                 &amp;&amp; echo -e \"\u5bc6\u7801: \\033[41;37m ${key} \\033[0m\"\n\t[ \"$crypt\" != \"${DEFAULT[CRYPT]}\" ]             &amp;&amp; echo -e \"crypt: \\033[41;37m ${crypt} \\033[0m\"\n\t[ \"$mode\" != \"${DEFAULT[MODE]}\" ]               &amp;&amp; echo -e \"mode: \\033[41;37m ${mode} \\033[0m\"\n\t[ \"$mtu\" != \"${DEFAULT[MTU]}\" ]                 &amp;&amp; echo -e \"mtu: \\033[41;37m ${mtu} \\033[0m\"\n\t[ \"$sndwnd\" != \"${DEFAULT[SNDWND]}\" ]           &amp;&amp; echo -e \"sndwnd: \\033[41;37m ${sndwnd} \\033[0m\"\n\t[ \"$rcvwnd\" != \"${DEFAULT[RCVWND]}\" ]           &amp;&amp; echo -e \"rcvwnd: \\033[41;37m ${rcvwnd} \\033[0m\"\n\t[ \"$datashard\" != \"${DEFAULT[DATASHARD]}\" ]     &amp;&amp; echo -e \"datashard: \\033[41;37m ${datashard} \\033[0m\"\n\t[ \"$parityshard\" != \"${DEFAULT[PARITYSHARD]}\" ] &amp;&amp; echo -e \"parityshard: \\033[41;37m ${parityshard} \\033[0m\"\n\t[ \"$dscp\" != \"${DEFAULT[DSCP]}\" ]               &amp;&amp; echo -e \"dscp: \\033[41;37m ${dscp} \\033[0m\"\n\t[ \"$nocomp\" != \"${DEFAULT[NOCOMP]}\" ]           &amp;&amp; echo -e \"nocomp: \\033[41;37m ${nocomp} \\033[0m\"\n\t[ \"$nodelay\" != \"${DEFAULT[NODELAY]}\" ]         &amp;&amp; echo -e \"nodelay: \\033[41;37m ${nodelay} \\033[0m\"\n\t[ \"$interval\" != \"${DEFAULT[INTERVAL]}\" ]       &amp;&amp; echo -e \"interval: \\033[41;37m ${interval} \\033[0m\"\n\t[ \"$resend\" != \"${DEFAULT[RESEND]}\" ]           &amp;&amp; echo -e \"resend: \\033[41;37m ${resend} \\033[0m\"\n\t[ \"$nc\" != \"${DEFAULT[NC]}\" ]                   &amp;&amp; echo -e \"nc: \\033[41;37m ${nc} \\033[0m\"\n\t[ \"$acknodelay\" != \"${DEFAULT[ACKNODELAY]}\" ]   &amp;&amp; echo -e \"acknodelay: \\033[41;37m ${acknodelay} \\033[0m\"\n\t[ \"$sockbuf\" != \"${DEFAULT[SOCKBUF]}\" ]         &amp;&amp; echo -e \"sockbuf: \\033[41;37m ${sockbuf} \\033[0m\"\n\t[ \"$keepalive\" != \"${DEFAULT[KEEPALIVE]}\" ]     &amp;&amp; echo -e \"keepalive: \\033[41;37m ${keepalive} \\033[0m\"\n}\n\n# \u5904\u7406\u624b\u673a\u7aef\u53c2\u6570\ngenerate_mobile_args() {\n\tkcptun_mobile_args=\"-autoexpire 60\"\n\n\t[ \"$key\" != \"${DEFAULT[KEY]}\" ]                 &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -key \\\"${key}\\\"\"\n\t[ \"$crypt\" != \"${DEFAULT[CRYPT]}\" ]             &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -crypt \\\"${crypt}\\\"\"\n\t[ \"$mode\" != \"${DEFAULT[MODE]}\" ]               &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -mode \\\"${mode}\\\"\"\n\t[ \"$mtu\" != \"${DEFAULT[MTU]}\" ]                 &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -mtu ${mtu}\"\n\t[ \"$datashard\" != \"${DEFAULT[DATASHARD]}\" ]     &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -datashard ${datashard}\"\n\t[ \"$parityshard\" != \"${DEFAULT[PARITYSHARD]}\" ] &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -parityshard ${parityshard}\"\n\t[ \"$dscp\" != \"${DEFAULT[DSCP]}\" ]               &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -dscp ${dscp}\"\n\t[ \"$nocomp\" != \"${DEFAULT[NOCOMP]}\" ]           &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -nocomp\"\n\t[ \"$nodelay\" != \"${DEFAULT[NODELAY]}\" ]         &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -nodelay ${nodelay}\"\n\t[ \"$interval\" != \"${DEFAULT[INTERVAL]}\" ]       &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -interval ${interval}\"\n\t[ \"$resend\" != \"${DEFAULT[RESEND]}\" ]           &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -resend ${resend}\"\n\t[ \"$nc\" != \"${DEFAULT[NC]}\" ]                   &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -nc ${nc}\"\n\t[ \"$acknodelay\" != \"${DEFAULT[ACKNODELAY]}\" ]   &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -acknodelay\"\n\t[ \"$sockbuf\" != \"${DEFAULT[SOCKBUF]}\" ]         &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -sockbuf ${sockbuf}\"\n\t[ \"$keepalive\" != \"${DEFAULT[KEEPALIVE]}\" ]     &amp;&amp; kcptun_mobile_args=\"${kcptun_mobile_args} -keepalive ${keepalive}\"\n}\n\nshow_recommend_config() {\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u53ef\u4f7f\u7528\u7684\u5ba2\u6237\u7aef\u914d\u7f6e\u6587\u4ef6\u4e3a:\n\t{\n\t    \"localaddr\": \":${target_port}\",\n\t    \"remoteaddr\": \"${SERVER_IP}:${listen_port}\",\n\t    \"key\": \"${key}\",\n\t    \"crypt\": \"${crypt}\",\n\t    \"mode\": \"${mode}\",\n\t    \"conn\": 1,\n\t    \"autoexpire\": 60,\n\t    \"mtu\": ${mtu},\n\t    \"sndwnd\": ${rcvwnd},\n\t    \"rcvwnd\": ${sndwnd},\n\t    \"datashard\": ${datashard},\n\t    \"parityshard\": ${parityshard},\n\t    \"dscp\": ${dscp},\n\t    \"nocomp\": ${nocomp},\n\t    \"acknodelay\": ${acknodelay},\n\t    \"nodelay\": ${nodelay},\n\t    \"interval\": ${interval},\n\t    \"resend\": ${resend},\n\t    \"nc\": ${nc},\n\t    \"sockbuf\": ${sockbuf},\n\t    \"keepalive\": ${keepalive}\n\t}\n\n\t\u624b\u673a\u7aef\u53c2\u6570\u53ef\u4ee5\u4f7f\u7528:\n\t${kcptun_mobile_args}\n\n\t\u5404\u53c2\u6570\u8be6\u7ec6\u8bf4\u660e\u53ef\u4ee5\u67e5\u770b: https:\/\/github.com\/xtaci\/kcptun\n\tEOF\n}\n\n# \u663e\u793a\u5b89\u88c5\u4fe1\u606f\nshow_installed_info() {\n\tshow_config_info\n\tshow_installed_version\n\tshow_recommend_config\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\tKcptun \u5b89\u88c5\u76ee\u5f55: ${KCPTUN_INSTALL_DIR}\n\tKcptun \u65e5\u5fd7\u76ee\u5f55: ${KCPTUN_LOG_DIR}\n\n\t\u5df2\u5c06 Supervisor \u52a0\u5165\u5f00\u673a\u81ea\u542f, Kcptun \u670d\u52a1\u7aef\u4f1a\u968f Supervisor \u7684\u542f\u52a8\u800c\u542f\u52a8\n\n\t\u66f4\u591a\u4f7f\u7528\u8bf4\u660e: ${0} help\n\n\t\u6b22\u8fce\u8bbf\u95ee\u6269\u8f6f\u535a\u5ba2: https:\/\/blog.kuoruan.com\/\n\t\u6211\u4eec\u7684QQ\u7fa4: 43391448\n\n\t\u5c3d\u60c5\u4f7f\u7528\u5427!\n\tEOF\n}\n\nget_new_instance_id() {\n\tif [ -f \"\/etc\/supervisor\/conf.d\/kcptun.conf\" ]; then\n\t\tlocal i=2\n\t\twhile [ -f \"\/etc\/supervisor\/conf.d\/kcptun${i}.conf\" ]\n\t\tdo\n\t\t\tlet i++\n\t\tdone\n\t\techo \"$i\"\n\tfi\n}\n\n# \u6dfb\u52a0\u5b9e\u4f8b\nadd_instance() {\n\tpermission_check\n\tlinux_check\n\tget_arch\n\tget_server_ip\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u4f60\u9009\u62e9\u4e86\u6dfb\u52a0\u5b9e\u4f8b, \u6b63\u5728\u5f00\u59cb\u64cd\u4f5c...\n\tEOF\n\n\tcurrent_id=\"$(get_new_instance_id)\"\n\n\tset_kcptun_config\n\tconfig_kcptun\n\tconfig_firewall\n\trestart_supervisor\n\tget_installed_version\n\tgenerate_mobile_args\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u606d\u559c, \u5b9e\u4f8b kcptun${current_id} \u6dfb\u52a0\u6210\u529f!\n\tEOF\n\n\tshow_config_info\n\tshow_installed_version\n\tshow_recommend_config\n}\n\n# \u5220\u9664\u5b9e\u4f8b\ndel_instance() {\n\tpermission_check\n\tlinux_check\n\tget_arch\n\n\tif [ -n \"$1\" ]; then\n\t\tif is_number $1; then\n\t\t\tif [ $1 -ne 1 ]; then\n\t\t\t\tcurrent_id=\"$1\"\n\t\t\tfi\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u53c2\u6570\u6709\u8bef, \u8bf7\u4f7f\u7528 $0 del &lt;id&gt;\n\t\t\t&lt;id&gt; \u4e3a\u5b9e\u4f8bID, \u5f53\u524d\u5171\u6709 $(get_instance_count) \u4e2a\u5b9e\u4f8b\n\t\t\tEOF\n\n\t\t\texit 1\n\t\tfi\n\tfi\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u4f60\u9009\u62e9\u4e86\u5220\u9664\u5b9e\u4f8b kcptun${current_id}, \u5b9e\u4f8b\u914d\u7f6e\u6587\u4ef6\u5220\u9664\u540e\u65e0\u6cd5\u6062\u590d\n\t\u6309\u4efb\u610f\u952e\u7ee7\u7eed...\u6216\u8005 Ctrl+C \u53d6\u6d88\n\tEOF\n\tany_key_to_continue\n\n\tlocal supervisor_config_file=\"$(get_current_supervisor_config_file)\"\n\tif [ ! -f \"$supervisor_config_file\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u4f60\u9009\u62e9\u7684\u5b9e\u4f8b kcptun${current_id} \u4e0d\u5b58\u5728!\n\t\tEOF\n\t\texit 1\n\tfi\n\n\trm -f \"$supervisor_config_file\"\n\trm -f \"$(get_current_config_file)\"\n\trm -f \"$(get_current_log_file)\"\n\trestart_supervisor\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u5b9e\u4f8b kcptun${current_id} \u5220\u9664\u6210\u529f!\n\tEOF\n}\n\n# \u5b89\u88c5 Kcptun\ninstall_kcptun() {\n\tpermission_check\n\tlinux_check\n\tinstalled_check\n\tdisable_selinux\n\tget_arch\n\tget_server_ip\n\tset_kcptun_config\n\tinstall_dependence\n\tget_kcptun_version_info\n\tdownload_file\n\tunpack_file\n\tconfig_kcptun\n\tdownlod_init_script\n\tinstall_service\n\tconfig_firewall\n\tinstall_cleanup\n\tget_installed_version\n\tgenerate_mobile_args\n\tshow_installed_info\n}\n\n# \u91cd\u65b0\u4e0b\u8f7d kcptun\nupdate_kcptun() {\n\tdownload_file\n\tunpack_file\n\trestart_supervisor\n\tinstall_cleanup\n\tshow_installed_version\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u606d\u559c, Kcptun \u670d\u52a1\u7aef\u66f4\u65b0\u5b8c\u6bd5!\n\tEOF\n}\n\n#\u624b\u52a8\u5b89\u88c5\nmanual_install() {\n\tpermission_check\n\tlinux_check\n\tget_arch\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u4f60\u9009\u62e9\u4e86\u81ea\u5b9a\u4e49\u7248\u672c\u5b89\u88c5, \u6b63\u5728\u5f00\u59cb\u64cd\u4f5c...\n\tEOF\n\n\tlocal tag_name=$1\n\twhile :\n\tdo\n\t\tif [ -z \"$tag_name\" ]; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u8bf7\u8f93\u5165\u4f60\u60f3\u5b89\u88c5\u7684 Kcptun \u7248\u672c\u7684\u5b8c\u6574 TAG\n\t\t\tEOF\n\t\t\tread -p \"(\u4f8b\u5982: v20160904): \" tag_name\n\t\t\techo\n\t\t\tif $(grep -qE \"\\w+\" &lt;&lt;&lt; \"$tag_name\"); then\n\n\t\t\t\tif [ \"$tag_name\" = \"SNMP_Milestone\" ]; then\n\t\t\t\t\techo \"\u4e0d\u652f\u6301\u6b64\u7248\u672c, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tunset tag_name\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\n\t\t\t\tlocal version_num\n\t\t\t\tversion_num=$(grep -oE \"[0-9]+\" &lt;&lt;&lt; \"$tag_name\") || version_num=0\n\t\t\t\tif [ ${#version_num} -eq 8 -a $version_num -le 20160826 ]; then\n\t\t\t\t\techo \"\u6682\u4e0d\u652f\u6301\u5b89\u88c5 v20160826 \u53ca\u4ee5\u524d\u7248\u672c\"\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\telse\n\t\t\t\techo \"\u8f93\u5165\u65e0\u6548, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\tcontinue\n\t\t\tfi\n\t\tfi\n\n\t\tget_kcptun_version_info $tag_name\n\t\tif [ $? -eq 2 ]; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t\t\u672a\u627e\u5230\u5bf9\u5e94\u7248\u672c\u4e0b\u8f7d\u5730\u5740 (TAG: ${tag_name}), \u8bf7\u91cd\u65b0\u8f93\u5165!\n\t\t\t\u4f60\u53ef\u4ee5\u524d\u5f80: ${KCPTUN_TAGS_URL} \u67e5\u770b\u6240\u6709\u53ef\u7528 TAG\n\t\t\tEOF\n\t\t\tunset tag_name\n\t\t\tcontinue\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\t\t\t\u5df2\u627e\u5230 Kcptun \u7248\u672c\u4fe1\u606f, TAG: ${tag_name}\n\t\t\t\u8bf7\u6309\u4efb\u610f\u952e\u7ee7\u7eed\u5b89\u88c5...\n\t\t\tEOF\n\t\t\tany_key_to_continue\n\t\t\tupdate_kcptun\n\t\t\tbreak\n\t\tfi\n\tdone\n}\n\n# \u9009\u62e9\u4e00\u4e2a\u5b9e\u4f8b\nselect_instance() {\n\n\tif [ $(get_instance_count) -gt 1 ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u5f53\u524d\u6709\u591a\u4e2a Kcptun \u5b9e\u4f8b (\u6309\u6700\u540e\u4fee\u6539\u65f6\u95f4\u6392\u5e8f):\n\t\tEOF\n\n\t\tlocal files=$(ls -lt \/etc\/supervisor\/conf.d\/ | grep \"^-\" | awk '{print $9}' | grep -P \"^kcptun\\d*\\.conf$\")\n\t\tlocal i=0\n\t\tlocal array=()\n\t\tfor file in $files\n\t\tdo\n\t\t\tlet i++\n\t\t\tarray[$i]=$(grep -oP \"\\d+\" &lt;&lt;&lt;\"$file\")\n\t\t\techo \"(${i}) \"${file%.*}\n\t\tdone\n\n\t\twhile :\n\t\tdo\n\t\t\tread -p \"(\u9ed8\u8ba4: 1) \u8bf7\u9009\u62e9 [1~${i}]: \" sel\n\t\t\tif [ -n \"$sel\" ]; then\n\t\t\t\tif is_number $sel &amp;&amp; [ $sel -ge 1 -a $sel -le $i ]; then\n\t\t\t\t\tcurrent_id=${array[$sel]}\n\t\t\t\telse\n\t\t\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\t\t\u8bf7\u8f93\u5165\u6709\u6548\u6570\u5b57 1~${i}!\n\t\t\t\t\tEOF\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\tfi\n\t\t\tbreak\n\t\tdone\n\tfi\n}\n\n# \u52a0\u8f7d\u5b9e\u4f8b\u914d\u7f6e\u4fe1\u606f\nload_instance_config() {\n\tlocal config_file=\"$(get_current_config_file)\"\n\n\tif [ ! -s \"$config_file\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u5b9e\u4f8b\u914d\u7f6e\u6587\u4ef6\u4e0d\u5b58\u5728\u6216\u4e3a\u7a7a, \u8bf7\u68c0\u67e5!\n\t\tEOF\n\n\t\texit 1\n\tfi\n\n\t[ ! -x \"$JQ\" ] &amp;&amp; install_jq\n\n\tif ! $($JQ -r '.' \"$config_file\" &gt;\/dev\/null 2&gt;&amp;1); then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u5b9e\u4f8b\u914d\u7f6e\u6587\u4ef6\u5b58\u5728\u9519\u8bef, \u8bf7\u68c0\u67e5!\n\t\t\u914d\u7f6e\u6587\u4ef6\u8def\u5f84: ${config_file}\n\t\tEOF\n\t\texit 1\n\tfi\n\n\tlocal lines=$($JQ -r 'to_entries | map(\"\\(.key)=\\(.value | @sh)\") | .[]' \"$config_file\")\n\n\twhile read -r line\n\tdo\n\t\teval \"$line\"\n\tdone &lt;&lt;&lt; \"$lines\"\n\n\t[ -n \"$listen\" ] &amp;&amp; listen_port=$(cut -d ':' -f2 &lt;&lt;&lt; \"$listen\")\n\tif [ -n \"$target\" ]; then\n\t\ttarget_ip=$(cut -d ':' -f1 &lt;&lt;&lt; \"$target\")\n\t\ttarget_port=$(cut -d ':' -f2 &lt;&lt;&lt; \"$target\")\n\tfi\n}\n\n# \u663e\u793a\u914d\u7f6e\u4fe1\u606f\nshow_instance_config() {\n\tpermission_check\n\tget_arch\n\n\tif [ -n \"$1\" ]; then\n\t\tif is_number $1; then\n\t\t\tif [ $1 -ne 1 ]; then\n\t\t\t\tcurrent_id=\"$1\"\n\t\t\tfi\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u53c2\u6570\u6709\u8bef, \u8bf7\u4f7f\u7528 $0 show &lt;id&gt;\n\t\t\t&lt;id&gt; \u4e3a\u5b9e\u4f8bID, \u5f53\u524d\u5171\u6709 $(get_instance_count) \u4e2a\u5b9e\u4f8b\n\t\t\tEOF\n\n\t\t\texit 1\n\t\tfi\n\tfi\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u4f60\u9009\u62e9\u4e86\u67e5\u770b\u5b9e\u4f8b kcptun${current_id} \u7684\u914d\u7f6e, \u6b63\u5728\u8bfb\u53d6...\n\tEOF\n\tget_server_ip\n\tload_instance_config\n\tget_installed_version\n\tgenerate_mobile_args\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u5b9e\u4f8b kcptun${current_id} \u7684\u914d\u7f6e\u4fe1\u606f\u5982\u4e0b:\n\tEOF\n\tshow_config_info\n\tshow_installed_version\n\tshow_recommend_config\n}\n\n# \u663e\u793a\u5b9e\u4f8b\u65e5\u5fd7\nshow_instance_log() {\n\tpermission_check\n\n\tif [ -n \"$1\" ]; then\n\t\tif is_number $1; then\n\t\t\tif [ $1 -ne 1 ]; then\n\t\t\t\tcurrent_id=\"$1\"\n\t\t\tfi\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u53c2\u6570\u6709\u8bef, \u8bf7\u4f7f\u7528 $0 log &lt;id&gt;\n\t\t\t&lt;id&gt; \u4e3a\u5b9e\u4f8bID, \u5f53\u524d\u5171\u6709 $(get_instance_count) \u4e2a\u5b9e\u4f8b\n\t\t\tEOF\n\n\t\t\texit 1\n\t\tfi\n\tfi\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u4f60\u9009\u62e9\u4e86\u67e5\u770b\u5b9e\u4f8b kcptun${current_id} \u7684\u65e5\u5fd7, \u6b63\u5728\u8bfb\u53d6...\n\tEOF\n\n\tlocal log_file=\"$(get_current_log_file)\"\n\n\tif [ -f \"$log_file\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u5b9e\u4f8b kcptun${current_id} \u7684\u65e5\u5fd7\u4fe1\u606f\u5982\u4e0b:\n\t\t\u6ce8: \u65e5\u5fd7\u5b9e\u65f6\u5237\u65b0, \u6309 Ctrl+C \u9000\u51fa\u65e5\u5fd7\u67e5\u770b\n\t\tEOF\n\t\ttail -n 20 -f \"$log_file\"\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u672a\u627e\u5230\u5b9e\u4f8b kcptun${current_id} \u7684\u65e5\u5fd7\u6587\u4ef6...\n\t\tEOF\n\n\t\texit 1\n\tfi\n}\n\nshow_installed_version() {\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u5f53\u524d\u5b89\u88c5\u7684 Kcptun \u7248\u672c\u4e3a: ${installed_kcptun_version}\n\t$([ -n \"$kcptun_release_html_url\" ]  &amp;&amp; echo \"\u8bf7\u524d\u5f80 ${kcptun_release_html_url} \u624b\u52a8\u4e0b\u8f7d\u5ba2\u6237\u7aef\u6587\u4ef6\")\n\tEOF\n}\n\nget_installed_version() {\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u83b7\u53d6\u5f53\u524d\u5b89\u88c5\u7684 Kcptun \u4fe1\u606f...\n\tEOF\n\n\tlocal kcptun_server_exec=\"$KCPTUN_INSTALL_DIR\"\/server_\"$FILE_SUFFIX\"\n\tif [ -x \"$kcptun_server_exec\" ]; then\n\t\tinstalled_kcptun_version=$(${kcptun_server_exec} -v | awk '{printf $3}')\n\telse\n\t\tunset installed_kcptun_version\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u627e\u5230\u5df2\u5b89\u88c5\u7684 Kcptun \u670d\u52a1\u7aef\u6267\u884c\u6587\u4ef6, \u6216\u8bb8\u4f60\u5e76\u6ca1\u6709\u5b89\u88c5 Kcptun?\n\t\t\u8bf7\u8fd0\u884c\u811a\u672c\u6765\u91cd\u65b0\u5b89\u88c5 Kcptun \u670d\u52a1\u7aef\n\t\tEOF\n\t\texit_with_error\n\tfi\n}\n\n# \u68c0\u67e5\u66f4\u65b0\ncheck_update() {\n\tpermission_check\n\tlinux_check\n\tget_arch\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u4f60\u9009\u62e9\u4e86\u68c0\u67e5\u66f4\u65b0, \u6b63\u5728\u5f00\u59cb\u64cd\u4f5c...\n\tEOF\n\n\tlocal shell_path=$0\n\tget_shell_version_info\n\n\tif [ -n \"$new_shell_version\" -a $new_shell_version -gt $SHELL_VERSION ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u53d1\u73b0\u4e00\u952e\u5b89\u88c5\u811a\u672c\u66f4\u65b0, \u7248\u672c\u53f7: ${new_shell_version}\n\t\t$(echo -e \"\u66f4\u65b0\u8bf4\u660e: \\n${shell_change_log}\")\n\n\t\t\u6309\u4efb\u610f\u952e\u5f00\u59cb\u66f4\u65b0, \u6216\u8005 Ctrl+C \u53d6\u6d88\n\t\tEOF\n\t\tany_key_to_continue\n\t\techo \"\u6b63\u5728\u66f4\u65b0\u4e00\u952e\u5b89\u88c5\u811a\u672c...\"\n\t\tmv -f \"$shell_path\" \"$shell_path\".bak\n\n\t\tif wget --no-check-certificate -O \"$shell_path\" \"$new_shell_url\"; then\n\t\t\tchmod a+x \"$shell_path\"\n\t\t\tsed -i -r \"s\/^CONFIG_VERSION=[0-9]+\/CONFIG_VERSION=${CONFIG_VERSION}\/\" \"$shell_path\"\n\t\t\tsed -i -r \"s\/^INIT_VERSION=[0-9]+\/INIT_VERSION=${INIT_VERSION}\/\" \"$shell_path\"\n\t\t\trm -f \"$shell_path\".bak\n\t\t\tclear\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u5b89\u88c5\u811a\u672c\u5df2\u66f4\u65b0\u5230 v${new_shell_version}, \u6b63\u5728\u8fd0\u884c\u65b0\u7684\u811a\u672c...\n\t\t\tEOF\n\n\t\t\tbash $shell_path update\n\t\t\texit 0\n\t\telse\n\t\t\tmv -f \"$shell_path\".bak $shell_path\n\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u4e0b\u8f7d\u65b0\u7684\u4e00\u952e\u5b89\u88c5\u811a\u672c\u5931\u8d25...\n\t\t\tEOF\n\t\tfi\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u53d1\u73b0\u4e00\u952e\u5b89\u88c5\u811a\u672c\u66f4\u65b0...\n\t\tEOF\n\tfi\n\n\tget_installed_version\n\tget_kcptun_version_info\n\n\tlocal cur_tag_name=\"$installed_kcptun_version\"\n\n\tif [ -n \"$cur_tag_name\" ] &amp;&amp; is_number $cur_tag_name &amp;&amp; [ ${#cur_tag_name} -eq 8 ]; then\n\t\tcur_tag_name=v\"$cur_tag_name\"\n\tfi\n\n\tif [ -n \"$kcptun_release_tag_name\" -a \"$kcptun_release_tag_name\" != \"$cur_tag_name\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u53d1\u73b0 Kcptun \u65b0\u7248\u672c ${kcptun_release_tag_name}\n\t\t$(echo -e \"\u66f4\u65b0\u8bf4\u660e: \\n${kcptun_release_name}\")\n\t\t$([ \"$kcptun_release_prerelease\" = \"true\" ] &amp;&amp; echo -e \"\\033[41;37m \u6ce8\u610f: \u8be5\u7248\u672c\u4e3a\u9884\u89c8\u7248, \u8bf7\u8c28\u614e\u66f4\u65b0 \\033[0m\")\n\n\t\t\u6309\u4efb\u610f\u952e\u5f00\u59cb\u66f4\u65b0, \u6216\u8005 Ctrl+C \u53d6\u6d88\n\t\tEOF\n\t\tany_key_to_continue\n\t\techo \"\u6b63\u5728\u81ea\u52a8\u66f4\u65b0 Kcptun...\"\n\t\tupdate_kcptun\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u53d1\u73b0 Kcptun \u66f4\u65b0...\n\t\tEOF\n\tfi\n\n\tif [ -n \"$new_config_version\" -a $new_config_version -gt $CONFIG_VERSION ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u53d1\u73b0 Kcptun \u914d\u7f6e\u66f4\u65b0, \u7248\u672c\u53f7: v${new_config_version}, \u9700\u8981\u91cd\u65b0\u8bbe\u7f6e Kcptun...\n\t\t$(echo -e \"\u66f4\u65b0\u8bf4\u660e: \\n${config_change_log}\")\n\n\t\t\u6309\u4efb\u610f\u952e\u5f00\u59cb\u914d\u7f6e, \u6216\u8005 Ctrl+C \u53d6\u6d88\n\t\tEOF\n\t\tany_key_to_continue\n\t\treconfig_instance\n\t\tsed -i \"s\/^CONFIG_VERSION=${CONFIG_VERSION}\/CONFIG_VERSION=${new_config_version}\/\" \"$shell_path\"\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u53d1\u73b0 Kcptun \u914d\u7f6e\u66f4\u65b0...\n\t\tEOF\n\tfi\n\n\tif [ -n \"$new_init_version\" -a $new_init_version -gt $INIT_VERSION ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u53d1\u73b0\u670d\u52a1\u542f\u52a8\u811a\u672c\u6587\u4ef6\u66f4\u65b0, \u7248\u672c\u53f7: v${new_init_version}\n\t\t$(echo -e \"\u66f4\u65b0\u8bf4\u660e: \\n${init_change_log}\")\n\n\t\t\u6309\u4efb\u610f\u952e\u5f00\u59cb\u66f4\u65b0, \u6216\u8005 Ctrl+C \u53d6\u6d88\n\t\tEOF\n\t\tany_key_to_continue\n\t\techo \"\u6b63\u5728\u81ea\u52a8\u66f4\u65b0\u542f\u52a8\u811a\u672c...\"\n\t\tdownlod_init_script\n\t\t[ \"$OS\" = \"CentOS\" -a $OS_VSRSION -eq 7 ] &amp;&amp; systemctl daemon-reload\n\n\t\tsed -i \"s\/^INIT_VERSION=${INIT_VERSION}\/INIT_VERSION=${new_init_version}\/\" \"$shell_path\"\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u670d\u52a1\u542f\u52a8\u811a\u672c\u5df2\u66f4\u65b0\u5230 v${new_init_version}, \u53ef\u80fd\u9700\u8981\u91cd\u542f\u670d\u52a1\u5668\u624d\u80fd\u751f\u6548!\n\t\tEOF\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u53d1\u73b0\u670d\u52a1\u542f\u52a8\u811a\u672c\u66f4\u65b0...\n\t\tEOF\n\tfi\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u6b63\u5728\u66f4\u65b0 Supervisor...\n\tEOF\n\n\teasy_install -U supervisor &gt;\/dev\/null 2&gt;&amp;1\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u66f4\u65b0\u64cd\u4f5c\u5df2\u5b8c\u6210!\n\tEOF\n}\n\n# \u5378\u8f7d Kcptun\nuninstall_kcptun() {\n\tpermission_check\n\tlinux_check\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u4f60\u9009\u62e9\u4e86\u5378\u8f7d Kcptun \u670d\u52a1\u7aef\n\t\u6309\u4efb\u610f\u952e\u7ee7\u7eed...\u6216\u8005 Ctrl+C \u53d6\u6d88\n\tEOF\n\tany_key_to_continue\n\techo \"\u6b63\u5728\u5378\u8f7d Kcptun \u670d\u52a1\u7aef\u5e76\u505c\u6b62 Supervisor...\"\n\tservice supervisord stop\n\n\tif [ \"$OS\" = \"CentOS\" ]; then\n\t\tif yum list installed | grep -q \"^jq\\.\"; then\n\t\t\tyum remove -y jq\n\t\tfi\n\telse\n\t\tif dpkg -l | grep -q \"\\sjq\\s\"; then\n\t\t\tapt-get remove --purge -y jq\n\t\tfi\n\tfi\n\n\trm -f \"$JQ\"\n\trm -f \"\/etc\/supervisor\/conf.d\/kcptun*.conf\"\n\trm -rf \"$KCPTUN_INSTALL_DIR\"\n\trm -rf \"$KCPTUN_LOG_DIR\"\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u662f\u5426\u540c\u65f6\u5378\u8f7d Supervisor ?\n\t\u6ce8\u610f: Supervisor \u7684\u914d\u7f6e\u6587\u4ef6\u5c06\u540c\u65f6\u88ab\u5220\u9664\n\tEOF\n\twhile :\n\tdo\n\t\tread -p \"(\u9ed8\u8ba4: \u4e0d\u5378\u8f7d) \u8bf7\u9009\u62e9 [y\/n]: \" yn\n\t\t[ -z \"$yn\" ] &amp;&amp; yn=\"n\"\n\t\tcase ${yn:0:1} in\n\t\t\ty|Y)\n\t\t\t\t;;\n\t\t\tn|N)\n\t\t\t\tbreak\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\tcontinue\n\t\t\t\t;;\n\t\tesac\n\n\t\tif [ \"$OS\" = \"CentOS\" ]; then\n\t\t\tchkconfig supervisord off\n\t\telse\n\t\t\tupdate-rc.d -f supervisord remove\n\t\tfi\n\n\t\trm -rf \"$(easy_install -mxN supervisor | grep 'Using.*supervisor.*\\.egg' | awk '{print $2}')\"\n\n\t\trm -f \/usr\/local\/bin\/echo_supervisord_conf\n\t\trm -f \/usr\/local\/bin\/pidproxy\n\t\trm -f \/usr\/local\/bin\/supervisorctl\n\t\trm -f \/usr\/local\/bin\/supervisord\n\t\trm -rf \/etc\/supervisor\/\n\t\trm -rf \/etc\/init.d\/supervisord\n\t\tbreak\n\tdone\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\tKcptun \u670d\u52a1\u7aef\u5378\u8f7d\u5b8c\u6210, \u6b22\u8fce\u518d\u6b21\u4f7f\u7528\u3002\n\t\u6ce8\u610f: \u811a\u672c\u6ca1\u6709\u81ea\u52a8\u5378\u8f7d python-setuptools (\u5305\u542b easy_install)\n\t\u5982\u6709\u9700\u8981, \u4f60\u53ef\u4ee5\u4f7f\u7528:\n\n\t    $([ \"${OS}\" = \"CentOS\" ] &amp;&amp; echo -n \"yum remove python-setuptools\" || echo -n \"apt-get remove --purge python-setuptools\")\n\n\t\u6765\u624b\u52a8\u5378\u8f7d\n\tEOF\n}\n\n# \u91cd\u542f Supervisor\nrestart_supervisor() {\n\tif [ -x \/etc\/init.d\/supervisord ]; then\n\n\t\tif [ -d \"$KCPTUN_LOG_DIR\" ]; then\n\t\t\trm -f \"$KCPTUN_LOG_DIR\"\/*\n\t\telse\n\t\t\tmkdir -p \"$KCPTUN_LOG_DIR\"\n\t\tfi\n\n\t\tif ! service supervisord restart; then\n\t\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\t\u91cd\u542f Supervisor \u5931\u8d25, Kcptun \u65e0\u6cd5\u6b63\u5e38\u542f\u52a8!\n\t\t\tEOF\n\n\t\t\texit_with_error\n\t\tfi\n\telse\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u672a\u627e\u5230 Supervisor \u670d\u52a1, \u8bf7\u624b\u52a8\u68c0\u67e5!\n\t\tEOF\n\n\t\texit_with_error\n\tfi\n\n\n}\n\n# \u91cd\u65b0\u914d\u7f6e\nreconfig_instance() {\n\tpermission_check\n\tlinux_check\n\n\tif [ -n \"$1\" ]; then\n\t\tif is_number $1; then\n\t\t\tif [ $1 -ne 1 ]; then\n\t\t\t\tcurrent_id=\"$1\"\n\t\t\tfi\n\t\telse\n\t\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\t\u53c2\u6570\u6709\u8bef, \u8bf7\u4f7f\u7528 $0 reconfig &lt;id&gt;\n\t\t\t&lt;id&gt; \u4e3a\u5b9e\u4f8bID, \u5f53\u524d\u5171\u6709 $(get_instance_count) \u4e2a\u5b9e\u4f8b\n\t\t\tEOF\n\n\t\t\texit 1\n\t\tfi\n\tfi\n\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u4f60\u9009\u62e9\u4e86\u91cd\u65b0\u914d\u7f6e\u5b9e\u4f8b kcptun${current_id}, \u6b63\u5728\u5f00\u59cb\u64cd\u4f5c...\n\tEOF\n\n\tif [ ! -f \"$(get_current_supervisor_config_file)\" ]; then\n\t\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\t\u4f60\u9009\u62e9\u7684\u5b9e\u4f8b kcptun${current_id} \u4e0d\u5b58\u5728!\n\t\tEOF\n\t\texit 1\n\tfi\n\n\tget_arch\n\tget_server_ip\n\n\twhile :\n\tdo\n\t\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\t\u8bf7\u9009\u62e9\u64cd\u4f5c:\n\t\t(1) \u91cd\u65b0\u914d\u7f6e\u5b9e\u4f8b\u6240\u6709\u9009\u9879\n\t\t(2) \u76f4\u63a5\u4fee\u6539\u5b9e\u4f8b\u914d\u7f6e\u6587\u4ef6\n\t\tEOF\n\t\tread -p \"(\u9ed8\u8ba4: 1) \u8bf7\u9009\u62e9: \" sel\n\t\techo\n\t\tif [ -n \"$sel\" ]; then\n\t\t\tcase ${sel:0:1} in\n\t\t\t\t1)\n\t\t\t\t\t;;\n\t\t\t\t2)\n\t\t\t\t\techo \"\u6b63\u5728\u6253\u5f00\u914d\u7f6e\u6587\u4ef6, \u8bf7\u624b\u52a8\u4fee\u6539...\"\n\t\t\t\t\tlocal config_file=\"$(get_current_config_file)\"\n\n\t\t\t\t\tif [ -f \"$config_file\" ]; then\n\t\t\t\t\t\tif command_exists vim; then\n\t\t\t\t\t\t\tvim \"$config_file\"\n\t\t\t\t\t\t\tload_instance_config\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\telif command_exists vi; then\n\t\t\t\t\t\t\tvi \"$config_file\"\n\t\t\t\t\t\t\tload_instance_config\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\telif command_exists gedit; then\n\t\t\t\t\t\t\tgedit \"$config_file\"\n\t\t\t\t\t\t\tload_instance_config\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\techo \"\u672a\u627e\u5230\u53ef\u7528\u7684\u7f16\u8f91\u5668, \u6b63\u5728\u8fdb\u5165\u5168\u65b0\u914d\u7f6e...\"\n\t\t\t\t\t\tfi\n\t\t\t\t\telse\n\t\t\t\t\t\techo \"\u914d\u7f6e\u6587\u4ef6\u4e0d\u5b58\u5728, \u6b63\u5728\u8fdb\u5165\u5168\u65b0\u914d\u7f6e...\"\n\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\techo \"\u8f93\u5165\u6709\u8bef, \u8bf7\u91cd\u65b0\u8f93\u5165!\"\n\t\t\t\t\tcontinue\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\n\t\tset_kcptun_config\n\t\tconfig_kcptun\n\t\tconfig_firewall\n\t\tbreak\n\tdone\n\n\trestart_supervisor\n\n\tcat &gt;&amp;2 &lt;&lt;-'EOF'\n\n\t\u606d\u559c, Kcptun \u670d\u52a1\u7aef\u914d\u7f6e\u5df2\u66f4\u65b0!\n\tEOF\n\tget_installed_version\n\tgenerate_mobile_args\n\tshow_config_info\n\tshow_installed_version\n\tshow_recommend_config\n}\n\nusage() {\n\tcat &gt;&amp;2 &lt;&lt;-EOF\n\n\t\u8bf7\u4f7f\u7528: $0 &lt;option&gt;\n\n\t\u53ef\u4f7f\u7528\u7684\u53c2\u6570 &lt;option&gt; \u5305\u62ec:\n\n\t    install          \u5b89\u88c5\n\t    uninstall        \u5378\u8f7d\n\t    update           \u68c0\u67e5\u66f4\u65b0\n\t    manual           \u81ea\u5b9a\u4e49 Kcptun \u7248\u672c\u5b89\u88c5\n\t    help             \u67e5\u770b\u811a\u672c\u4f7f\u7528\u8bf4\u660e\n\t    add              \u6dfb\u52a0\u4e00\u4e2a\u5b9e\u4f8b, \u591a\u7528\u6237\u4f7f\u7528\n\t    reconfig &lt;id&gt;    \u91cd\u65b0\u914d\u7f6e\u5b9e\u4f8b\n\t    show &lt;id&gt;        \u663e\u793a\u5b9e\u4f8b\u8be6\u7ec6\u914d\u7f6e\n\t    log &lt;id&gt;         \u663e\u793a\u5b9e\u4f8b\u65e5\u5fd7\n\t    del &lt;id&gt;         \u5220\u9664\u4e00\u4e2a\u5b9e\u4f8b\n\n\t\u6ce8: \u4e0a\u8ff0\u53c2\u6570\u4e2d\u7684 &lt;id&gt; \u53ef\u9009, \u4ee3\u8868\u7684\u662f\u5b9e\u4f8b\u7684ID\n\t    \u53ef\u4f7f\u7528 1, 2, 3 ... \u5206\u522b\u5bf9\u5e94\u5b9e\u4f8b kcptun, kcptun2, kcptun3 ...\n\t    \u82e5\u4e0d\u6307\u5b9a &lt;id&gt;, \u5219\u9ed8\u8ba4\u4e3a 1\n\n\tSupervisor \u547d\u4ee4:\n\t    service supervisord {start|stop|restart|status}\n\t                        {\u542f\u52a8|\u5173\u95ed|\u91cd\u542f|\u67e5\u770b\u72b6\u6001}\n\tKcptun \u76f8\u5173\u547d\u4ee4:\n\t    supervisorctl {start|stop|restart|status} kcptun&lt;id&gt;\n\t                  {\u542f\u52a8|\u5173\u95ed|\u91cd\u542f|\u67e5\u770b\u72b6\u6001}\n\tEOF\n}\n\n# \u521d\u59cb\u5316\u811a\u672c\u52a8\u4f5c\naction=${1:-\"install\"}\ncase $action in\n\tinstall)\n\t\tinstall_kcptun\n\t\t;;\n\tuninstall)\n\t\tuninstall_kcptun\n\t\t;;\n\tupdate)\n\t\tcheck_update\n\t\t;;\n\treconfig)\n\t\treconfig_instance $2\n\t\t;;\n\tmanual)\n\t\tmanual_install $2\n\t\t;;\n\tshow)\n\t\tshow_instance_config $2\n\t\t;;\n\tlog)\n\t\tshow_instance_log $2\n\t\t;;\n\tadd)\n\t\tadd_instance\n\t\t;;\n\tdel)\n\t\tdel_instance $2\n\t\t;;\n\thelp|*)\n\t\tusage\n\t\t;;\nesac\n\nexit 0<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\t\t\t\t\t\t&#8230; <\/p>\n<div class=\"read-more navbutton\"><a href=\"http:\/\/www.zhangyijun.com\/?p=9\">\u9605\u8bfb\u66f4\u591a<i class=\"fa fa-angle-double-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=\/wp\/v2\/posts\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9"}],"version-history":[{"count":0,"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=\/wp\/v2\/posts\/9\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.zhangyijun.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}