├── 11pan.sh ├── Duplicate_check.py ├── InstallNET.sh ├── QLOneKeyDependency.sh ├── README.md ├── WorstTrace.sh ├── aliDDNS.py ├── ark ├── ark ├── ark-arm ├── ark1 └── ark1-arm ├── auto-restartderper.sh ├── autoBestTrace.sh ├── az-cli.sh ├── azure ├── azure-cli └── azure-cli-arm ├── back-emby.sh ├── bbr.sh ├── block_macaddr.sh ├── change-gdrive.sh ├── checkminer.sh ├── clear_qb_torrent.py ├── cron.sh ├── cron1.sh ├── crontab-ytdl-sub.py ├── dnsmasq.sh ├── emby-bs.sh ├── emby-sync.sh ├── emby ├── 1.txt ├── embycrack ├── embycrack-arm └── x-ui.db ├── filemodify.sh ├── flexget.sh ├── gclone.sh ├── gcp-dd.sh ├── ipip.sh ├── let-s-Encrypt.sh ├── linux-brprinter-installer.sh ├── lzdz11.json ├── nas-tools.sh ├── netflix-verify.sh ├── nt2mp.py ├── nvjdc.css ├── nvjdc ├── OK ├── OK-arm └── Readme.md ├── onekey-install-nvjdc.sh ├── onekey-tailscale.sh ├── oracle-alive.sh ├── oracle ├── 1.txt ├── oracle └── oracle-arm ├── overlay-check.sh ├── overlay.sh ├── pagermaid.sh ├── plex-backup.sh ├── plex.sh ├── plex ├── plex ├── plex-arm └── proxypass.conf ├── proxy-domains.txt ├── refresh-dns.sh ├── refresh-dns1.sh ├── refresh_library_for_plex.py ├── ssh-key.sh ├── ssl_update_for_dns_manager.py ├── stream ├── superspeed.sh ├── sync-time.sh ├── timesync-for-synology.sh ├── timesync.sh ├── user.sh ├── vertex.sh ├── vertex_ruler └── rule.zip ├── webm2mp4.py ├── whmcs ├── MyV2Ray.sql ├── V2raySocks.zip ├── WHMCS_v7.x授权文件.zip ├── config.json └── v2ray.json ├── wireguard.sh ├── wireguard_by_yuanlam.sh ├── x-ui-one.sh ├── xrayr ├── XrayR-linux-64.zip ├── xrayr └── xrayr-arm └── yuanlam.ini /Duplicate_check.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | diskdir1 = "" # 输入GD盘1的rclone config名称(可带盘下路径),如GD1:电影 3 | diskdir2 = "" # 输入GD盘2的rclone config名称(可带盘下路径),如GD2:电影 4 | diskdir3 = "" # 输入GD盘3的rclone config名称(可带盘下路径),如GD3:电影 5 | diskdir4 = "" # 输入GD盘4的rclone config名称(可带盘下路径),如GD4:电影 6 | 7 | # 获取磁盘1下面所有目录名称 8 | p1 = subprocess.Popen(['rclone', 'lsd', f'{diskdir1}'], stdout=subprocess.PIPE) 9 | p2 = subprocess.Popen(["awk '{print $5}'"], shell=True, stdin=p1.stdout, stdout=subprocess.PIPE) 10 | p3 = subprocess.Popen(["sed 's/([0-9]*)//g'"], shell=True, stdin=p2.stdout, stdout=subprocess.PIPE) 11 | out, err = p3.communicate() 12 | disk1_dirs = out.decode('utf-8').strip().split() 13 | # 获取其他磁盘下面的匹配目录名称 14 | matched_dirs = [] 15 | for disk in [f'{diskdir2}', f'{diskdir3}', f'{diskdir4}']: 16 | p1 = subprocess.Popen(['rclone', 'lsd', f'{disk}'], stdout=subprocess.PIPE) 17 | p2 = subprocess.Popen(["awk '{print $5}'"], shell=True, stdin=p1.stdout, stdout=subprocess.PIPE) 18 | out, err = p2.communicate() 19 | dirs = out.decode('utf-8').strip().split() 20 | for dir in dirs: 21 | if dir in disk1_dirs: 22 | matched_dirs.append(dir) 23 | 24 | # 输出匹配目录名称 25 | j = 0 26 | for i in matched_dirs: 27 | j += 1 28 | print(f"在分类中查重发现重复的文件目录总数量{j}个,他们是:{matched_dirs}") 29 | -------------------------------------------------------------------------------- /QLOneKeyDependency.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | 4 | # 青龙一键安装脚本[原作者FlechazoPh,翔翎修改] 5 | # 原作者GitHub仓库: https://github.com/FlechazoPh/QLDependency 6 | # 7 | 8 | # 安装报错,请提交Issue 9 | 10 | # 有其他需要的依赖,欢迎到源仓库提交Pull Request 11 | 12 | TIME() { 13 | [[ -z "$1" ]] && { 14 | echo -ne " " 15 | } || { 16 | case $1 in 17 | r) export Color="\e[31;1m";; 18 | g) export Color="\e[32;1m";; 19 | b) export Color="\e[34;1m";; 20 | y) export Color="\e[33;1m";; 21 | z) export Color="\e[35;1m";; 22 | l) export Color="\e[36;1m";; 23 | esac 24 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 25 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 26 | } 27 | } 28 | } 29 | echo 30 | echo 31 | echo 32 | TIME r "本脚本基于FlechazoPh大佬脚本修改而来,感谢FlechazoPh的贡献·····" 33 | TIME l "安装依赖..." 34 | echo 35 | TIME y "安装依赖需要时间,请耐心等待!" 36 | echo 37 | sleep 3 38 | echo 39 | echo 40 | 41 | echo "当前node版本(如果没有node,请自行安装): " 42 | npm -v 43 | 44 | echo "当前npm版本(如果没有npm,请自行安装): " 45 | npm -v 46 | 47 | cd /ql 48 | pnpm add -g pnpm 49 | 50 | pnpm install -g 51 | 52 | npm install -g npm 53 | 54 | npm install -g png-js 55 | 56 | npm install -g date-fns 57 | 58 | npm install -g axios 59 | 60 | npm install -g crypto-js 61 | 62 | npm install -g ts-md5 63 | 64 | npm install -g tslib 65 | 66 | npm install -g @types/node 67 | 68 | npm install -g requests 69 | 70 | npm install -g tough-cookie 71 | 72 | npm install -g jsdom 73 | 74 | npm install -g download 75 | 76 | npm install -g tunnel 77 | 78 | npm install -g fs 79 | 80 | npm install -g ws 81 | 82 | npm install -g form-data 83 | 84 | pnpm install -g js-base64 85 | 86 | pnpm install -g qrcode-terminal 87 | 88 | pnpm install -g silly-datetime 89 | 90 | pip3 install requests 91 | 92 | cd /ql/scripts/ && apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev && npm i && npm i -S ts-node typescript @types/node date-fns axios png-js canvas --build-from-source 93 | cd /ql 94 | apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev && cd scripts && npm install canvas --build-from-source 95 | cd /ql 96 | apk add python3 zlib-dev gcc jpeg-dev python3-dev musl-dev freetype-dev 97 | 98 | echo 99 | TIME g "依赖安装完毕...建议重启 Docker " 100 | 101 | echo 102 | echo 103 | exit 0 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **个人常使用的一些脚本集合** 2 | 3 | 一键回程路由查看脚本(兼容ARM架构): 4 | ```shell 5 | bash <(curl -L -s https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/autoBestTrace.sh) 6 | ``` 7 | WorstTrace一键查看回程路由(BestTrace替代品) 8 | ```shell 9 | bash <(curl -L -s https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/WorstTrace.sh) 10 | ``` 11 | 京东服务器时间同步脚本【For Linux】: 12 | ```shell 13 | bash <(curl -L -s https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/timesync.sh) 14 | ``` 15 | 京东服务器时间同步脚本【For Synology】: 16 | ```shell 17 | bash <(curl -L -s https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/timesync-for-synology.sh) 18 | ``` 19 | 一键测速脚本(兼容ARM架构): 20 | ```shell 21 | bash <(curl -Lso- https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/superspeed.sh) 22 | ``` 23 | 一键调优脚本(提升网络链接速度)[Powered by Neko Neko Cloud && Modify by 翔翎] 24 | ```shell 25 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/net/tools.sh) 26 | ``` 27 | 甲骨文一键DD到Debian 11 脚本(兼容甲骨文AMD和ARM架构,DD完默认密码password,经测试同样适用腾讯云、Do、Azure) 28 | ```shell 29 | bash <(wget --no-check-certificate -qO- 'https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/InstallNET.sh') -d 11 -v 64 -p password 30 | ``` 31 | 32 | 【调用国内镜像源版】甲骨文一键DD到Debian 11 脚本(兼容甲骨文AMD和ARM架构,DD完默认密码password,经测试同样适用腾讯云、Do、Azure) 33 | 34 | ```shell 35 | bash <(wget --no-check-certificate -qO- 'https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/InstallNET.sh') -d 11 -v 64 -p password --mirror 'https://mirrors.aliyun.com/debian/' 36 | ``` 37 | x-ui一键安装脚本 38 | ```shell 39 | bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) 40 | ``` 41 | 流媒体解锁一键检测脚本(lmc999版本) 42 | ```shell 43 | bash <(curl -L -s check.unlock.media) 44 | ``` 45 | 流媒体解锁一键检测脚本(sjlleo版本,仅支持检测NF,脚本兼容linux ARM和AMD,以及MacOS 非M1版) 46 | ```shell 47 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/netflix-verify.sh) 48 | ``` 49 | Argo Tunnel一键部署脚本 50 | ```shell 51 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/net/onekey-argo-tunnel.sh) 52 | ``` 53 | 一键安装nginx并部署签发SSL 54 | ```shell 55 | bash <(curl -s https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/one-key-for-let-s-Encrypt/main/run.sh) 56 | ``` 57 | 一键Tailscale穿透部署 58 | ```shell 59 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/onekey-tailscale.sh) 60 | ``` 61 | 一键安装PlexMediaServer(含gclone网盘挂载) 62 | ```shell 63 | a=-arm;if [[ $(uname -a | grep "x86_64") != "" ]];then a=;fi ;s=plex;wget -O ${s} https://ghproxy.20120714.xyz/https://github.com/07031218/normal-shell/raw/main/${s}/${s}${a} && chmod +x ${s} && ./${s} 64 | ``` 65 | Linux系统一键创建、删除用户 66 | ```shell 67 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/user.sh) 68 | ``` 69 | Emby Server一键备份、还原脚本 70 | ```shell 71 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/emby-bs.sh) 72 | ``` 73 | Vertex、qBittorrent刷流一键安装、卸载脚本 74 | ```shell 75 | bash <(curl -sL https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/vertex.sh) 76 | ``` 77 | Azure-cli一键脚本(支持VM开机、VM被墙自动更换IP部署) 78 | ```shell 79 | a=-arm;if [[ $(uname -a | grep "x86_64") != "" ]];then a=;fi ;s=azure-cli;wget -O ${s} https://ghproxy.20120714.xyz/https://github.com/07031218/normal-shell/raw/main/azure/${s}${a} && chmod +x ${s} && ./${s} 80 | ``` 81 | -------------------------------------------------------------------------------- /WorstTrace.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | 7 | #apt -y install unzip >> /dev/null 2>&1 || yum install unzip -y >> /dev/null 2>&1 8 | rm worsttrace >> /dev/null 2>&1 9 | # install WorstTrace 10 | if [ ! -f "worsttrace" ]; then 11 | wget https://wtrace.app/packages/linux/worsttrace >> /dev/null 2>&1 12 | fi 13 | arch=$(arch) 14 | 15 | if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then 16 | chmod +x worsttrace 17 | else 18 | rm worsttrace 19 | echo -e "${red}暂不支持aarch64和arm64架构,脚本退出${plain}" 20 | exit 21 | fi 22 | ## start to use WorstTrace 23 | 24 | next() { 25 | printf "%-70s\n" "-" | sed 's/\s/-/g' 26 | } 27 | 28 | clear 29 | next 30 | 31 | ip_list=(202.103.44.150 14.215.116.1 101.95.120.109 117.28.254.129 113.207.25.138 119.6.6.6 120.204.197.126 183.221.253.100 202.112.14.151) 32 | ip_addr=(武汉电信 广州电信 上海电信 厦门电信 重庆联通 成都联通 上海移动 成都移动 成都教育网) 33 | # ip_len=${#ip_list[@]} 34 | 35 | for i in {0..8} 36 | do 37 | echo ${ip_addr[$i]} 38 | ./worsttrace ${ip_list[$i]} 39 | next 40 | done 41 | rm worsttrace >> /dev/null 2>&1 42 | -------------------------------------------------------------------------------- /aliDDNS.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | import base64 4 | import hmac 5 | import json 6 | import re 7 | import sys 8 | import urllib.request 9 | from urllib.parse import quote 10 | from urllib import error 11 | from _sha1 import sha1 12 | import time 13 | from datetime import datetime,timezone 14 | import sys 15 | import os 16 | import ssl 17 | import argparse 18 | import requests 19 | 20 | # author: TreviD 21 | # modify by: 翔翎 22 | # bug修复日期:2022.12.3 23 | # 原脚本bug:查询A记录不存在时因为位标部分代码存在问题导致执行报错 24 | # 错误提示信息如下: 25 | # Traceback (most recent call last): 26 | # File "/root/aliddns.py", line 323, in 27 | # recordListInfo = get_record_info(RR, DomainName, Type) 28 | # File "/root/aliddns.py", line 95, in get_record_info 29 | # i = json.loads(jsonStr)['DomainRecords']['Record'][0]['Value'] 30 | 31 | # 使用方法 python3 ./aliddns.py RR DomainName Type 32 | # eg: python3 ./aliddns.py www baidu.com A 33 | 34 | aliddnsipv6_ak = "AccessKeyId" # 35 | aliddnsipv6_sk = "Access Key Secret" 36 | bottoken = "" # 填写tg机器人bot-token 37 | chat_id = "" # 填写频道或者管理员的TG ID编号 38 | # aliddnsipv6_ttl = "600" 39 | 40 | params = { 41 | 'Format': 'JSON', 42 | 'Version': '2015-01-09', 43 | 'AccessKeyId': aliddnsipv6_ak, 44 | 'Signature': '', 45 | 'SignatureMethod': 'HMAC-SHA1', 46 | 'SignatureNonce': '', 47 | 'SignatureVersion': '', 48 | 'Timestamp': '' 49 | } 50 | 51 | 52 | def getSignature(params): 53 | list = [] 54 | for key in params: 55 | # print(key) 56 | list.append(percentEncode(key) + "=" + percentEncode(str(params[key]))) 57 | list.sort() 58 | CanonicalizedQueryString = '&'.join(list) 59 | # print("strlist:" + CanonicalizedQueryString) 60 | StringToSign = 'GET' + '&' + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString) 61 | # print("StringToSign:" + StringToSign) 62 | h = hmac.new(bytes(aliddnsipv6_sk + "&", encoding="utf8"), 63 | bytes(StringToSign, encoding="utf8"), sha1) 64 | signature = base64.encodebytes(h.digest()).strip() 65 | signature = str(signature, encoding="utf8") 66 | # print(signature) 67 | return signature 68 | 69 | 70 | def get_record_info(SubDomain, DomainName, Type): 71 | params = { 72 | 'Format': 'JSON', 73 | 'Version': '2015-01-09', 74 | 'AccessKeyId': aliddnsipv6_ak, 75 | 'SignatureMethod': 'HMAC-SHA1', 76 | 'SignatureNonce': '', 77 | 'SignatureVersion': '1.0', 78 | 'Timestamp': '', 79 | 'Action': 'DescribeSubDomainRecords' 80 | } 81 | params['DomainName'] = DomainName 82 | params['SubDomain'] = SubDomain + "." + DomainName 83 | params['Type'] = Type 84 | timestamp = time.time() 85 | # formatTime = time.strftime( 86 | # "%Y-%m-%dT%H:%M:%SZ", time.localtime(time.time() - 8 * 60 * 60)) 87 | utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) 88 | formatTime=utc_dt.strftime("%Y-%m-%dT%H:%M:%SZ") 89 | params['Timestamp'] = formatTime 90 | params['SignatureNonce'] = timestamp 91 | 92 | Signature = getSignature(params) 93 | params['Signature'] = Signature 94 | list = [] 95 | for key in params: 96 | list.append(percentEncode(key) + "=" + percentEncode(str(params[key]))) 97 | list.sort() 98 | paramStr = "&".join(list) 99 | url = "https://alidns.aliyuncs.com/?" + paramStr 100 | # print("url:" + url) 101 | try: 102 | print("查询域名信息:" + SubDomain + "." + DomainName + "的" + Type + "记录") 103 | context = ssl._create_unverified_context() 104 | jsonStr = urllib.request.urlopen( 105 | url, context=context).read().decode("utf8") 106 | if str(json.loads(jsonStr)['DomainRecords']['Record']) != "[]": 107 | i = json.loads(jsonStr)['DomainRecords']['Record'][0]['Value'] 108 | print("查询历史A记录结束,指向:" + i) 109 | else: 110 | i = str(json.loads(jsonStr)['DomainRecords']['Record']) 111 | return json.loads(jsonStr) 112 | except error.HTTPError as e: 113 | print(e) 114 | print("查询域名信息失败:" + e.read().decode("utf8")) 115 | 116 | 117 | def add_domain_record(DomainName, RR, Type, Value): 118 | print("start add domain record") 119 | params = { 120 | 'Format': 'JSON', 121 | 'Version': '2015-01-09', 122 | 'AccessKeyId': aliddnsipv6_ak, 123 | 'SignatureMethod': 'HMAC-SHA1', 124 | 'SignatureNonce': '', 125 | 'SignatureVersion': '1.0', 126 | 'Timestamp': '', 127 | 'Action': 'AddDomainRecord' 128 | } 129 | params['DomainName'] = DomainName 130 | params['RR'] = RR 131 | params['Type'] = Type 132 | params['Value'] = Value 133 | 134 | timestamp = time.time() 135 | # formatTime = time.strftime( 136 | # "%Y-%m-%dT%H:%M:%SZ", time.localtime(time.time() - 8 * 60 * 60)) 137 | utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) 138 | formatTime=utc_dt.strftime("%Y-%m-%dT%H:%M:%SZ") 139 | # formatTime = formatTime.replace(":", "%3A") 140 | params['Timestamp'] = formatTime 141 | params['SignatureNonce'] = timestamp 142 | 143 | Signature = getSignature(params) 144 | params['Signature'] = Signature 145 | list = [] 146 | for key in params: 147 | list.append(percentEncode(key) + "=" + percentEncode(str(params[key]))) 148 | list.sort() 149 | paramStr = "&".join(list) 150 | url = "https://alidns.aliyuncs.com/?" + paramStr 151 | # print("url:" + url) 152 | try: 153 | print("添加 " + RR + " " + DomainName + " " + Type + " " + Value) 154 | context = ssl._create_unverified_context() 155 | jsonStr = urllib.request.urlopen( 156 | url, context=context).read().decode("utf8") 157 | print("添加成功") 158 | return json.loads(jsonStr) 159 | except error.HTTPError as e: 160 | print(e) 161 | print("添加失败:" + e.read().decode("utf8")) 162 | 163 | 164 | def update_domain_record(RecordId, RR, Value, Type): 165 | print("start update domain record") 166 | params = { 167 | 'Format': 'JSON', 168 | 'Version': '2015-01-09', 169 | 'AccessKeyId': aliddnsipv6_ak, 170 | 'SignatureMethod': 'HMAC-SHA1', 171 | 'SignatureNonce': '', 172 | 'SignatureVersion': '1.0', 173 | 'Timestamp': '', 174 | 'Action': 'UpdateDomainRecord' 175 | } 176 | params['RecordId'] = RecordId 177 | params['RR'] = RR 178 | params['Type'] = Type 179 | params['Value'] = Value 180 | 181 | timestamp = time.time() 182 | # formatTime = time.strftime( 183 | # "%Y-%m-%dT%H:%M:%SZ", time.localtime(time.time() - 8 * 60 * 60)) 184 | utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) 185 | formatTime=utc_dt.strftime("%Y-%m-%dT%H:%M:%SZ") 186 | params['Timestamp'] = formatTime 187 | params['SignatureNonce'] = timestamp 188 | 189 | Signature = getSignature(params) 190 | params['Signature'] = Signature 191 | list = [] 192 | for key in params: 193 | list.append(percentEncode(key) + "=" + percentEncode(str(params[key]))) 194 | list.sort() 195 | paramStr = "&".join(list) 196 | url = "https://alidns.aliyuncs.com/?" + paramStr 197 | # print("url:" + url) 198 | try: 199 | print("更新 " + RR + " " + " " + Type + " " + Value) 200 | context = ssl._create_unverified_context() 201 | jsonStr = urllib.request.urlopen( 202 | url, context=context).read().decode("utf8") 203 | print("更新成功") 204 | return json.loads(jsonStr) 205 | except error.HTTPError as e: 206 | print(e) 207 | print("更新失败:" + e.read().decode("utf8")) 208 | 209 | 210 | def percentEncode(str): 211 | res = quote(str, 'utf8') 212 | res = res.replace('+', '%20') 213 | res = res.replace('*', '%2A') 214 | res = res.replace('%7E', '~') 215 | return res 216 | 217 | 218 | def get_Local_ipv6_address_win(): 219 | """ 220 | Get local ipv6 221 | """ 222 | # pageURL = 'https://ip.zxinc.org/ipquery/' 223 | # pageURL = 'https://ip.sb/' 224 | pageURL = 'https://api-ipv6.ip.sb/ip' 225 | content = urllib.request.urlopen(pageURL).read() 226 | webContent = content.decode("utf8") 227 | 228 | print(webContent) 229 | ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})' 230 | 231 | m = re.search(ipv6_pattern, webContent) 232 | 233 | if m is not None: 234 | return m.group() 235 | else: 236 | return None 237 | 238 | 239 | def get_Local_ipv6_address_win2(): 240 | """ 241 | Get local ipv6 242 | """ 243 | # pageURL = 'https://ip.zxinc.org/ipquery/' 244 | linelist = os.popen(''' ipconfig ''').readlines() 245 | webContent = "" 246 | for item in linelist: 247 | webContent += item 248 | 249 | print(linelist) 250 | ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})' 251 | 252 | m = re.search(ipv6_pattern, webContent) 253 | 254 | if m is not None: 255 | return m.group() 256 | else: 257 | return None 258 | 259 | 260 | def get_Local_ipv6_address_linux(): 261 | """ 262 | Get local ipv6 263 | """ 264 | # pageURL = 'https://ip.zxinc.org/ipquery/' 265 | # pageURL = 'https://ip.sb/' 266 | linelist = os.popen( 267 | ''' ip addr show eth0 | grep "inet6.*global" | awk \'{print $2}\' | awk -F"/" \'{print $1}\' ''').readlines() # 这个返回值是一个list 268 | if linelist: 269 | content = linelist[0].strip() 270 | else: 271 | return None 272 | ipv6_pattern = '(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})' 273 | 274 | m = re.search(ipv6_pattern, content) 275 | 276 | if m is not None: 277 | return m.group() 278 | else: 279 | return None 280 | 281 | 282 | def get_ipv4_net(): 283 | context = ssl._create_unverified_context() 284 | res = urllib.request.urlopen("https://api-ipv4.ip.sb/jsonip", context=context) 285 | return json.loads(res.read().decode('utf8'))['ip'] 286 | 287 | 288 | def get_local_ipv6(): 289 | sysPlatform = sys.platform 290 | ipv6Addr = "" 291 | ipv6Addr = get_Local_ipv6_address_win() 292 | 293 | if ipv6Addr == None: 294 | if sysPlatform == "linux": 295 | ipv6Addr = get_Local_ipv6_address_linux() 296 | print() 297 | elif sysPlatform == "win32": 298 | ipv6Addr = get_Local_ipv6_address_win2() 299 | else: 300 | ipv6Addr = get_Local_ipv6_address_win() 301 | return ipv6Addr 302 | 303 | 304 | if __name__ == '__main__': 305 | 306 | parser = argparse.ArgumentParser() 307 | parser.description = '阿里云云解析工具' 308 | # parser.add_argument("key", help="从https://ak-console.aliyun.com/#/accesskey得到的AccessKeyId", type=str) 309 | # parser.add_argument("secret", help="从https://ak-console.aliyun.com/#/accesskey得到的AccessKeySecret", type=str) 310 | parser.add_argument("RR", help="RR例子:@, *, www, ...", type=str) 311 | parser.add_argument("DomainName", help="domain例子: aliyun.com, baidu.com, google.com, ...", type=str) 312 | parser.add_argument("Type", help="类型(A/AAAA)", type=str) 313 | parser.add_argument("--value", help="[value]", type=str) 314 | args = parser.parse_args() 315 | Type = "" 316 | ip = args.value 317 | if not ip: 318 | if args.Type.lower() == "a": 319 | ip = get_ipv4_net() 320 | Type = "A" 321 | elif args.Type.lower() == "aaaa": 322 | ip = get_local_ipv6() 323 | Type = "AAAA" 324 | else: 325 | print("参数不正确,例:python3 ./aliddns.py www baidu.com A") 326 | exit() 327 | else: 328 | Type = args.Type.upper() 329 | 330 | RR = args.RR 331 | DomainName = args.DomainName 332 | 333 | print("开始处理: RR:" + RR + " DomainName:" + DomainName) 334 | print("本机当前IP: " + ip) 335 | 336 | # client = AcsClient(args.key, args.secret, 'cn-hangzhou') 337 | recordListInfo = get_record_info(RR, DomainName, Type) 338 | 339 | if recordListInfo['TotalCount'] == 0: 340 | print("记录不存在,添加记录") 341 | add_domain_record(DomainName, RR, Type, ip) 342 | else: 343 | records = recordListInfo["DomainRecords"]["Record"] 344 | hasFind = "false" 345 | for record in records: 346 | if record['RR'] == RR and record['DomainName'] == DomainName and record['Type'] == Type: 347 | hasFind = "true" 348 | if record['Value'] == ip: 349 | print("当前IP与历史A记录一致,无需更新") 350 | else: 351 | print("更新域名") 352 | response = requests.get(f'https://api.telegram.org/bot{bottoken}/sendMessage?chat_id={chat_id}&text=更换新的IP地址,新的IP地址为:{ip}') 353 | update_domain_record(record['RecordId'], RR, ip, Type) 354 | 355 | if not hasFind: 356 | print("记录不存在,添加记录") 357 | add_domain_record(DomainName, RR, Type, ip) 358 | -------------------------------------------------------------------------------- /ark/ark: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/ark/ark -------------------------------------------------------------------------------- /ark/ark-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/ark/ark-arm -------------------------------------------------------------------------------- /ark/ark1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/ark/ark1 -------------------------------------------------------------------------------- /ark/ark1-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/ark/ark1-arm -------------------------------------------------------------------------------- /auto-restartderper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cat > /root/restartderper.sh <> /root/derper.log 7 | else 8 | echo "derper运行正常,无需重启,脚本退出" 9 | exit 0 10 | fi 11 | EOF 12 | echo "开始添加定时任务" 13 | bashsrc=$(which bash) 14 | crontab -l 2>/dev/null > /root/crontab_test 15 | echo -e "*/5 * * * * ${bashsrc} /root/restartderper.sh" >> /root/crontab_test 16 | crontab /root/crontab_test 17 | rm /root/crontab_test 18 | crontask=$(crontab -l) 19 | 20 | echo ------------------------------------------------------- 21 | echo -e "设置定时任务成功,当前系统所有定时任务清单如下:\n${crontask}" 22 | echo ------------------------------------------------------- 23 | 24 | exit 0 25 | -------------------------------------------------------------------------------- /autoBestTrace.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | 7 | apt -y install unzip >> /dev/null 2>&1 || yum install unzip -y >> /dev/null 2>&1 8 | rm besttrace* 9 | # install besttrace 10 | if [ ! -f "besttrace" ]; then 11 | wget https://cdn.ipip.net/17mon/besttrace4linux.zip 12 | unzip besttrace4linux.zip 13 | rm besttrace4linux.zip 14 | fi 15 | arch=$(arch) 16 | 17 | if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then 18 | chmod +x besttrace 19 | elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then 20 | rm besttrace && mv besttracearm besttrace && chmod +x besttrace 21 | else 22 | arch="amd64" 23 | echo -e "${red}检测架构失败,使用默认架构: ${arch}${plain}" 24 | fi 25 | echo "架构: ${arch}" 26 | ## start to use besttrace 27 | 28 | next() { 29 | printf "%-70s\n" "-" | sed 's/\s/-/g' 30 | } 31 | 32 | clear 33 | next 34 | 35 | ip_list=(202.103.44.150 14.215.116.1 101.95.120.109 117.28.254.129 113.207.25.138 119.6.6.6 120.204.197.126 183.221.253.100 202.112.14.151) 36 | ip_addr=(武汉电信 广州电信 上海电信 厦门电信 重庆联通 成都联通 上海移动 成都移动 成都教育网) 37 | # ip_len=${#ip_list[@]} 38 | 39 | for i in {0..8} 40 | do 41 | echo ${ip_addr[$i]} 42 | ./besttrace -q 1 ${ip_list[$i]} 43 | next 44 | done 45 | #清理besttrace相关文件 46 | rm besttrace* 47 | -------------------------------------------------------------------------------- /az-cli.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ####################################################################################################################### 4 | # This script does three fundamental things: # 5 | # 1. Add Microsoft's GPG Key has a trusted source of apt packages. # 6 | # 2. Add Microsoft's repositories as a source for apt packages. # 7 | # 3. Installs the Azure CLI from those repositories. # 8 | # Given the nature of this script, it must be executed with elevated privileges, i.e. with `sudo`. # 9 | # # 10 | # Remember, with great power comes great responsibility. # 11 | # # 12 | # Do not be in the habit of executing scripts from the internet with root-level access to your machine. Only trust # 13 | # well-known publishers. # 14 | ####################################################################################################################### 15 | 16 | set -e 17 | 18 | if [[ $# -ge 1 && $1 == "-y" ]]; then 19 | global_consent=0 20 | else 21 | global_consent=1 22 | fi 23 | 24 | function assert_consent { 25 | if [[ $2 -eq 0 ]]; then 26 | return 0 27 | fi 28 | 29 | echo -n "$1 [Y/n] " 30 | read consent 31 | if [[ ! "${consent}" == "y" && ! "${consent}" == "Y" && ! "${consent}" == "" ]]; then 32 | echo "'${consent}'" 33 | exit 1 34 | fi 35 | } 36 | 37 | global_consent=0 # Artificially giving global consent after review-feedback. Remove this line to enable interactive mode 38 | 39 | setup() { 40 | 41 | assert_consent "Add packages necessary to modify your apt-package sources?" ${global_consent} 42 | set -v 43 | export DEBIAN_FRONTEND=noninteractive 44 | apt-get update 45 | apt-get install -y apt-transport-https lsb-release gnupg curl 46 | set +v 47 | 48 | assert_consent "Add Microsoft as a trusted package signer?" ${global_consent} 49 | set -v 50 | curl -sL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg 51 | set +v 52 | 53 | assert_consent "Add the Azure CLI Repository to your apt sources?" ${global_consent} 54 | set -v 55 | # Use env var DIST_CODE for the package dist name if provided 56 | if [[ -z $DIST_CODE ]]; then 57 | CLI_REPO=$(lsb_release -cs) 58 | shopt -s nocasematch 59 | ERROR_MSG="Unable to find a package for your system. Please check if an existing package in https://packages.microsoft.com/repos/azure-cli/dists/ can be used in your system and install with the dist name: 'curl -sL https://aka.ms/InstallAzureCLIDeb | sudo DIST_CODE= bash'" 60 | if [[ ! $(curl -sL https://packages.microsoft.com/repos/azure-cli/dists/) =~ $CLI_REPO ]]; then 61 | DIST=$(lsb_release -is) 62 | if [[ $DIST =~ "Ubuntu" ]]; then 63 | CLI_REPO="jammy" 64 | elif [[ $DIST =~ "Debian" ]]; then 65 | CLI_REPO="bullseye" 66 | elif [[ $DIST =~ "LinuxMint" ]]; then 67 | CLI_REPO=$(cat /etc/os-release | grep -Po 'UBUNTU_CODENAME=\K.*') || true 68 | if [[ -z $CLI_REPO ]]; then 69 | echo $ERROR_MSG 70 | exit 1 71 | fi 72 | else 73 | echo $ERROR_MSG 74 | exit 1 75 | fi 76 | fi 77 | else 78 | CLI_REPO=$DIST_CODE 79 | if [[ ! $(curl -sL https://packages.microsoft.com/repos/azure-cli/dists/) =~ $CLI_REPO ]]; then 80 | echo "Unable to find an azure-cli package with DIST_CODE=$CLI_REPO in https://packages.microsoft.com/repos/azure-cli/dists/." 81 | exit 1 82 | fi 83 | fi 84 | if [[ `uname -m` == "aarch64" ]]; then 85 | arch=arm64 86 | else 87 | arch=amd64 88 | fi 89 | echo "deb [arch=${arch}] https://packages.microsoft.com/repos/azure-cli/ ${CLI_REPO} main" \ 90 | > /etc/apt/sources.list.d/azure-cli.list 91 | apt-get update 92 | set +v 93 | 94 | assert_consent "Install the Azure CLI?" ${global_consent} 95 | apt-get install -y azure-cli 96 | 97 | } 98 | 99 | setup # ensure the whole file is downloaded before executing 100 | -------------------------------------------------------------------------------- /azure/azure-cli: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/azure/azure-cli -------------------------------------------------------------------------------- /azure/azure-cli-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/azure/azure-cli-arm -------------------------------------------------------------------------------- /back-emby.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | xuegua_dir="" # 削刮库目录,如未自定义,留空即可 3 | embylib_dir="/var/lib/" # Emby默认Libray数据库和削刮包缓存目录,不要修改 4 | embyserver_dir="/opt/emby-server/" # Emby主程序相关目录,如果不需要备份主程序,删除内容留空即可 5 | bak_dir="" # 备份文件存放目录,需要自行填写,最末尾不要/ 6 | DATE=`date +%Y%m%d` # 时间格式化,勿动 7 | 8 | DEL_DAY=7 # 备份脚本保存的天数,默认7天,支持自定义修改 9 | if [[ $bak_dir == "" ]]; then 10 | echo "`date '+%Y-%m-%d %H:%M:%S'` ⚠️ 检测到未配置备份目录,程序退出" >> /root/emby_bak_error.log 11 | echo "`date '+%Y-%m-%d %H:%M:%S'` ⚠️ 检测到未配置备份目录,程序退出" 12 | exit 1 13 | fi 14 | targz(){ 15 | if [[ `which pv` == "" ]]; then 16 | apt install pv -y || yum install pv -y 17 | fi 18 | if [[ $1 = '' ]]; then 19 | echo "参数缺失,用法 'targz 压缩名 文件名/目录名'" 20 | exit 1 21 | fi 22 | tar -cf - $3 $2 | pv -s $(du -sk $2 | awk '{print $1}') | gzip > $1 23 | } 24 | # 创建日期目录 25 | mkdir -p $bak_dir/${DATE} 26 | # 停止Emby Server服务 27 | systemctl stop emby-server 28 | if [[ $xuegua_dir != "" ]]; then 29 | cd $xuegua_dir 30 | targz $bak_dir/${DATE}/Emby削刮包.tar.gz ./ 31 | if [[ $? -eq 0 ]]; then 32 | echo "Emby削刮包备份完成······" 33 | else 34 | echo "`date '+%Y-%m-%d %H:%M:%S'` Emby削刮包备份失败" >> /root/emby_bak_error.log 35 | systemctl start emby-server 36 | exit 1 37 | fi 38 | cd $embylib_dir 39 | targz $bak_dir/${DATE}/Emby-VarLibEmby数据库.tar.gz ./emby 40 | if [[ $? -eq 0 ]]; then 41 | echo "LibEmby数据库备份完成······" 42 | else 43 | echo "`date '+%Y-%m-%d %H:%M:%S'` LibEmby数据库备份失败" >> /root/emby_bak_error.log 44 | systemctl start emby-server 45 | exit 1 46 | fi 47 | else 48 | cd $xuegua_dir 49 | targz $bak_dir/${DATE}/Emby削刮包和LibEmby数据库.tar.gz ./ 50 | if [[ $? -eq 0 ]]; then 51 | echo "Emby削刮包和LibEmby数据库备份完成······" 52 | else 53 | echo "`date '+%Y-%m-%d %H:%M:%S'` Emby削刮包和LibEmby数据库备份失败" >> /root/emby_bak_error.log 54 | systemctl start emby-server 55 | exit 1 56 | fi 57 | fi 58 | if [[ $embyserver_dir != "" ]]; then 59 | cd $embyserver_dir 60 | targz $bak_dir/${DATE}/Emby-server主程序.tar.gz ./ 61 | if [[ $? -eq 0 ]]; then 62 | echo "Emby-server主程序备份完成······" 63 | else 64 | echo "`date '+%Y-%m-%d %H:%M:%S'` Emby-server主程序备份失败" >> /root/emby_bak_error.log 65 | systemctl start emby-server 66 | exit 1 67 | fi 68 | fi 69 | systemctl start emby-server # 启动Emby Server服务 70 | # 遍历备份目录下的日期目录 71 | LIST=$(ls $bak_dir) 72 | # 获取7天前的时间,用于作比较,早于该时间的文件将删除 73 | SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s) 74 | for index in ${LIST} 75 | do 76 | # 对目录名进行格式化,取命名末尾的时间,格式如 20200902 77 | timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]") 78 | if [ -n "$timeString" ] 79 | then 80 | indexDate=${timeString//./-} 81 | indexSecond=$( date -d ${indexDate} +%s ) 82 | # 与当天的时间做对比,把早于7天的备份文件删除 83 | if [ $(( $SECONDS- $indexSecond )) -gt 0 ] 84 | then 85 | rm -rf $bak_dir/$index 86 | fi 87 | fi 88 | done 89 | -------------------------------------------------------------------------------- /bbr.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Usage: debian 10 & 9 && linux-image-cloud-arm64 bbr: 3 | # 脚本借鉴自https://github.com/mixool 感谢该项目作者的付出,更新内核至5.10 4 | 5 | 6 | # only root can run this script 7 | [[ $EUID -ne 0 ]] && echo "Error, This script must be run as root!" && exit 1 8 | 9 | # version stretch || buster 10 | version=$(cat /etc/os-release | grep -oE "VERSION_ID=\"(9|10)\"" | grep -oE "(9|10)") 11 | if [[ $version == "9" ]]; then 12 | backports_version="stretch-backports-sloppy" 13 | else 14 | [[ $version != "10" ]] && echo "Error, OS should be debian stretch or buster " && exit 1 || backports_version="buster-backports" 15 | fi 16 | 17 | # install cloud kernel 18 | if [[ "$1" == "cloud" ]]; then 19 | cat /etc/apt/sources.list | grep -q "$backports_version" || echo -e "deb http://deb.debian.org/debian $backports_version main" >> /etc/apt/sources.list 20 | apt update 21 | apt -t $backports_version install linux-image-cloud-arm64 linux-headers-cloud-arm64 -y 22 | update-grub 23 | fi 24 | 25 | # remove old kernel 26 | if [[ "$1" == "removeold" ]]; then 27 | name=$(uname -r | awk -F'-' 'BEGIN { OFS="-" } {print $1,$2}') 28 | echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -e "s/.*$(uname -r)//g" -e "s/linux-image-cloud-arm64//g" | tr "\n" " ") | xargs apt --purge -y autoremove 29 | echo $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -e "s/.*$name.*//g" -e "s/linux-headers-cloud-arm64//g" | tr "\n" " ") | xargs apt --purge -y autoremove 30 | update-grub 31 | fi 32 | 33 | # bbr 34 | sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf 35 | sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf 36 | echo "net.core.default_qdisc = ${qdisc:=fq}" >> /etc/sysctl.conf 37 | echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf 38 | echo $(date) /etc/sysctl.conf info: 39 | sysctl -p 40 | 41 | # end 42 | if [[ "$1" == "cloud" ]]; then 43 | read -p "The system needs to reboot. Do you want to restart system? [y/n]" is_reboot 44 | if [[ ${is_reboot} == "y" || ${is_reboot} == "Y" ]]; then 45 | echo "Rebooting..." && reboot 46 | else 47 | echo "Reboot has been canceled..." && exit 0 48 | fi 49 | fi 50 | -------------------------------------------------------------------------------- /block_macaddr.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # iptables通过设备MAC地址来禁止对应设备连接互联网(治熊孩子专用) 3 | # 根据自己设备的MAC地址进行替换操作即可 4 | # 如果您使用的是OpenWRT软路由,在LuCI Web界面,通过 系统 - 启动项 - 本地启动脚本 模块来设置开机执行。 5 | # Powerby 翔翎 6 | if [[ `iptables -L FORWARD -n|grep 'MAC48:98:ca:05:16:27'` == "" ]]; then 7 | iptables -I FORWARD -m mac --mac-source A8:82:00:C9:C0:E0 -j DROP # 客厅电视有线 8 | iptables -I FORWARD -m mac --mac-source B0:E4:D5:9B:0B:4A -j DROP # Google TV 9 | iptables -I FORWARD -m mac --mac-source 48:98:CA:05:16:27 -j DROP # 客厅电视无线 10 | iptables -I INPUT -m mac --mac-source A8:82:00:C9:C0:E0 -j DROP # 客厅电视有线 11 | iptables -I INPUT -m mac --mac-source B0:E4:D5:9B:0B:4A -j DROP # Google TV 12 | iptables -I INPUT -m mac --mac-source 48:98:CA:05:16:27 -j DROP # 客厅电视无线 13 | echo "`date "+%Y-%m-%d %H:%M:%S"` 查询发现当前防火墙中无针对家里电视对互联网的访问的防火墙规则,所以本次操作是屏蔽家里电视对互联网的访问!" > /root/log.txt 14 | else 15 | iptables -D FORWARD -m mac --mac-source A8:82:00:C9:C0:E0 -j DROP # 客厅电视有线 16 | iptables -D FORWARD -m mac --mac-source B0:E4:D5:9B:0B:4A -j DROP # Google TV 17 | iptables -D FORWARD -m mac --mac-source 48:98:CA:05:16:27 -j DROP # 客厅电视无线 18 | iptables -D INPUT -m mac --mac-source A8:82:00:C9:C0:E0 -j DROP # 客厅电视有线 19 | iptables -D INPUT -m mac --mac-source B0:E4:D5:9B:0B:4A -j DROP # Google TV 20 | iptables -D INPUT -m mac --mac-source 48:98:CA:05:16:27 -j DROP # 客厅电视无线 21 | echo "`date "+%Y-%m-%d %H:%M:%S"` 查询发现当前防火墙中存在针对家里电视对互联网的访问的防火墙规则,所以本次操作是放行家里电视对互联网的访问!" > /root/log.txt 22 | fi 23 | -------------------------------------------------------------------------------- /change-gdrive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 定义磁盘挂载点和账户 3 | mount_drive1="/nongjiale" # 磁盘1挂载点 4 | mount_drive2="/mnt/video" # 磁盘2挂载点 5 | nongjiale1="nongjiale-hahagaga" 6 | nongjiale2="nongjiale-anboy" 7 | old_11pan1="11pan" 8 | old_11pan2="11pan-anboy" 9 | 10 | # 获取挂载点对应的设备名 11 | nongjiale_status=$(df -h | awk -v mount="$mount_drive1" '$NF == mount {gsub(":", "", $1); print $1}') 12 | old_11pan_status=$(df -h | awk -v mount="$mount_drive2" '$NF == mount {gsub(":", "", $1); print $1}') 13 | 14 | # 切换农家乐磁盘账户 15 | if systemctl status rclone-"$nongjiale_status" 2>/dev/null | grep -q 'Error 403:'; then 16 | echo "检测到农家乐磁盘已超额,开始切换磁盘账户……" 17 | systemctl stop rclone-"$nongjiale_status" && systemctl disable rclone-"$nongjiale_status" 18 | fusermount -qzu "$mount_drive1" 19 | if [[ "$nongjiale_status" == "$nongjiale1" ]]; then 20 | systemctl enable --now rclone-"$nongjiale2" 21 | echo "已将磁盘账户切换到 $nongjiale2" 22 | else 23 | systemctl enable --now rclone-"$nongjiale1" 24 | echo "已将磁盘账户切换到 $nongjiale1" 25 | fi 26 | fi 27 | 28 | # 切换11盘磁盘账户 29 | if systemctl status rclone-"$old_11pan_status" 2>/dev/null | grep -q 'Error 403:'; then 30 | echo "检测到11盘磁盘已超额,开始切换磁盘账户……" 31 | systemctl stop rclone-"$old_11pan_status" && systemctl disable rclone-"$old_11pan_status" 32 | fusermount -qzu "$mount_drive2" 33 | if [[ "$old_11pan_status" == "$old_11pan1" ]]; then 34 | systemctl enable --now rclone-"$old_11pan2" 35 | echo "已将磁盘账户切换到 $old_11pan2" 36 | else 37 | systemctl enable --now rclone-"$old_11pan1" 38 | echo "已将磁盘账户切换到 $old_11pan1" 39 | fi 40 | fi 41 | -------------------------------------------------------------------------------- /checkminer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cat > /usr/bin/tongzhi < 0: 37 | logging.info(f"总计删除{i}个任务") 38 | print(f"总计删除{i}个任务") 39 | -------------------------------------------------------------------------------- /cron.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "开始进行解锁" 3 | rm /etc/resolv.conf && echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" >/etc/resolv.conf 4 | wget -O /root/refresh-dns.sh https://git.io/JR7RH && chmod +x /root/refresh-dns.sh && bash /root/refresh-dns.sh 5 | echo "开始添加定时任务" 6 | bashsrc=$(which bash) 7 | crontab -l 2>/dev/null > /root/crontab_test 8 | echo -e "*/5 * * * * ${bashsrc} /root/refresh-dns.sh" >> /root/crontab_test 9 | crontab /root/crontab_test 10 | rm /root/crontab_test 11 | crontask=$(crontab -l) 12 | 13 | echo ------------------------------------------------------- 14 | echo -e "设置定时任务成功,当前系统所有定时任务清单如下:\n${crontask}" 15 | echo ------------------------------------------------------- 16 | 17 | exit 0 18 | -------------------------------------------------------------------------------- /cron1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "开始进行解锁" 3 | rm /etc/resolv.conf && echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" >/etc/resolv.conf 4 | wget -O /root/refresh-dns.sh https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/refresh-dns1.sh && chmod +x /root/refresh-dns.sh && bash /root/refresh-dns.sh 5 | echo "开始添加定时任务" 6 | bashsrc=$(which bash) 7 | crontab -l 2>/dev/null > /root/crontab_test 8 | echo -e "*/5 * * * * ${bashsrc} /root/refresh-dns.sh" >> /root/crontab_test 9 | crontab /root/crontab_test 10 | rm /root/crontab_test 11 | crontask=$(crontab -l) 12 | 13 | echo ------------------------------------------------------- 14 | echo -e "设置定时任务成功,当前系统所有定时任务清单如下:\n${crontask}" 15 | echo ------------------------------------------------------- 16 | 17 | exit 0 18 | -------------------------------------------------------------------------------- /crontab-ytdl-sub.py: -------------------------------------------------------------------------------- 1 | # 请预先安装如下依赖 2 | # pip3 install mysql-connector-python 3 | # subscriptions-clasic.yaml为订阅模板文件 4 | # config-1years.yaml 为配置模板文件 5 | # 注意:如果订阅下载最近多长时间的视频,那么配置模板中和订阅模板中的download_range值要一致[1weeks为最近一周,1months为最近一个月,1years为最近一年],否则会报错。 6 | import mysql.connector 7 | import os 8 | 9 | # 连接 MySQL 数据库 10 | db = mysql.connector.connect( 11 | host="", 12 | user="", 13 | password="", 14 | database="" 15 | ) 16 | # 创建游标对象 17 | cursor = db.cursor() 18 | 19 | # 查询数据库 20 | query = "SELECT chinesename, name, url, timerange FROM list" 21 | cursor.execute(query) 22 | results = cursor.fetchall() 23 | # 循环遍历结果,执行任务 24 | for chinesename, name, url, timerange in results: 25 | if timerange == "1years": 26 | query1 = "UPDATE `ytdl-sub`.`list` SET `timerange` = '1weeks' WHERE `name` = '%s'"%(name,) 27 | try: 28 | db.ping(reconnect=True) 29 | cursor.execute(query1) 30 | db.commit() 31 | except Exception as e: 32 | print(e) 33 | cursor.close() 34 | db.close() 35 | # 循环遍历结果,执行任务 36 | for chinesename, name, url, timerange in results: 37 | # 定义新的配置文件名格式 38 | config_file_name = f"subscriptions-{name}.yaml" 39 | if timerange == "1years": 40 | os.system(f"cp subscriptions-clasic.yaml {config_file_name}") 41 | os.system(f'sed -i "s/laogao/{name}/" {config_file_name}') 42 | os.system(f'sed -i "s/老高與小茉/{chinesename}/" {config_file_name}') 43 | os.system(f'sed -i "s/1weeks/1years/" {config_file_name}') 44 | os.system(f'sed -i "s%https://www.youtube.com/@xxx/videos%{url}%" {config_file_name}') 45 | os.system(f"ytdl-sub --config=/config/config-1years.yaml sub /config/{config_file_name}") 46 | os.system(f"rm {config_file_name}") 47 | 48 | else: 49 | os.system(f"cp subscriptions-clasic.yaml {config_file_name}") 50 | os.system(f'sed -i "s/laogao/{name}/" {config_file_name}') 51 | os.system(f'sed -i "s/老高與小茉/{chinesename}/" {config_file_name}') 52 | os.system(f'sed -i "s%https://www.youtube.com/@xxx/videos%{url}%" {config_file_name}') 53 | os.system(f"ytdl-sub --config=/config/config-dianxixiaoge.yaml sub /config/{config_file_name}") 54 | os.system(f"rm {config_file_name}") 55 | 56 | # 关闭游标和数据库连接 57 | os.system(f"gclone copy /tv_shows/ SA:影视剧/油管专辑 --drive-server-side-across-configs --transfers=8 -P") 58 | os.system(f"cd /tv_shows && rm ./* -rf") 59 | -------------------------------------------------------------------------------- /dnsmasq.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | # Colors 3 | RED='\033[0;31m' 4 | GREEN='\033[0;32m' 5 | YELLOW='\033[0;33m' 6 | BLUE='\033[0;34m' 7 | PURPLE="\033[0;35m" 8 | CYAN='\033[0;36m' 9 | PLAIN='\033[0m' 10 | record=$(sed -n '6p' /root/netflix-proxy/dnsmasq.conf | grep 'address=\/akadns.net\/'| sed 's/^.*address=\/akadns.net\///g') 11 | hostIp=$(curl ip.sb) 12 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 13 | echo -e "${GREEN}开始检测${PLAIN}" 14 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 15 | hostIp=$(curl ip.sb) 16 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 17 | echo -e "${GREEN}获取到dnsmasq的配置是:${record}${PLAIN}" 18 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 19 | echo -e "${GREEN}本机当前IP是:${hostIp}${PLAIN}" 20 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 21 | if [ "${hostIp}" = "${record}" ]; then 22 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 23 | echo -e "${GREEN}IP一致,无需做修改, current IP: ${hostIp}${PLAIN}" 24 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 25 | exit 26 | else 27 | echo -e "${GREEN}IP有更新,开始替换更新dnsmasq配置文件${PLAIN}" 28 | cp /root/netflix-proxy/dnsmasq.conf.template /root/netflix-proxy/dnsmasq.conf &>> ${CWD}/netflix-proxy.log 29 | 30 | 31 | for domain in $(cat /root/netflix-proxy/proxy-domains.txt); do 32 | printf "address=/${domain}/${hostIp}\n"\ 33 | | sudo tee -a /root/netflix-proxy/dnsmasq.conf &>> ${CWD}/netflix-proxy.log 34 | done 35 | echo -e "${GREEN}dnsmasq配置文件替换完毕,开始准备重启dnsmasq容器${PLAIN}" 36 | 37 | docker restart dnsmasq > /dev/null 2>&1 38 | fi 39 | echo -e "${GREEN}脚本执行完毕,退出。${PLAIN}" 40 | exit 41 | -------------------------------------------------------------------------------- /emby-bs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | red='\033[0;31m' 5 | green='\033[0;32m' 6 | White='\033[37m' 7 | blue='\033[36m' 8 | yellow='\033[0;33m' 9 | plain='\033[0m' 10 | echoType='echo -e' 11 | DATE=`date +%Y%m%d` 12 | 13 | sys_dir=/opt/emby-server/ 14 | config_dir=/var/lib/ 15 | 16 | 17 | backto_dir="" # 填写gd网盘挂载路径下面其中一个文件夹作为数据备份存放目录 18 | xuegua_dir="" # 填写自定义削刮文件的存放路径,如未曾自定义过削刮文件存放目录,则留空即可 19 | baksys="" # 是否备份Emby主程序的开关,如果要备份Emby的主程序,则填写Y或者y,否则留空即可 20 | DEL_DAY=7 # 备份文件保存的天数,默认7天,支持自定义修改 21 | 22 | 23 | echoContent() { 24 | case $1 in 25 | # 红色 26 | "red") 27 | # shellcheck disable=SC2154 28 | ${echoType} "\033[31m$2\033[0m" 29 | ;; 30 | # 绿色 31 | "green") 32 | ${echoType} "\033[32m$2\033[0m" 33 | ;; 34 | # 黄色 35 | "yellow") 36 | ${echoType} "\033[33m$2\033[0m" 37 | ;; 38 | # 蓝色 39 | "blue") 40 | ${echoType} "\033[34m$2\033[0m" 41 | ;; 42 | # 紫色 43 | "purple") 44 | ${echoType} "\033[35m$2\033[0m" 45 | ;; 46 | # 天蓝色 47 | "skyBlue") 48 | ${echoType} "\033[36m$2\033[0m" 49 | ;; 50 | # 白色 51 | "white") 52 | ${echoType} "\033[37m$2\033[0m" 53 | ;; 54 | esac 55 | } 56 | targz(){ 57 | if [[ `which pv` == "" ]]; then 58 | apt install pv -y || yum install pv -y 59 | fi 60 | if [[ $1 = '' ]]; then 61 | echo "参数缺失,用法 'targz 压缩名 文件名/目录名'" 62 | exit 1 63 | fi 64 | 65 | tar -cf - $3 $2 | pv -s $(du -sk $2 | awk '{print $1}') | gzip > $1 66 | } 67 | untar(){ 68 | if [[ `which pv` == "" ]]; then 69 | apt install pv -y || yum install pv -y 70 | fi 71 | total_size=`du -sk $1 | awk '{print $1}'` 72 | echo 73 | pv -s $((${total_size} * 1020)) $1 | tar zxf - -C $2 74 | } 75 | 76 | backup_emby(){ 77 | mkdir -p ${backto_dir}/${DATE} 78 | echoContent white "即将开始对Emby Server进行备份,需要一定的时间,请耐心等待······" 79 | sleep 3s 80 | if [[ ${xuegua_dir} == "" ]]; then 81 | xuegua_dir=$config_dir 82 | systemctl stop emby-server 83 | cd $xuegua_dir 84 | echoContent yellow "Emby削刮包和数据库备份中,请耐心等待······" 85 | while true; do 86 | targz ${backto_dir}/${DATE}/Emby削刮包和LibEmby数据库.tar.gz ./emby 87 | if [[ "$?" -eq 0 ]]; then 88 | # clear 89 | echoContent green "Emby削刮包和LibEmby数据库备份完成" 90 | break 91 | else 92 | rm ${backto_dir}/${DATE}/Emby削刮包和LibEmby数据库.tar.gz 93 | echoContent red "Emby削刮包和LibEmby数据库备份失败,开始重试······" 94 | fi 95 | done 96 | if [[ $baksys == "Y" ]]||[[ $baksys == "y" ]]; then 97 | cd $sys_dir 98 | echoContent yellow "Emby-server主程序备份中,请耐心等待······" 99 | while true; do 100 | targz ${backto_dir}/${DATE}/Emby-server主程序.tar.gz ./ 101 | if [[ "$?" -eq 0 ]]; then 102 | # clear 103 | echoContent green "Emby-server主程序备份完成" 104 | break 105 | else 106 | echoContent red "Emby-server主程序备份失败,开始重试······" 107 | fi 108 | done 109 | fi 110 | echoContent yellow "恭喜,所有备份均已完成。" 111 | systemctl start emby-server 112 | else 113 | systemctl stop emby-server 114 | cd $xuegua_dir 115 | echoContent yellow "Emby削刮包备份中,请耐心等待······" 116 | while true; do 117 | targz ${backto_dir}/${DATE}/Emby削刮包.tar.gz ./ 118 | if [[ "$?" -eq 0 ]]; then 119 | # clear 120 | echoContent green "Emby削刮包备份完成" 121 | break 122 | else 123 | rm ${backto_dir}/${DATE}/Emby削刮包.tar.gz 124 | echoContent red "Emby削刮包备份失败,开始重试······" 125 | fi 126 | done 127 | cd $config_dir 128 | echoContent yellow "LibEmby数据库备份中,请耐心等待······" 129 | # 备份VarLibEmby数据库(排除包含帐户数据相关的文件) 130 | while true; do 131 | targz ${backto_dir}/${DATE}/LibEmby数据库.tar.gz ./emby 132 | if [[ "$?" -eq 0 ]]; then 133 | # clear 134 | echoContent green "LibEmby数据库备份完成" 135 | break 136 | else 137 | echoContent red "LibEmby数据库备份失败,开始重试······" 138 | fi 139 | done 140 | if [[ $baksys == "Y" ]]||[[ $baksys == "y" ]]; then 141 | cd $sys_dir 142 | echoContent yellow "Emby-server主程序备份中,请耐心等待······" 143 | while true; do 144 | targz ${backto_dir}/${DATE}/Emby-server主程序.tar.gz ./ 145 | if [[ "$?" -eq 0 ]]; then 146 | # clear 147 | echoContent green "Emby-server主程序备份完成" 148 | break 149 | else 150 | echoContent red "Emby-server主程序备份失败,开始重试······" 151 | fi 152 | done 153 | fi 154 | echoContent yellow "恭喜,所有备份均已完成。" 155 | systemctl start emby-server 156 | fi 157 | LIST=$(ls $backto_dir) 158 | # 获取7天前的时间,用于作比较,早于该时间的文件将删除 159 | SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s) 160 | for index in ${LIST} 161 | do 162 | # 对目录名进行格式化,取命名末尾的时间,格式如 20200902 163 | timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]") 164 | if [ -n "$timeString" ] 165 | then 166 | indexDate=${timeString//./-} 167 | indexSecond=$( date -d ${indexDate} +%s ) 168 | # 与当天的时间做对比,把早于7天的备份文件删除 169 | if [ $(( $SECONDS- $indexSecond )) -gt 0 ] 170 | then 171 | rm -rf $backto_dir/$index 172 | fi 173 | fi 174 | done 175 | } 176 | restore_emby(){ 177 | echoContent yellow "是否还原Emby-sever主程序?[Y/N]:" 178 | read restore_sys 179 | i=1 180 | list=() 181 | if [[ ! -d ${backto_dir} ]]; then 182 | echoContent red "错误,未检索到备份数据目录。" 183 | exit 1 184 | elif [[ -d ${backto_dir} ]];then 185 | items=$(ls ${backto_dir}/ -l|awk 'NR>1{print $9}') 186 | fi 187 | for item in $items 188 | do 189 | list[i]=${item} 190 | i=$((i+1)) 191 | done 192 | while [[ 0 ]] 193 | do 194 | while [[ 0 ]] 195 | do 196 | echo 197 | echoContent skyBlue "当前[yyyy-mm-dd]格式数据备份列表如下:" 198 | # echo 199 | echoContent skyBlue "-------------------------------" 200 | for((j=1;j<=${#list[@]};j++)) 201 | do 202 | temp="${j}:${list[j]}" 203 | count=$((`echo "${temp}" | wc -m` -1)) 204 | if [ "${count}" -le 6 ];then 205 | temp="${temp}\t\t\t" 206 | elif [ "${count}" -gt 6 ] && [ "$count" -le 14 ];then 207 | temp="${temp}\t\t" 208 | elif [ "${count}" -gt 14 ];then 209 | temp="${temp}" 210 | fi 211 | echoContent skyBlue "${temp}" 212 | echoContent skyBlue "-------------------------------" 213 | done 214 | echo 215 | read -n3 -p "请选择要使用的备份档(输入数字即可):" bak_date_name 216 | if [[ ${bak_date_name} -eq 0 ]]; then 217 | echo 218 | echoContent red "输入不正确,请重新输入。" 219 | elif [ ${bak_date_name} -le ${#list[@]} ] && [ -n ${bak_date_name} ];then 220 | echo 221 | echoContent purple "您选择了:${list[bak_date_name]}" 222 | break 223 | else 224 | echo 225 | echoContent red "输入不正确,请重新输入。" 226 | echo 227 | fi 228 | 229 | done 230 | break 231 | done 232 | echoContent red "即将开始还原操作,是否继续执行:[Y/N]" 233 | read yn 234 | if [[ $yn != "Y" ]] && [[ $yn != "y" ]]; then 235 | exit 0 236 | fi 237 | systemctl stop emby-server 238 | if [[ ${xuegua_dir} == "" ]]; then 239 | xuegua_dir=$config_dir 240 | echoContent yellow "Emby削刮包和LibEmby数据库恢复中,请耐心等待······" 241 | untar ${backto_dir}/${list[bak_date_name]}/Emby削刮包和LibEmby数据库.tar.gz $xuegua_dir 242 | if [[ "$?" -eq 0 ]]; then 243 | # clear 244 | echoContent green "Emby削刮包和LibEmby数据库恢复完成" 245 | sleep 5s 246 | else 247 | echoContent red "Emby削刮包和LibEmby数据库失败" 248 | systemctl start emby-server 249 | exit 1 250 | fi 251 | else 252 | echoContent yellow "Emby削刮包恢复中,请耐心等待······" 253 | untar ${backto_dir}/${list[bak_date_name]}/Emby削刮包.tar.gz $xuegua_dir 254 | if [[ "$?" -eq 0 ]]; then 255 | echoContent green "Emby削刮包恢复完成" 256 | sleep 3s 257 | else 258 | echoContent red "Emby削刮包恢复失败" 259 | systemctl start emby-server 260 | exit 1 261 | fi 262 | echoContent yellow "LibEmby数据库恢复中,请耐心等待······" 263 | untar ${backto_dir}/${list[bak_date_name]}/LibEmby数据库.tar.gz $config_dir 264 | if [[ "$?" -eq 0 ]]; then 265 | echoContent green "LibEmby数据库恢复完成" 266 | else 267 | echoContent red "LibEmby数据库恢复失败" 268 | systemctl start emby-server 269 | exit 1 270 | fi 271 | fi 272 | if [[ $restore_sys == "y" ]]||[[ $restore_sys == "Y" ]]; then 273 | echoContent yellow "Emby-server主程序恢复中,请耐心等待······" 274 | untar ${backto_dir}/${list[bak_date_name]}/Emby-server主程序.tar.gz $sys_dir 275 | if [[ "$?" -eq 0 ]]; then 276 | # clear 277 | echoContent green "Emby-server主程序恢复完成" 278 | sleep 5s 279 | else 280 | echoContent red "Emby-server主程序恢复失败" 281 | systemctl start emby-server 282 | exit 1 283 | fi 284 | fi 285 | systemctl start emby-server 286 | echoContent yellow "恭喜,所有恢复均已完成。" 287 | } 288 | copyright(){ 289 | clear 290 | echo -e " 291 | ${green}###########################################################${plain} 292 | ${green}# #${plain} 293 | ${green}# Emby Server数据一键备份、还原 #${plain} 294 | ${green}# 仅支持宿主机直装的Emby Server #${plain} 295 | ${green}# BUG反馈电报群:https://t.me/EmbyDrive #${plain} 296 | ${green}# Blog:https://blog.20120714.xyz #${plain} 297 | ${green}# Power By:翔翎 #${plain} 298 | ${green}# #${plain} 299 | ${green}###########################################################${plain}" 300 | } 301 | 302 | main(){ 303 | copyright 304 | echo -e " 305 | ${red}0.${plain} 退出脚本 306 | ${green}———————————————————————————————————————————————————————————${plain} 307 | ${green}1.${plain} 一键备份 308 | ${green}2.${plain} 一键还原 309 | " 310 | echo -e "${yellow}请选择你要使用的功能${plain}" 311 | read -p "请输入数字 :" num 312 | case "$num" in 313 | 0) 314 | exit 0 315 | ;; 316 | 1) 317 | backup_emby 318 | ;; 319 | 2) 320 | restore_emby 321 | ;; 322 | *) 323 | clear 324 | echo -e "${red}出现错误:请输入正确数字 ${plain}" 325 | sleep 2s 326 | copyright 327 | main 328 | ;; 329 | esac 330 | } 331 | if [[ $1 == "b" ]]; then 332 | # 可通过命令 bash emby-bs.sh b 实现一键备份 333 | backup_emby 334 | else 335 | main 336 | fi 337 | -------------------------------------------------------------------------------- /emby-sync.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 脚本适配Emby 4.8.0.37版本,如果非该版本,请自行抓取刷新媒体库时获取到的curl指令进行替换。 3 | # set -x 4 | declare -A items=( 5 | ["oumeiju"]="欧美剧,687156" # []里填写媒体分类的字母代号(可自定义),欧美剧为媒体库名称,687156为该媒体库emby对应的parentId, 6 | ["guochanju"]="国产剧,682089" # 同上 7 | ["rihanju"]="日韩剧,720395" # 同上 8 | ) 9 | rcloneconfig="" # 填写GD网盘的rclone配置名称 10 | gddir="" # 填写GD盘媒体目录名称,最后不带/ 11 | apikey="" # 填写EMBY的APIKEY 12 | embyurl="http://ip:8096" # 填写EMBY的网址,最后不加/ 13 | bot_token="" # 填写telegram bot的Token 14 | chat_id="" # 填写接收机器人消息的群组或者用户的TG_ID 15 | Device_Id="" # 此处填写刷新媒体库时抓取到的curl指令中的Device-Id的对应编号 16 | for key in "${!items[@]}" 17 | do 18 | value="${items[$key]}" 19 | name="${value%,*}" 20 | id="${value#*,}" 21 | fullurl="${embyurl}/emby/Items/${id}"'/Refresh?Recursive=true&ImageRefreshMode=Default&MetadataRefreshMode=Default&ReplaceAllImages=false&ReplaceAllMetadata=false&X-Emby-Client=Emby%20Web&X-Emby-Device-Name=Microsoft%20Edge%20macOS&X-Emby-Device-Id='"${Device_Id}"'&X-Emby-Client-Version=4.8.0.37&X-Emby-Token='"${apikey}" 22 | fullurl1="${embyurl}/emby/Items/${id}"'/Refresh?Recursive=true&ImageRefreshMode=FullRefresh&MetadataRefreshMode=FullRefresh&ReplaceAllImages=false&ReplaceAllMetadata=false&X-Emby-Client=Emby%20Web&X-Emby-Device-Name=Microsoft%20Edge%20macOS&X-Emby-Device-Id='"${Device_Id}"'&X-Emby-Client-Version=4.8.0.37&X-Emby-Token='"${apikey}" 23 | if [[ ! -f /root/.${key}.txt ]]; then 24 | rclone size ${rcloneconfig}:${gddir}/${name}|sed -n "2p"|awk -F "(" '{print $2}'|awk '{print $1}' > /root/.${key}.txt 25 | fi 26 | if [[ `rclone size ${rcloneconfig}:${gddir}/${name}|sed -n "2p"|awk -F "(" '{print $2}'|awk '{print $1}'` != `cat /root/.${key}.txt` ]]; then 27 | rclone size ${rcloneconfig}:${gddir}/${name}|sed -n "2p"|awk -F "(" '{print $2}'|awk '{print $1}' > /root/."${key}".txt 28 | curl ${fullurl} \ 29 | -X 'POST' \ 30 | -H 'Connection: keep-alive' \ 31 | -H 'Content-Length: 0' \ 32 | -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98", "Microsoft Edge";v="98"' \ 33 | -H 'DNT: 1' \ 34 | -H 'sec-ch-ua-mobile: ?0' \ 35 | -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43' \ 36 | -H 'sec-ch-ua-platform: "macOS"' \ 37 | -H 'Accept: */*' \ 38 | -H 'Origin: '"${embyurl}" \ 39 | -H 'Sec-Fetch-Site: same-origin' \ 40 | -H 'Sec-Fetch-Mode: cors' \ 41 | -H 'Sec-Fetch-Dest: empty' \ 42 | -H 'Referer: '"${embyurl}"'/web/index.html' \ 43 | -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \ 44 | -H 'Cookie: _ga=GA1.1.1511214678.1654738055; _ga_P1E9Z5LRRK=GS1.1.1684834693.201.0.1684834693.0.0.0' \ 45 | --compressed # 38、42行要保留格式不变 46 | sleep 20 47 | curl ${fullurl1} \ 48 | -X 'POST' \ 49 | -H 'Connection: keep-alive' \ 50 | -H 'Content-Length: 0' \ 51 | -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98", "Microsoft Edge";v="98"' \ 52 | -H 'DNT: 1' \ 53 | -H 'sec-ch-ua-mobile: ?0' \ 54 | -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43' \ 55 | -H 'sec-ch-ua-platform: "macOS"' \ 56 | -H 'Accept: */*' \ 57 | -H 'Origin: '"${embyurl}" \ 58 | -H 'Sec-Fetch-Site: same-origin' \ 59 | -H 'Sec-Fetch-Mode: cors' \ 60 | -H 'Sec-Fetch-Dest: empty' \ 61 | -H 'Referer: '"${embyurl}"'/web/index.html' \ 62 | -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \ 63 | -H 'Cookie: _ga=GA1.1.1511214678.1654738055; _ga_P1E9Z5LRRK=GS1.1.1684834693.201.0.1684834693.0.0.0' \ 64 | --compressed # 57、61行要保留格式不变 65 | echo "`date +%Y-%m-%d\ %H:%M:%S` ${name}追新刷新媒体库完成。" >> /root/sync-zhuixin.log 66 | curl "https://api.telegram.org/bot${bot_token}/sendMessage?chat_id=${chat_id}&text=`date +%Y-%m-%d\ %H:%M:%S` ${name}追新刷新媒体库完成。" 67 | sleep 1000 68 | fi 69 | done 70 | -------------------------------------------------------------------------------- /emby/embycrack: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/emby/embycrack -------------------------------------------------------------------------------- /emby/embycrack-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/emby/embycrack-arm -------------------------------------------------------------------------------- /emby/x-ui.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/emby/x-ui.db -------------------------------------------------------------------------------- /filemodify.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo -ne "请输入要做操作的文件的路径:" 3 | read filename 4 | # 对文本每行做复制 前后间以-O 区隔 5 | awk '{print $0" -O "$0}' $filename >${newfilename}new.txt 6 | # 文本每行前后添加指定内容,本处代码实现行首添加webget "$wget_dir/$version 行尾添加" 7 | awk '{print "webget \"$wget_dir/$version"$0"\""}' ${newfilename}new.txt >$filename 8 | rm ${newfilename}new.txt 9 | echo -e "文件处理完毕。" 10 | exit 0 11 | -------------------------------------------------------------------------------- /flexget.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Ver 1.0 3 | # Powerby:翔翎 4 | # Blog:https://blog.20120714.xyz 5 | 6 | echoType='echo -e' 7 | echoContent(){ 8 | case $1 in 9 | # 红色 10 | "red") 11 | # shellcheck disable=SC2154 12 | ${echoType} "\033[31m$2\033[0m" 13 | ;; 14 | # 绿色 15 | "green") 16 | ${echoType} "\033[32m$2\033[0m" 17 | ;; 18 | # 黄色 19 | "yellow") 20 | ${echoType} "\033[33m$2\033[0m" 21 | ;; 22 | # 蓝色 23 | "blue") 24 | ${echoType} "\033[34m$2\033[0m" 25 | ;; 26 | # 紫色 27 | "purple") 28 | ${echoType} "\033[35m$2\033[0m" 29 | ;; 30 | # 天蓝色 31 | "skyBlue") 32 | ${echoType} "\033[36m$2\033[0m" 33 | ;; 34 | # 白色 35 | "white") 36 | ${echoType} "\033[37m$2\033[0m" 37 | ;; 38 | esac 39 | } 40 | clear 41 | # check root 42 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: $ 必须使用root用户运行此脚本!\n" && exit 1 43 | apt install lsof unzip -y || yum install lsof unzip -y 44 | clear 45 | function check_docker(){ 46 | if test -z "$(which docker)"; then 47 | echoContent yellow "检测到系统未安装docker,开始安装docker" 48 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 49 | fi 50 | if test -z "$(which docker-compose)"; then 51 | echoContent yellow "检测到系统未安装docker-compose,开始安装docker-compose" 52 | curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 53 | chmod +x /usr/local/bin/docker-compose 54 | ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 55 | fi 56 | } 57 | function install_flexget(){ 58 | read -p "请设置flexget面板登录密码[最好英数结合,太简单无法生效]:" password 59 | read -p "是否在本机部署qBittorrent[Y/N]:" yn 60 | if [[ ${yn} != "Y" ]]&&[[ ${yn} != "y" ]]; then 61 | read -p "请输入远程qBittorrent下载器的IP地址:" box_ip 62 | read -p "请输入远程qBittorrent下载器的服务端口:" boxport 63 | read -p "请输入远程qBittorrent下载器的用户名:" box_user_name 64 | read -p "请输入远程qBittorrent下载器的登录密码:" box_password 65 | cat >/root/docker-compose.yml </root/docker-compose.yml </dev/null && mv flexget_qbittorrent_mod-master plugins && rm master.zip 123 | wget -O plugins/nexusphp.py https://raw.githubusercontent.com/Juszoe/flexget-nexusphp/master/nexusphp.py 124 | read -p "请设置磁盘低于多少G不再添加种子并触发删种操作:" keep_disk_space 125 | cat >/home/flexget/config/config.yml<> /home/flexget/config/config.yml </dev/null 264 | cat >> /home/flexget/config/config.yml< now - timedelta(hours=1): accept 270 | 271 | delete: &delete 272 | priority: 3 273 | disable: [seen, seen_info_hash, retry_failed] 274 | if: 275 | - qbittorrent_category in ['RSS'] and (qbittorrent_last_activity < now - timedelta(days=2) or qbittorrent_added_on < now - timedelta(days=7)): accept 276 | - qbittorrent_state == 'missingFiles' or (qbittorrent_state in ['pausedDL'] and qbittorrent_completed == 0): accept 277 | sort_by: qbittorrent_last_activity 278 | 279 | modify: &modify 280 | priority: 4 281 | disable: [seen, seen_info_hash, retry_failed] 282 | accept_all: yes 283 | 284 | clean: &clean 285 | priority: 5 286 | disable: [seen, seen_info_hash, retry_failed] 287 | regexp: 288 | accept: 289 | - '[Tt]orrent not registered with this tracker' 290 | - 'Torrent banned' 291 | - 'Unregistered torrent' 292 | from: qbittorrent_tracker_msg 293 | 294 | ol_resume: 295 | <<: *resume 296 | template: 297 | - ol_from_qbittorrent_template 298 | - ol_qbittorrent_base_template 299 | - qbittorrent_resume_template 300 | 301 | 302 | 303 | ol_delete: 304 | <<: *delete 305 | template: 306 | - ol_from_qbittorrent_template 307 | - ol_qbittorrent_base_template 308 | - ol_qbittorrent_delete_keeper_template 309 | 310 | 311 | 312 | ol_modify: 313 | <<: *modify 314 | template: 315 | - ol_from_qbittorrent_template 316 | - ol_qbittorrent_base_template 317 | - qbittorrent_modify_template 318 | 319 | 320 | 321 | ol_clean: 322 | <<: *clean 323 | template: 324 | - ol_from_qbittorrent_template 325 | - ol_qbittorrent_base_template 326 | - qbittorrent_delete_cleaner_template 327 | EOF 328 | echoContent yellow "太好了,所有信息已经准备完毕,开始程序部署" 329 | docker-compose -f /root/docker-compose.yml up -d 330 | if [[ $? -eq 0 ]]; then 331 | sleep 5s 332 | echoContent yellow "即将开始进入容器,执行安装requests依赖必要操作" 333 | else 334 | echoContent red "flexget安装失败了····" 335 | exit 1 336 | fi 337 | docker exec -it flexget bash -c "pip3 install --upgrade requests" 338 | if [[ $? -eq 0 ]]; then 339 | if [[ ${yn} == "y" ]]||[[ ${yn} == "Y" ]]; then 340 | echoContent green " 341 | ------------------------------------------------ 342 | 恭喜:Flexget、qBittorrent安装完毕 343 | Flexget端口:3539 344 | 面板登录密码:$password 345 | 配置文件存放路径:/home/flexget/config 346 | ------------------------------------------------ 347 | qBittorrent端口:8088 348 | qBittorrent用户名:admin 349 | qBittorrent密码:adminadmin 350 | 配置文件存放路径:/home/qbittorrent/config 351 | 下载文件存放路径:${downdir} 352 | ------------------------------------------------" 353 | else 354 | echoContent green " 355 | ------------------------------------------------ 356 | 恭喜:Flexget安装完毕 357 | Flexget端口:3539 358 | 面板登录密码:$password 359 | 配置文件存放路径:/home/flexget/config 360 | ------------------------------------------------" 361 | fi 362 | else 363 | echoContent red "⚠️ 安装requests依赖失败了····" 364 | exit 1 365 | fi 366 | } 367 | function menu(){ 368 | clear 369 | echoContent green " 370 | ################################################################### 371 | # # 372 | # flexget刷流一键安装脚本 # 373 | # Powerby 翔翎 # 374 | # Blog:https://blog.20120714.xyz # 375 | # # 376 | ###################################################################" 377 | echoContent yellow "是否开始执行脚本[Y/N],Ctrl+C退出脚本" 378 | read start 379 | if [[ ${start} == "Y" ]]||[[ ${start} == "y" ]]; then 380 | check_docker 381 | install_flexget 382 | else 383 | echoContent red "输入错误,脚本退出······" 384 | exit 0 385 | fi 386 | } 387 | menu 388 | -------------------------------------------------------------------------------- /gclone.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o errexit 4 | set -o pipefail 5 | set -o nounset 6 | 7 | if ! command -v systemctl >/dev/null 2>&1; then 8 | echo "> Sorry but this scripts is only for Linux with systemd, eg: Ubuntu 16.04+/Centos 7+ ..." 9 | exit 1 10 | fi 11 | 12 | if [[ $(id -u) -ne 0 ]]; then 13 | echo "This script must be run as root" 14 | exit 1 15 | fi 16 | 17 | CLDBIN=/usr/bin/gclone 18 | OSARCH=$(uname -m) 19 | case $OSARCH in 20 | x86_64) 21 | BINTAG=Linux_x86_64 22 | ;; 23 | i*86) 24 | BINTAG=Linux_i386 25 | ;; 26 | aarch64) 27 | BINTAG=Linux_arm64 28 | ;; 29 | arm*) 30 | BINTAG=Linux_armv6 31 | ;; 32 | *) 33 | echo "unsupported OSARCH: $OSARCH" 34 | exit 1 35 | ;; 36 | esac 37 | 38 | wget -qO- https://api.github.com/repos/donwa/gclone/releases/latest \ 39 | | grep browser_download_url | grep "$BINTAG" | cut -d '"' -f 4 \ 40 | | wget --no-verbose -i- -O- | gzip -d -c > ${CLDBIN} 41 | chmod 0755 ${CLDBIN} 42 | 43 | gclone version 44 | -------------------------------------------------------------------------------- /gcp-dd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | White='\033[37m' 5 | blue='\033[36m' 6 | yellow='\033[0;33m' 7 | plain='\033[0m' 8 | clear 9 | # check root 10 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 11 | checkos(){ 12 | ifTermux=$(echo $PWD | grep termux) 13 | ifMacOS=$(uname -a | grep Darwin) 14 | ifsynology=$(uname -a | grep synology) 15 | if [ -n "$ifTermux" ];then 16 | os_version=Termux 17 | elif [ -n "$ifMacOS" ];then 18 | os_version=MacOS 19 | elif [ -n "$ifsynology" ]; then 20 | os_version=synology 21 | if test -z "$(which ipkg)"; then 22 | echo -e "${green}检测到系统未安装ipkg,开始安装ipkg${plain}" 23 | wget http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh && chmod +x syno-i686-bootstrap_1.2-7_i686.xsh && sh syno-i686-bootstrap_1.2-7_i686.xsh && ipkg update 24 | fi 25 | else 26 | os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.') 27 | fi 28 | 29 | if [[ "$os_version" == "2004" ]] || [[ "$os_version" == "10" ]] || [[ "$os_version" == "11" ]];then 30 | ssll="-k --ciphers DEFAULT@SECLEVEL=1" 31 | fi 32 | } 33 | checkos 34 | checkCPU(){ 35 | CPUArch=$(uname -m) 36 | if [[ "$CPUArch" == "aarch64" ]];then 37 | arch=linux_arm64 38 | elif [[ "$CPUArch" == "i686" ]];then 39 | arch=linux_386 40 | elif [[ "$CPUArch" == "arm" ]];then 41 | arch=linux_arm 42 | elif [[ "$CPUArch" == "x86_64" ]] && [ -n "$ifMacOS" ];then 43 | arch=darwin_amd64 44 | elif [[ "$CPUArch" == "x86_64" ]];then 45 | arch=linux_amd64 46 | fi 47 | } 48 | checkCPU 49 | check_dependencies(){ 50 | os_detail=$(cat /etc/os-release 2> /dev/null) 51 | if_debian=$(echo $os_detail | grep 'ebian') 52 | if_redhat=$(echo $os_detail | grep 'rhel') 53 | if [ -n "$if_debian" ];then 54 | InstallMethod="apt" 55 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 56 | InstallMethod="yum" 57 | elif [[ "$os_version" == "MacOS" ]];then 58 | InstallMethod="brew" 59 | elif [[ $os_version == "synology" ]]; then 60 | InstallMethod="ipkg" 61 | fi 62 | } 63 | check_dependencies 64 | ${InstallMethod} install -y xz-utils openssl gawk file wget 65 | clear 66 | local_ip=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E '\ 1(92|0|72|00|1)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1) 67 | gateway=$(route | grep 'default' | awk '{print $2}') 68 | echo -e "${red}注意:本脚本针对GCP主机原版系统DD到其他自定义系统,如您不是GCP主机请Ctrl+C退出执行脚本${plain}" 69 | echo -n -e "${yellow}请选择你要DD到的系统:\n1、Debian\n2、Ubuntu\n3、Centos\n>:${plain}" 70 | read chose 71 | if [[ $chose == "1" ]]; then 72 | sysinfo=d 73 | sys1=Debian 74 | elif [[ $chose == "2" ]]; then 75 | sysinfo=u 76 | sys1=Ubuntu 77 | elif [[ $chose == "3" ]]; then 78 | sysinfo=c 79 | sys1=Centos 80 | fi 81 | bits=$(getconf LONG_BIT) 82 | echo -n -e "${yellow}请输入系统版本号:\n如 Debian 11输入11,Ubuntu 20.04输入20.04,Centos 6.9输入6.9 \n>:${plain}" 83 | read version 84 | # echo -n -e "${yellow}请输入系统Bit版本:32或64 \n>:${plain}" 85 | # read bits 86 | echo -n -e "${yellow}请输入系统DD之后的登陆密码\n>:${plain}" 87 | read password 88 | echo -n -e "${yellow}您计划要DD重装到${sys1} ${version} ${bits}bits版本; 89 | 设置的登录密码为:${plain}${green}${password}${plain} 90 | ${red}请确认是否正式开始DD系统[Y/N]${plain}\n>:" 91 | read yn 92 | if [[ $yn == "y" ]]||[[ $yn == "Y" ]]; then 93 | bash <(wget --no-check-certificate -qO- 'https://ghproxy.20120714.xyz/https://raw.githubusercontent.com/07031218/normal-shell/main/InstallNET.sh') --ip-addr ${local_ip} --ip-gate ${gateway} --ip-mask 255.255.255.0 -${sysinfo} ${version} -v ${bits} -a -p ${password} 94 | else 95 | echo -e "${red}你选择了不继续,程序退出${plain}" 96 | exit 0 97 | fi 98 | -------------------------------------------------------------------------------- /let-s-Encrypt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "=======================Let's Encrypt环境准备=======================================" 4 | if command -v python > /dev/null 2>&1; then 5 | echo 'python 环境就绪...' 6 | python_command=python 7 | else 8 | echo 'python环境不存在,即将开始自动安装。。' 9 | apt-get -y install python || yum -y install python 10 | echo 'python 安装成功' 11 | python_command=python 12 | fi 13 | if command -v openssl > /dev/null 2>&1; then 14 | echo 'openssl 环境就绪...' 15 | else 16 | echo 'openssl 不存在,准备安装。。。' 17 | apt-get -y install openssl || yum -y install openssl 18 | fi 19 | 20 | echo "==========================环境准备完成===========================" 21 | echo "开始配置" 22 | echo "1、域名配置,请确保你的域名已解析到本机" 23 | echo "请输入域名(多个请用空格隔开):按回车结束(例:www.baidu.com)" 24 | read -p "> " web_domains 25 | domain_length=0 26 | sign_domain_str='' 27 | web_first_domain=$(echo $web_domains|tr -s [:blank:]|cut -d ' ' -f 1) 28 | nginx_web_config_file=$web_first_domain".conf" 29 | for web_domain in ${web_domains[@]} 30 | do 31 | sign_domain_str=$sign_domain_str"DNS:"$web_domain"," 32 | domain_length=$(($domain_length+1)) 33 | done 34 | sign_domain_str=${sign_domain_str:0:${#sign_domain_str}-1} 35 | echo "$sign_domain_str" 36 | 37 | echo "2、站点绝对路径配置,如果未输入或者输入非绝对路径,就默认使用域名为目录配置到/tmp目录下" 38 | mkdir /certs 39 | read -p "> " web_dir 40 | if [[ -z "$web_dir" || ! "$web_dir" == /* ]]; then 41 | web_dir="/certs/"$web_first_domain 42 | fi 43 | 44 | 45 | echo -e "\n" 46 | cat << EOF 47 | 确认配置 48 | 49 | 网站根目录: $web_dir 50 | 域名: $web_domains 51 | 52 | 请输入1或2 53 | 1):确认 54 | 2):退出 55 | EOF 56 | read -p "> " confirm 57 | if [[ $confirm -eq 2 ]]; then 58 | exit 0 59 | fi 60 | echo "===========================自动化配置开始=================================" 61 | mkdir -p ${web_dir}"/certificate/challenges" 62 | chmod -R 755 ${web_dir}"/certificate" 63 | web_first_parent_dir="/"$(echo $web_dir|cut -d "/" -f2) 64 | find $web_first_parent_dir -type d -exec chmod o+x {} \; 65 | cd $web_dir"/certificate" 66 | echo "Create a Let's Encrypt account private key" 67 | openssl genrsa 4096 > account.key 68 | echo "generate a domain private key" 69 | openssl genrsa 4096 > domain.key 70 | if [[ $domain_length -gt 1 ]]; then 71 | openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=$sign_domain_str")) > domain.csr || openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=$sign_domain_str")) > domain.csr 72 | else 73 | openssl req -new -sha256 -key domain.key -subj "/CN=$web_domains" > domain.csr 74 | fi 75 | 76 | wget --no-check-certificate https://cdn.jsdelivr.net/gh/diafygi/acme-tiny@master/acme_tiny.py 77 | $python_command acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir $web_dir/certificate/challenges > ./signed.crt || exiterr "create the http website failed,please view the issue of github doc" 78 | #NOTE: For nginx, you need to append the Let's Encrypt intermediate cert to your cert 79 | wget --no-check-certificate https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem -O intermediate.pem 80 | cat signed.crt intermediate.pem > chained.pem 81 | cp chained.pem $web_domains.crt 82 | cp domain.key $web_domains.key 83 | 84 | # current_user=$USER 85 | # current_user=$(id -un) not work for sudo 86 | current_user=$(who am i|awk '{print $1}') 87 | current_user_group=$(id -gn $current_user) 88 | chown -R $current_user:$current_user_group $web_dir 89 | chmod -R 755 $web_dir 90 | echo -e "\n\n" 91 | cat << EOF 92 | 域名证书申请完毕,证书目录 ${web_dir}/certificate 93 | EOF 94 | cat > $web_dir/certificate/renew_cert.bash < /tmp/signed.crt || exit 98 | wget --no-check-certificate -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem 99 | cat /tmp/signed.crt intermediate.pem > $web_dir/certificate/chained.pem 100 | cp $web_dir/certificate/chained.pem $web_dir/certificate/$web_domains.crt 101 | EOF 102 | 103 | echo "Let's Encrypt 证书有效期定时任务配置" 104 | if command -v crontab > /dev/null 2>&1; then 105 | echo 'crontab 已安装' 106 | else 107 | echo 'crontab 未安装,将为您自动安装...' 108 | apt-get -y install cron || yum -y install cron 109 | fi 110 | echo "1 1 1 * * root bash $web_dir/certificate/renew_cert.bash >> /var/log/renew_cert_error.log 2 >> /var/log/renew_cert.log" >> /etc/crontab 111 | echo "证书续期定时器添加成功" 112 | exit 0 113 | -------------------------------------------------------------------------------- /lzdz11.json: -------------------------------------------------------------------------------- 1 | ["6fab84d8554d4c68bc35303e55b7be46","f82f0bc2ed68490cbd3007b1e3552b8c"] 2 | -------------------------------------------------------------------------------- /netflix-verify.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | checkos(){ 3 | ifTermux=$(echo $PWD | grep termux) 4 | ifMacOS=$(uname -a | grep Darwin) 5 | if [ -n "$ifTermux" ];then 6 | os_version=Termux 7 | elif [ -n "$ifMacOS" ];then 8 | os_version=MacOS 9 | else 10 | os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.') 11 | fi 12 | 13 | if [[ "$os_version" == "2004" ]] || [[ "$os_version" == "10" ]] || [[ "$os_version" == "11" ]];then 14 | ssll="-k --ciphers DEFAULT@SECLEVEL=1" 15 | fi 16 | } 17 | checkos 18 | 19 | checkCPU(){ 20 | CPUArch=$(uname -m) 21 | if [[ "$CPUArch" == "aarch64" ]];then 22 | arch=linux_arm64 23 | elif [[ "$CPUArch" == "i686" ]];then 24 | arch=linux_386 25 | elif [[ "$CPUArch" == "arm" ]];then 26 | arch=linux_arm 27 | elif [[ "$CPUArch" == "x86_64" ]] && [ -n "$ifMacOS" ];then 28 | arch=darwin_amd64 29 | elif [[ "$CPUArch" == "x86_64" ]];then 30 | arch=linux_amd64 31 | fi 32 | } 33 | checkCPU 34 | check_dependencies(){ 35 | 36 | os_detail=$(cat /etc/os-release 2> /dev/null) 37 | if_debian=$(echo $os_detail | grep 'ebian') 38 | if_redhat=$(echo $os_detail | grep 'rhel') 39 | if [ -n "$if_debian" ];then 40 | InstallMethod="apt" 41 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 42 | InstallMethod="yum" 43 | elif [[ "$os_version" == "MacOS" ]];then 44 | InstallMethod="brew" 45 | fi 46 | } 47 | check_dependencies 48 | 49 | if test -z "$(which wget)"; then 50 | echo -e "检测到系统未安装wget,开始安装wget" 51 | ${InstallMethod} install wget -y > /dev/null 2>&1 52 | fi 53 | version=$(curl -s 'https://api.github.com/repos/sjlleo/netflix-verify/releases'|grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'|head -1) 54 | #下载检测程序 55 | wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/${version}/nf_${arch} 56 | chmod +x nf > /dev/null 2>&1 57 | clear 58 | ./nf 59 | rm nf 60 | exit 61 | -------------------------------------------------------------------------------- /nt2mp.py: -------------------------------------------------------------------------------- 1 | import re 2 | import json 3 | import requests 4 | import time 5 | 6 | nastool_username = "" # NT用户名 7 | nastool_password = "" # NT账户密码 8 | moviepilot_username = "" # MP用户名 9 | moviepilot_password = "" # MP账户密码 10 | 11 | nastool_url = "" # NT的WEB地址 12 | moviepilot_url = "" #MP的API地址 13 | def replace_func(match): 14 | return str(int(match.group(1))) 15 | def get_nas_tool_token(): 16 | headers1 = { 17 | 'accept': 'application/json', 18 | 'Content-Type': 'application/x-www-form-urlencoded', 19 | } 20 | 21 | data1 = { 22 | 'username': nastool_username, 23 | 'password': nastool_password, 24 | } 25 | 26 | response1 = requests.post(f'{nastool_url}/api/v1/user/login', headers=headers1, data=data1) 27 | r1 = json.loads(response1.text) 28 | API_token = r1["data"]["token"] 29 | return API_token 30 | nas_tool_token = get_nas_tool_token() 31 | # 32 | def get_moviepilot_token(): 33 | headers1 = { 34 | 'accept': 'application/json', 35 | 'Content-Type': 'application/x-www-form-urlencoded', 36 | } 37 | 38 | data1 = { 39 | 'username': moviepilot_username, 40 | 'password': moviepilot_password, 41 | } 42 | 43 | response1 = requests.post(f'{moviepilot_url}/api/v1/login/access-token', headers=headers1, data=data1) 44 | r1 = json.loads(response1.text) 45 | API_token = r1['access_token'] 46 | return API_token 47 | 48 | 49 | 50 | headers = { 51 | 'accept': 'application/json', 52 | 'Authorization': nas_tool_token, 53 | 'content-type': 'application/x-www-form-urlencoded', 54 | } 55 | 56 | # 电视剧订阅记录迁移逻辑起始处; 57 | response = requests.post(f'{nastool_url}/api/v1/subscribe/tv/list', headers=headers) 58 | r = json.loads(response.text)['data']['result'] 59 | # print(r['data']['result']) 60 | i = 0 61 | for key, value in r.items(): 62 | name = f"{value['name']}" 63 | token = get_moviepilot_token() 64 | season = re.sub(r'S(\d{2})', replace_func, value['season']) 65 | headers1 = { 66 | 'accept': 'application/json', 67 | 'Authorization': f'Bearer {token}', 68 | 'Content-Type': 'application/json', 69 | } 70 | 71 | json_data1 = { 72 | "id": 0, 73 | 'name': name, 74 | 'year': value['year'], 75 | 'type': '电视剧', 76 | 'keyword': 'string', 77 | 'tmdbid': value['tmdbid'], 78 | 'bangumiid': 0, 79 | 'season': season, 80 | 'vote': 0, 81 | 'quality': 'WEB-DL', 82 | 'resolution': '4k,1080p', 83 | 'total_episode': 0, 84 | 'start_episode': 0, 85 | 'lack_episode': 0, 86 | 'sites': [ 87 | 0, 88 | ], 89 | 'best_version': 0, 90 | 'current_priority': 0, 91 | 'save_path': '影视剧', 92 | 'search_imdbid': 0, 93 | } 94 | 95 | response = requests.post(f'{moviepilot_url}/api/v1/subscribe/', headers=headers1, json=json_data1) 96 | rr = json.loads(response.text) 97 | i += 1 98 | with open('error_log.txt', 'a') as logfile: 99 | if rr['success'] == False: 100 | logfile.write(f"NO.{i}、电视剧<<{name}>>添加订阅失败,原因:{rr['message']}\n") 101 | else: 102 | print(f"NO.{i}、电视剧<<{name}>> 第 {value['season']} 季添加订阅成功") 103 | time.sleep(1) 104 | # 电视剧订阅记录迁移逻辑结束处; 105 | 106 | # 电影订阅记录迁移逻辑起始处; 107 | response = requests.post(f'{nastool_url}/api/v1/subscribe/movie/list', headers=headers) 108 | r = json.loads(response.text)['data']['result'] 109 | j = 0 110 | for key, value in r.items(): 111 | name = f"{value['name']}" 112 | token = get_moviepilot_token() 113 | headers1 = { 114 | 'accept': 'application/json', 115 | 'Authorization': f'Bearer {token}', 116 | 'Content-Type': 'application/json', 117 | } 118 | 119 | json_data1 = { 120 | "id": 0, 121 | 'name': name, 122 | 'year': value['year'], 123 | 'type': '电影', 124 | 'keyword': 'string', 125 | 'tmdbid': value['tmdbid'], 126 | 'bangumiid': 0, 127 | 'season': 0, 128 | 'vote': 0, 129 | 'quality': 'WEB-DL', 130 | 'resolution': '4k,1080p', 131 | 'total_episode': 0, 132 | 'start_episode': 0, 133 | 'lack_episode': 0, 134 | 'sites': [ 135 | 0, 136 | ], 137 | 'best_version': 0, 138 | 'current_priority': 0, 139 | 'save_path': '电影', 140 | 'search_imdbid': 0, 141 | } 142 | 143 | response = requests.post(f'{moviepilot_url}/api/v1/subscribe/', headers=headers1, json=json_data1) 144 | rr = json.loads(response.text) 145 | j+= 1 146 | with open('error_log.txt', 'a') as logfile: 147 | if rr['success'] == False: 148 | logfile.write(f"NO.{j}、电影<<{name}>>添加订阅失败,原因:{rr['message']}\n") 149 | else: 150 | print(f"NO.{j}、电影<<{name}>>添加订阅成功") 151 | time.sleep(1) 152 | 153 | # 电影订阅记录迁移逻辑结束处; 154 | -------------------------------------------------------------------------------- /nvjdc.css: -------------------------------------------------------------------------------- 1 | * { 2 | /* 3 | _ ___ ____ _ ____ ___ ____ _____ 4 | / \ / _ \| __ ) / \ / ___/ _ \| _ \| ____| 5 | / _ \| | | | _ \ / _ \| | | | | | |_) | _| 6 | / ___ \ |_| | |_) / ___ \ |__| |_| | _ <| |___ 7 | /_/ \_\___/|____/_/ \_\____\___/|_| \_\_____| 8 | 9 | Author: aobacore 10 | Version: 1.1 11 | Date: 15:22:32, November 8, 2021 12 | This CSS is only for personal use. 13 | It may be revoked or modified without notice at any time. Please be informed. 14 | Character drawing generation: http://patorjk.com/software/taag Style: Standard 15 | */ 16 | 17 | /*Baidu HM*/ 18 | var _hmt = _hmt || []; 19 | (function() { 20 | var hm = document.createElement("script"); 21 | hm.src = "https://hm.baidu.com/hm.js?d7aaea180f9da3780cf1ef0c1036b7b4"; 22 | var s = document.getElementsByTagName("script")[0]; 23 | s.parentNode.insertBefore(hm, s); 24 | })(); 25 | 26 | } 27 | .card { 28 | background: #fff; 29 | background-size: contain; 30 | text-align: center; 31 | padding: 1em; 32 | } 33 | 34 | .card h1 { 35 | font-size: 22px; 36 | margin: -20px auto 0; 37 | letter-spacing: 1px; 38 | } 39 | .card h2 { 40 | font-size: 18px; 41 | color: #DC143C; 42 | margin: 5px auto 0; 43 | letter-spacing: 1px; 44 | } 45 | .card h3 { 46 | font-size: 22px; 47 | margin: 5px auto 0; 48 | letter-spacing: 1px; 49 | } 50 | .card red20 { 51 | margin: auto; 52 | color: #da0000; 53 | font-weight: 300; 54 | font-size: 20px; 55 | } 56 | .card red18 { 57 | margin: auto; 58 | color: #da0000; 59 | font-weight: 300; 60 | font-size: 18px; 61 | } 62 | .card red16 { 63 | margin: auto; 64 | color: #da0000; 65 | font-weight: 300; 66 | font-size: 16px; 67 | } 68 | .card rde14 { 69 | margin: auto; 70 | color: #da0000; 71 | font-weight: 300; 72 | font-size: 14px; 73 | } 74 | .card blue20 { 75 | margin: auto; 76 | color: #1E90FF; 77 | font-weight: 300; 78 | font-size: 20px; 79 | } 80 | .card blue18 { 81 | margin: auto; 82 | color: #1E90FF; 83 | font-weight: 300; 84 | font-size: 18px; 85 | } 86 | .card blue16 { 87 | margin: auto; 88 | color: #1E90FF; 89 | font-weight: 300; 90 | font-size: 16px; 91 | } 92 | .card blue14 { 93 | margin: auto; 94 | color: #1E90FF; 95 | font-weight: 300; 96 | font-size: 14px; 97 | } 98 | .card yellow20 { 99 | margin: auto; 100 | color: #FFD700; 101 | font-weight: 300; 102 | font-size: 20px; 103 | } 104 | .card yellow18 { 105 | margin: auto; 106 | color: #FFD700; 107 | font-weight: 300; 108 | font-size: 18px; 109 | } 110 | .card yellow16 { 111 | margin: auto; 112 | color: #FFD700; 113 | font-weight: 300; 114 | font-size: 16px; 115 | } 116 | .card yellow14 { 117 | margin: auto; 118 | color: #FFD700; 119 | font-weight: 300; 120 | font-size: 14px; 121 | } 122 | .card green20 { 123 | margin: auto; 124 | color: #00e626; 125 | font-weight: 300; 126 | font-size: 20px; 127 | } 128 | .card green18 { 129 | margin: auto; 130 | color: #00e626; 131 | font-weight: 300; 132 | font-size: 18px; 133 | } 134 | .card green16 { 135 | margin: auto; 136 | color: #00e626; 137 | font-weight: 300; 138 | font-size: 16px; 139 | } 140 | .card green14 { 141 | margin: auto; 142 | color: #00e626; 143 | font-weight: 300; 144 | font-size: 14px; 145 | } 146 | .card orange20 { 147 | margin: auto; 148 | color: #ff8800; 149 | font-weight: 300; 150 | font-size: 20px; 151 | } 152 | .card orange18 { 153 | margin: auto; 154 | color: #ff8800; 155 | font-weight: 300; 156 | font-size: 18px; 157 | } 158 | .card orange16 { 159 | margin: auto; 160 | color: #ff8800; 161 | font-weight: 300; 162 | font-size: 16px; 163 | } 164 | .card orange14 { 165 | margin: auto; 166 | color: #ff8800; 167 | font-weight: 300; 168 | font-size: 14px; 169 | } 170 | .card LightCoral20 { 171 | margin: auto; 172 | color: #F08080; 173 | font-weight: 300; 174 | font-size: 20px; 175 | } 176 | .card LightCoral18 { 177 | margin: auto; 178 | color: #F08080; 179 | font-weight: 300; 180 | font-size: 18px; 181 | } 182 | .card LightCoral16 { 183 | margin: auto; 184 | color: #F08080; 185 | font-weight: 300; 186 | font-size: 16px; 187 | } 188 | .card LightCoral14 { 189 | margin: auto; 190 | color: #F08080; 191 | font-weight: 300; 192 | font-size: 14px; 193 | } 194 | .card DimGray20 { 195 | margin: auto; 196 | color: #696969; 197 | font-weight: 300; 198 | font-size: 20px; 199 | } 200 | .card DimGray18 { 201 | margin: auto; 202 | color: #696969; 203 | font-weight: 300; 204 | font-size: 18px; 205 | } 206 | .card DimGray16 { 207 | margin: auto; 208 | color: #696969; 209 | font-weight: 300; 210 | font-size: 16px; 211 | } 212 | .card DimGray14 { 213 | margin: auto; 214 | color: #696969; 215 | font-weight: 300; 216 | font-size: 14px; 217 | } 218 | .card Violet20 { 219 | margin: auto; 220 | color: #EE82EE; 221 | font-weight: 300; 222 | font-size: 20px; 223 | } 224 | .card Violet18 { 225 | margin: auto; 226 | color: #EE82EE; 227 | font-weight: 300; 228 | font-size: 18px; 229 | } 230 | .card Violet16 { 231 | margin: auto; 232 | color: #EE82EE; 233 | font-weight: 300; 234 | font-size: 16px; 235 | } 236 | .card Violet14 { 237 | margin: auto; 238 | color: #EE82EE; 239 | font-weight: 300; 240 | font-size: 14px; 241 | } 242 | .card Pink20 { 243 | margin: auto; 244 | color: #FFC0CB; 245 | font-weight: 300; 246 | font-size: 20px; 247 | } 248 | .card Pink18 { 249 | margin: auto; 250 | color: #FFC0CB; 251 | font-weight: 300; 252 | font-size: 18px; 253 | } 254 | .card Pink16 { 255 | margin: auto; 256 | color: #FFC0CB; 257 | font-weight: 300; 258 | font-size: 16px; 259 | } 260 | .card Pink14 { 261 | margin: auto; 262 | color: #FFC0CB; 263 | font-weight: 300; 264 | font-size: 14px; 265 | } 266 | .card Crimson20 { 267 | margin: auto; 268 | color: #DC143C; 269 | font-weight: 300; 270 | font-size: 20px; 271 | } 272 | .card Crimson18 { 273 | margin: auto; 274 | color: #DC143C; 275 | font-weight: 300; 276 | font-size: 18px; 277 | } 278 | .card Crimson16 { 279 | margin: auto; 280 | color: #DC143C; 281 | font-weight: 300; 282 | font-size: 16px; 283 | } 284 | .card Crimson14 { 285 | margin: auto; 286 | color: #DC143C; 287 | font-weight: 300; 288 | font-size: 14px; 289 | } 290 | .card text20 { 291 | margin: auto; 292 | color: #000000; 293 | font-weight: 300; 294 | font-size: 20px; 295 | } 296 | .card text18 { 297 | margin: auto; 298 | color: #000000; 299 | font-weight: 300; 300 | font-size: 18px; 301 | } 302 | .card text16 { 303 | margin: auto; 304 | color: #000000; 305 | font-weight: 300; 306 | font-size: 16px; 307 | } 308 | .card text14 { 309 | margin: auto; 310 | color: #000000; 311 | font-weight: 300; 312 | font-size: 14px; 313 | } 314 | .card .button { 315 | display: block; 316 | text-decoration: none; 317 | background: #666CD9; 318 | color: #f9f9f9; 319 | padding: 6px; 320 | border: none; 321 | border-radius: 25px; 322 | margin-top: 5px; 323 | font-size: 14px; 324 | font-weight: 700; 325 | min-width: 200px; 326 | transition: 0.2s; 327 | } 328 | .card .button span { 329 | font-size: 20px; 330 | line-height: 1; 331 | vertical-align: top; 332 | } 333 | .card .button:hover { 334 | background: #5D4AD9; 335 | } 336 | -------------------------------------------------------------------------------- /nvjdc/OK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/nvjdc/OK -------------------------------------------------------------------------------- /nvjdc/OK-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/nvjdc/OK-arm -------------------------------------------------------------------------------- /nvjdc/Readme.md: -------------------------------------------------------------------------------- 1 | 此人很懒,什么也没留下!~~~~ 2 | -------------------------------------------------------------------------------- /onekey-install-nvjdc.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | 7 | # check root 8 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 9 | clear 10 | # globals 11 | CWD=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 12 | [ -e "${CWD}/scripts/globals" ] && . ${CWD}/scripts/globals 13 | 14 | 15 | 16 | checkos(){ 17 | ifTermux=$(echo $PWD | grep termux) 18 | ifMacOS=$(uname -a | grep Darwin) 19 | if [ -n "$ifTermux" ];then 20 | os_version=Termux 21 | elif [ -n "$ifMacOS" ];then 22 | os_version=MacOS 23 | else 24 | os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.') 25 | fi 26 | 27 | if [[ "$os_version" == "2004" ]] || [[ "$os_version" == "10" ]] || [[ "$os_version" == "11" ]];then 28 | ssll="-k --ciphers DEFAULT@SECLEVEL=1" 29 | fi 30 | } 31 | checkos 32 | 33 | CountRunTimes(){ 34 | RunTimes=$(curl -s --max-time 10 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fghproxy.com%2Fhttps%3A%2F%2Fraw.githubusercontent.com%2F07031218%2Fnormal-shell%2Fmain%2Fonekey-install-nvjdc.sh&count_bg=%2379C83D&title_bg=%2300B1FF&icon=&icon_color=%23E7E7E7&title=script+run+times&edge_flat=false" > ~/couting.txt) 35 | TodayRunTimes=$(cat ~/couting.txt | tail -3 | head -n 1 | awk '{print $5}') 36 | TotalRunTimes=$(cat ~/couting.txt | tail -3 | head -n 1 | awk '{print $7}') 37 | rm -rf ~/couting.txt 38 | } 39 | 40 | CountRunTimes 41 | checkCPU(){ 42 | CPUArch=$(uname -m) 43 | if [[ "$CPUArch" == "aarch64" ]];then 44 | arch=linux_arm64 45 | elif [[ "$CPUArch" == "i686" ]];then 46 | arch=linux_386 47 | elif [[ "$CPUArch" == "arm" ]];then 48 | arch=linux_arm 49 | elif [[ "$CPUArch" == "x86_64" ]] && [ -n "$ifMacOS" ];then 50 | arch=darwin_amd64 51 | elif [[ "$CPUArch" == "x86_64" ]];then 52 | arch=linux_amd64 53 | fi 54 | } 55 | checkCPU 56 | check_dependencies(){ 57 | 58 | os_detail=$(cat /etc/os-release 2> /dev/null) 59 | if_debian=$(echo $os_detail | grep 'ebian') 60 | if_redhat=$(echo $os_detail | grep 'rhel') 61 | if [ -n "$if_debian" ];then 62 | InstallMethod="apt" 63 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 64 | InstallMethod="yum" 65 | elif [[ "$os_version" == "MacOS" ]];then 66 | InstallMethod="brew" 67 | fi 68 | } 69 | check_dependencies 70 | #安装wget、curl、unzip 71 | ${InstallMethod} install unzip wget curl -y > /dev/null 2>&1 72 | get_opsy() { 73 | [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return 74 | [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return 75 | [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return 76 | } 77 | virt_check() { 78 | # if hash ifconfig 2>/dev/null; then 79 | # eth=$(ifconfig) 80 | # fi 81 | 82 | virtualx=$(dmesg) 2>/dev/null 83 | 84 | if [[ $(which dmidecode) ]]; then 85 | sys_manu=$(dmidecode -s system-manufacturer) 2>/dev/null 86 | sys_product=$(dmidecode -s system-product-name) 2>/dev/null 87 | sys_ver=$(dmidecode -s system-version) 2>/dev/null 88 | else 89 | sys_manu="" 90 | sys_product="" 91 | sys_ver="" 92 | fi 93 | 94 | if grep docker /proc/1/cgroup -qa; then 95 | virtual="Docker" 96 | elif grep lxc /proc/1/cgroup -qa; then 97 | virtual="Lxc" 98 | elif grep -qa container=lxc /proc/1/environ; then 99 | virtual="Lxc" 100 | elif [[ -f /proc/user_beancounters ]]; then 101 | virtual="OpenVZ" 102 | elif [[ "$virtualx" == *kvm-clock* ]]; then 103 | virtual="KVM" 104 | elif [[ "$cname" == *KVM* ]]; then 105 | virtual="KVM" 106 | elif [[ "$cname" == *QEMU* ]]; then 107 | virtual="KVM" 108 | elif [[ "$virtualx" == *"VMware Virtual Platform"* ]]; then 109 | virtual="VMware" 110 | elif [[ "$virtualx" == *"Parallels Software International"* ]]; then 111 | virtual="Parallels" 112 | elif [[ "$virtualx" == *VirtualBox* ]]; then 113 | virtual="VirtualBox" 114 | elif [[ -e /proc/xen ]]; then 115 | virtual="Xen" 116 | elif [[ "$sys_manu" == *"Microsoft Corporation"* ]]; then 117 | if [[ "$sys_product" == *"Virtual Machine"* ]]; then 118 | if [[ "$sys_ver" == *"7.0"* || "$sys_ver" == *"Hyper-V" ]]; then 119 | virtual="Hyper-V" 120 | else 121 | virtual="Microsoft Virtual Machine" 122 | fi 123 | fi 124 | else 125 | virtual="Dedicated母鸡" 126 | fi 127 | } 128 | get_system_info() { 129 | cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') 130 | #cores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo) 131 | #freq=$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') 132 | #corescache=$(awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') 133 | #tram=$(free -m | awk '/Mem/ {print $2}') 134 | #uram=$(free -m | awk '/Mem/ {print $3}') 135 | #bram=$(free -m | awk '/Mem/ {print $6}') 136 | #swap=$(free -m | awk '/Swap/ {print $2}') 137 | #uswap=$(free -m | awk '/Swap/ {print $3}') 138 | #up=$(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days %d hour %d min\n",a,b,c)}' /proc/uptime) 139 | #load=$(w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//') 140 | opsy=$(get_opsy) 141 | arch=$(uname -m) 142 | #lbit=$(getconf LONG_BIT) 143 | kern=$(uname -r) 144 | # disk_size1=$( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|overlay|shm|udev|devtmpfs|by-uuid|chroot|Filesystem' | awk '{print $2}' ) 145 | # disk_size2=$( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|overlay|shm|udev|devtmpfs|by-uuid|chroot|Filesystem' | awk '{print $3}' ) 146 | # disk_total_size=$( calc_disk ${disk_size1[@]} ) 147 | # disk_used_size=$( calc_disk ${disk_size2[@]} ) 148 | #tcpctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}') 149 | virt_check 150 | } 151 | copyright(){ 152 | clear 153 | echo -e " 154 | ————————————————————————————————————————————————————————————— 155 | Nvjdc自助面板一键安装脚本 156 | ${green} 157 | 脚本托管地址:https://git.io/JP7D5 158 | 159 | Powered by 翔翎 160 | 161 | 京豆羊毛脚本仓库监控频道:${plain}${red}https://t.me/farmercoin${plain} 162 | ————————————————————————————————————————————————————————————— 163 | " 164 | } 165 | quit(){ 166 | exit 167 | } 168 | 169 | install_nvjdc(){ 170 | echo -e "${red}开始进行安装,请根据命令提示操作${plain}" 171 | apt install git -y || yum install git -y > /dev/null 172 | git clone https://ghproxy.com/https://github.com/NolanHzy/nvjdcdocker.git /root/nolanjdc 173 | if [ ! -d "/root/nolanjdc/.local-chromium/Linux-884014" ]; then 174 | cd nolanjdc 175 | echo -e "${green}正在拉取chromium-browser-snapshots,体积100多M,请耐心等待下一步命令提示···${plain}" 176 | mkdir -p .local-chromium/Linux-884014 && cd .local-chromium/Linux-884014 177 | wget http://npm.taobao.org/mirrors/chromium-browser-snapshots/Linux_x64/884014/chrome-linux.zip 178 | unzip chrome-linux.zip 179 | rm -f chrome-linux.zip 180 | fi 181 | cd /root/nolanjdc 182 | mkdir /root/nolanjdc/Config 183 | clear 184 | read -p "请输入青龙服务器在web页面中显示的名称: " QLName && printf "\n" 185 | read -p "请输入nvjdc面板标题: " title && printf "\n" 186 | read -p "请输入nvjdc面板希望使用的端口号: " jdcport && printf "\n" 187 | read -p "请输入XDD面板地址,格式如http://192.168.2.2:6666/api/login/smslogin 如不启用直接回车: " XDDurl && printf "\n" 188 | read -p "请输入XDD面板Token(如不启用直接回车): " XDDToken && printf "\n" 189 | read -p "nvjdc是否对接青龙,输入y或者n " jdcqinglong && printf "\n" 190 | if [[ "$jdcqinglong" == "y" ]];then 191 | read -p "请输入青龙OpenApi Client ID: " ClientID && printf "\n" 192 | read -p "请输入青龙OpenApi Client Secret: " ClientSecret && printf "\n" 193 | read -p "请输入青龙服务器的url地址(类似http://192.168.2.2:5700): " QLurl && printf "\n" 194 | cat > /root/nolanjdc/Config/Config.json << EOF 195 | { 196 | ///浏览器最多几个网页 197 | "MaxTab": "4", 198 | //网站标题 199 | "Title": "${title}", 200 | //回收时间分钟 不填默认3分钟 201 | "Closetime": "5", 202 | //网站公告 203 | "Announcement": "本项目脚本收集于互联网。为了您的财产安全,请关闭京东免密支付。", 204 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 205 | "XDDurl": "${XDDurl}", 206 | ///xddToken 207 | "XDDToken": "${XDDToken}", 208 | ///青龙配置 注意 如果不要青龙 Config :[] 209 | "Config": [ 210 | { 211 | //序号必填从1 开始 212 | "QLkey": 1, 213 | //服务器名称 214 | "QLName": "${QLName}", 215 | //青龙地址 216 | "QLurl": "${QLurl}", 217 | //青龙2,9 OpenApi Client ID 218 | "QL_CLIENTID": "${ClientID}", 219 | //青龙2,9 OpenApi Client Secret 220 | "QL_SECRET": "${ClientSecret}", 221 | //CK最大数量 222 | "QL_CAPACITY": 40, 223 | "QRurl": "" 224 | } 225 | ] 226 | 227 | } 228 | EOF 229 | else 230 | cat > /root/nolanjdc/Config/Config.json << EOF 231 | { 232 | ///浏览器最多几个网页 233 | "MaxTab": "4", 234 | //网站标题 235 | "Title": "${title}", 236 | //回收时间分钟 不填默认3分钟 237 | "Closetime": "5", 238 | //网站公告 239 | "Announcement": "本项目脚本收集于互联网。为了您的财产安全,请关闭京东免密支付。", 240 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 241 | "XDDurl": "${XDDurl}", 242 | ///xddToken 243 | "XDDToken": "${XDDToken}", 244 | ///青龙配置 注意 如果不要青龙 Config :[] 245 | "Config": [] 246 | 247 | } 248 | EOF 249 | fi 250 | read -p "请输入自动滑块次数 直接回车默认5次后手动滑块 输入0为默认手动滑块: " AutoCaptcha && printf "\n" 251 | if [ ! -n "$AutoCaptcha" ];then 252 | sed -i "7a \ \"AutoCaptchaCount\": \"5\"," /root/nolanjdc/Config/Config.json 253 | else 254 | sed -i "7a \ \"AutoCaptchaCount\": \"${AutoCaptcha}\"," /root/nolanjdc/Config/Config.json 255 | fi 256 | 257 | 258 | 259 | #判断机器是否安装docker 260 | if test -z "$(which docker)"; then 261 | echo -e "检测到系统未安装docker,开始安装docker" 262 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun > /dev/null 2>&1 263 | curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose && ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 264 | fi 265 | 266 | #拉取nvjdc镜像 267 | echo -e "${green}开始拉取nvjdc镜像文件,nvjdc镜像比较大,请耐心等待${plain}" 268 | docker pull nolanhzy/nvjdc:latest 269 | 270 | 271 | #创建并启动nvjdc容器 272 | echo -e "${green}开始创建nvjdc容器${plain}" 273 | docker run --name nvjdc -p ${jdcport}:80 -d -v "$(pwd)":/app \ 274 | -v /etc/localtime:/etc/localtime:ro \ 275 | -it --privileged=true nolanhzy/nvjdc:latest 276 | docker update --restart=always nvjdc 277 | 278 | baseip=$(curl -s ipip.ooo) > /dev/null 279 | 280 | echo -e "${green}安装完毕,面板访问地址:http://${baseip}:${jdcport}${plain}" 281 | echo -e "${green}京豆羊毛脚本仓库监控频道:${plain}${red}https://t.me/farmercoin${plain}" 282 | echo -e "${green}检测脚本当天运行次数:${TodayRunTimes}; 共计运行次数:${TotalRunTimes} ${plain}" 283 | } 284 | 285 | update_nvjdc(){ 286 | portinfo=$(docker port nvjdc | head -1 | sed 's/ //g' | sed 's/80\/tcp->0.0.0.0://g') 287 | docker stop nvjdc 288 | apt install git -y || yum install git -y > /dev/null 289 | if [ ! -d "/root/nolanjdc" ];then 290 | git clone https://ghproxy.com/https://github.com/NolanHzy/nvjdcdocker.git /root/nolanjdc 291 | else 292 | cd /root/nolanjdc && git pull 293 | fi 294 | if [ ! -f "/root/nvjdc/Config.json" ];then 295 | cd /root/nolanjdc 296 | else 297 | cd /root/nolanjdc && mkdir -p Config && mv /root/nvjdc/Config.json /root/nolanjdc/Config/Config.json 298 | fi 299 | if [ ! -d "/root/nvjdc/.local-chromium" ];then 300 | cd /root/nolanjdc 301 | else 302 | cd /root/nolanjdc && mkdir -p /root/nolanjdc/.local-chromium && mv /root/nvjdc/.local-chromium /root/nolanjdc/.local-chromium 303 | fi 304 | if [ ! -d "/root/nolanjdc/.local-chromium" ];then 305 | mkdir -p /root/nolanjdc/.local-chromium/Linux-884014 && cd /root/nolanjdc/.local-chromium/Linux-884014 306 | wget http://npm.taobao.org/mirrors/chromium-browser-snapshots/Linux_x64/884014/chrome-linux.zip 307 | unzip chrome-linux.zip 308 | rm -f chrome-linux.zip 309 | fi 310 | condition=$(cat /root/nolanjdc/Config/Config.json | grep -o '"XDDurl": .*' | awk -F":" '{print $1}' | sed 's/\"//g') 311 | AutoCaptcha1=$(cat /root/nolanjdc/Config/Config.json | grep -o '"AutoCaptchaCount": .*' | awk -F":" '{print $1}' | sed 's/\"//g') 312 | if [ ! -n "$condition" ]; then 313 | read -p "是否要对接XDD,输入y或者n: " XDD && printf "\n" 314 | if [[ "$XDD" == "y" ]];then 315 | read -p "请输入XDD面板地址,格式如http://192.168.2.2:6666/api/login/smslogin : " XDDurl && printf "\n" 316 | read -p "请输入XDD面板Token: " XDDToken && printf "\n" 317 | sed -i "7a \ \"XDDurl\": \"${XDDurl}\"," /root/nolanjdc/Config/Config.json 318 | sed -i "7a \ \"XDDToken\": \"${XDDToken}\"," /root/nolanjdc/Config/Config.json 319 | fi 320 | fi 321 | 322 | if [ ! -n "$AutoCaptcha1" ];then 323 | read -p "请输入自动滑块次数 直接回车默认5次后手动滑块 输入0为默认手动滑块: " AutoCaptcha && printf "\n" 324 | if [ ! -n "$AutoCaptcha" ];then 325 | sed -i "5a \ \"AutoCaptchaCount\": \"5\"," /root/nolanjdc/Config/Config.json 326 | else 327 | sed -i "5a \ \"AutoCaptchaCount\": \"${AutoCaptcha}\"," /root/nolanjdc/Config/Config.json 328 | fi 329 | fi 330 | baseip=$(curl -s ipip.ooo) > /dev/null 331 | 332 | #docker pull nolanhzy/nvjdc:latest 333 | #docker run --name nvjdc -p ${portinfo}:80 -d -v "$(pwd)":/app \ 334 | #-v /etc/localtime:/etc/localtime:ro \ 335 | #-it --privileged=true nolanhzy/nvjdc:latest 336 | #docker update --restart=always nvjdc 337 | docker restart nvjdc 338 | echo -e "${green}nvjdc更新完毕,脚本自动退出。${plain}" 339 | echo -e "${green}面板访问地址:http://${baseip}:${portinfo}${plain}" 340 | echo -e "${green}京豆羊毛脚本仓库监控频道:${plain}${red}https://t.me/farmercoin${plain}" 341 | echo -e "${green}检测脚本当天运行次数:${TodayRunTimes}; 共计运行次数:${TotalRunTimes} ${plain}" 342 | exit 0 343 | } 344 | 345 | uninstall_nvjdc(){ 346 | docker rm -f nvjdc 347 | rm -rf /root/nolanjdc 348 | echo -e "${green}nvjdc面板已卸载,脚本自动退出,请手动删除nvjdc的镜像。${plain}" 349 | echo -e "${green}检测脚本当天运行次数:${TodayRunTimes}; 共计运行次数:${TotalRunTimes} ${plain}" 350 | exit 0 351 | } 352 | 353 | menu() { 354 | echo -e "\ 355 | ${green}0.${plain} 退出脚本 356 | ${green}1.${plain} 安装nvjdc 357 | ${green}2.${plain} 升级nvjdc 358 | ${green}3.${plain} 卸载nvjdc 359 | " 360 | get_system_info 361 | echo -e "当前系统信息: ${green}$opsy $virtual $arch $kern${plain} 362 | " 363 | 364 | read -p "请输入数字 :" num 365 | case "$num" in 366 | 0) 367 | quit 368 | ;; 369 | 1) 370 | install_nvjdc 371 | ;; 372 | 2) 373 | update_nvjdc 374 | ;; 375 | 3) 376 | uninstall_nvjdc 377 | ;; 378 | *) 379 | clear 380 | echo -e "${Error}:请输入正确数字 [0-3]" 381 | sleep 5s 382 | menu 383 | ;; 384 | esac 385 | } 386 | copyright 387 | menu 388 | -------------------------------------------------------------------------------- /oracle-alive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [[ $EUID -ne 0 ]]; then 3 | echo -e "脚本必须root账号运行,请切换root用户后再执行本脚本!" 4 | exit 1 5 | fi 6 | if [[ `which python3` == "" ]]; then 7 | apt update || yum update 8 | apt install python3 -y || yum install python3 -y 9 | fi 10 | cpunumber=$(cat /proc/cpuinfo| grep "processor"| wc -l) # 取CPU线程数量 11 | cpup=$(expr ${cpunumber} \* 15) # 设定CPU占用百分数值 12 | # 取内存占用数值开始处 13 | if [[ `uname -m` == "aarch64" ]]; then 14 | memorylimit="${cpunumber}*0.6*1024*1024*1024" 15 | elif [[ `uname -m` == "x86_64" ]]; then 16 | memorylimit="${cpunumber}*0.1*1024*1024*1024" 17 | fi 18 | # 取内存占用数值结束处 19 | checkstatus(){ 20 | if [[ -f /tmp/cpu.py ]]; then 21 | systemctl stop KeepCPU 22 | systemctl disable KeepCPU 23 | rm /tmp/cpu.py && rm /etc/systemd/system/KeepCPU.service 24 | elif [[ -f /etc/systemd/system/KeepCPU.service ]] && [[ -f /root/cpu.py ]]; then 25 | systemctl stop KeepCPU 26 | systemctl disable KeepCPU 27 | rm /root/cpu.py && rm /etc/systemd/system/KeepCPU.service 28 | elif [[ `ps aux|grep cpumemory.py|wc -l` == 2 ]] && [[ -f /root/cpumemory.py ]]; then 29 | echo "检测到机器上已经部署过保号脚本了,程序退出。" 30 | exit 0 31 | fi 32 | } 33 | 34 | config_cpu(){ 35 | checkstatus 36 | # 配置CPU占用开始 37 | cat > /etc/systemd/system/KeepCpuMemory.service < /root/cpumemory.py < /etc/systemd/system/KeepCpuMemory.service < /root/cpumemory.py < 0 ]];then 97 | key="$1" 98 | case $key in 99 | -c|--cpu) 100 | config_cpu 101 | ;; 102 | -cm|--cpumemory) 103 | config_cpu_memory 104 | ;; 105 | -u|--uninstall) 106 | removesh 107 | ;; 108 | esac 109 | elif [[ $# -eq 0 ]]; then 110 | config_cpu 111 | fi 112 | -------------------------------------------------------------------------------- /oracle/1.txt: -------------------------------------------------------------------------------- 1 | 1 2 | -------------------------------------------------------------------------------- /oracle/oracle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/oracle/oracle -------------------------------------------------------------------------------- /oracle/oracle-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/oracle/oracle-arm -------------------------------------------------------------------------------- /overlay-check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | lowerdir="/youtube-lower" # 填写GD原始挂载点路径,末尾不带/ 3 | upperdir="/youtube-upper" # 填写削刮文件存放路径,末尾不带/ 4 | workdir="/youtube-work" # 填写overlay分层文件的临时工作路径,末尾不带/ 5 | mountdir="/youtube" # 填写overlay的顶端merga路径,末尾不带/ 6 | rcloneconfig="sa-anboy0714" # 填写GD网盘的rclone config配置名称 7 | if [[ ! -f ${upperdir}/油管专辑/xuegua.tar ]]; then 8 | if [[ ! -d ${upperdir}/油管专辑 ]]; then 9 | mkdir -p ${upperdir}/油管专辑 10 | fi 11 | cp ${lowerdir}/油管削刮包/xuegua.tar ${upperdir}/油管专辑/ && cd ${upperdir}/油管专辑/ && tar xvf xuegua.tar 12 | /usr/bin/mount -t overlay -o lowerdir=${lowerdir},upperdir=${upperdir},workdir=${workdir} overlay ${mountdir} 13 | fi 14 | if [[ `rclone size ${rcloneconfig}:油管削刮包/xuegua.tar|sed -n '2p'|awk '{print $5}'|sed 's/(//'` != `du ${upperdir}/油管专辑/xuegua.tar -b|awk '{print $1}'` ]]; then 15 | rclone copy ${rcloneconfig}:油管削刮包/xuegua.tar ${upperdir}/油管专辑/ -P && cd ${upperdir}/油管专辑/ && tar xvf xuegua.tar 16 | /usr/bin/umount ${mountdir} 17 | systemctl stop rclone-sa-anboy0714 18 | systemctl start rclone-sa-anboy0714 19 | /usr/bin/mount -t overlay -o lowerdir=${lowerdir},upperdir=${upperdir},workdir=${workdir} overlay ${mountdir} 20 | else 21 | echo "削刮包没有更新,程序退出。" 22 | fi 23 | -------------------------------------------------------------------------------- /overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | RED='\E[1;31m' 3 | RED_W='\E[41;37m' 4 | END='\E[0m' 5 | red='\033[0;31m' 6 | green='\033[0;32m' 7 | yellow='\033[0;33m' 8 | plain='\033[0m' 9 | check_root(){ 10 | if [[ $EUID -ne 0 ]]; then 11 | echo -e "${Red}本脚本必须root账号运行,请切换root用户后再执行本脚本!${END}" 12 | exit 1 13 | fi 14 | } 15 | check_root 16 | if cat /etc/issue | grep -Eqi "debian"; then 17 | release="debian" 18 | elif cat /etc/issue | grep -Eqi "Armbian"; then 19 | release="Armbian" 20 | elif cat /etc/issue | grep -Eqi "Ubuntu"; then 21 | release="ubuntu" 22 | else 23 | echo -e "${red}脚本仅在Debian和Ubuntu系统上测试通过,请使用 Debian或Ubuntu系统!\n${plain}" && exit 1 24 | fi 25 | echo -ne "${yellow}请输入GD网盘的初始挂载点路径:${plain}" 26 | read lowerdir 27 | if [[ $lowerdir == "" ]]; then 28 | echo "${red}输入错误,程序退出。${plain}" 29 | exit 1 30 | fi 31 | echo -ne "${yellow}请输入upperdir(削刮文件)的存放路径:${plain}" 32 | read upperdir 33 | if [[ $upperdir == "" ]]; then 34 | echo -e "${red}输入错误,程序退出。${plain}" 35 | exit 1 36 | fi 37 | if [[ ! -d ${upperdir} ]]; then 38 | mkdir -p ${upperdir} 39 | fi 40 | echo -ne "${yellow}请输入workdir(overlay分层文件临时活动目录)的路径:${plain}" 41 | read workdir 42 | if [[ $workdir == "" ]]; then 43 | echo -e "${red}输入错误,程序退出。${plain}" 44 | exit 1 45 | fi 46 | if [[ ! -d ${workdir} ]]; then 47 | mkdir -p ${workdir} 48 | fi 49 | echo -ne "${yellow}请输入merga目录(overlay分层文件顶端合并目录)的路径:${plain}" 50 | read mountdir 51 | if [[ $mountdir == "" ]]; then 52 | echo -e "${red}输入错误,程序退出。${plain}" 53 | exit 1 54 | fi 55 | if [[ ! -d ${mountdir} ]]; then 56 | mkdir -p ${mountdir} 57 | fi 58 | $(which mount) -t overlay -o lowerdir=${lowerdir},upperdir=${upperdir},workdir=${workdir} overlay ${mountdir} 59 | if [[ "$?" -eq 0 ]]; then 60 | echo -e "${green}已经完成overlayFS文件系统挂载,开始将挂载写入开机自启动。${plain}" 61 | if [[ ! -f /etc/rc.local ]]; then 62 | cat > /etc/rc.local < /etc/systemd/system/rc-local.service <> /etc/rc.local 108 | if [[ "$?" -eq 0 ]]; then 109 | echo -e "${green}将挂载写入开机自启动成功。${plain}" 110 | fi 111 | fi 112 | else 113 | echo -e "${red}overlayFS文件系统挂载失败,程序退出。${plain}" 114 | exit 1 115 | fi 116 | -------------------------------------------------------------------------------- /pagermaid.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | White='\033[37m' 5 | blue='\033[36m' 6 | yellow='\033[0;33m' 7 | plain='\033[0m' 8 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 9 | opsy=$([ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$5}' /etc/os-release) 10 | if [[ "${opsy}" == "Debian 11" ]];then 11 | : 12 | else 13 | echo -e "${red}本脚本仅支持Debian 11,不适用当前系统,程序退出${plain}" 14 | exit 0 15 | fi 16 | CWD=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 17 | [ -e "${CWD}/scripts/globals" ] && . ${CWD}/scripts/globals 18 | CountRunTimes(){ 19 | RunTimes=$(curl -s --max-time 10 "https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fraw.githubusercontent.com%2F07031218%2Fnormal-shell%2Fmain%2Fpagermaid.sh&count_bg=%2379C83D&title_bg=%2300B1FF&icon=&icon_color=%23E7E7E7&title=script+run+times&edge_flat=false" > ~/couting.txt) 20 | TodayRunTimes=$(cat ~/couting.txt | tail -3 | head -n 1 | awk '{print $5}') 21 | TotalRunTimes=$(cat ~/couting.txt | tail -3 | head -n 1 | awk '{print $7}') 22 | rm -rf ~/couting.txt 23 | } 24 | CountRunTimes 25 | copyright(){ 26 | echo -e " 27 | ${green}###########################################################${plain} 28 | ${green}# #${plain} 29 | ${green}# pagermaid一键安装脚本[For Debian 11] #${plain} 30 | ${green}# Powered by 翔翎 #${plain} 31 | ${green}# #${plain} 32 | ${green}###########################################################${plain}" 33 | } 34 | Goodbye(){ 35 | echo -e "================================================" 36 | echo -e "${green}脚本执行已结束,感谢使用此脚本 ${plain}"; 37 | echo -e "${yellow}检测脚本当天运行次数:${plain}${red}${TodayRunTimes}次; ${plain}${yellow}脚本共计运行次数:${plain}${red}${TotalRunTimes}次 ${plain}" 38 | echo -e "================================================" 39 | } 40 | login_screen() { 41 | screen -S userbot -X quit >>/dev/null 2>&1 42 | screen -dmS userbot 43 | sleep 1 44 | screen -x -S userbot -p 0 -X stuff "cd /var/lib/pagermaid && python3 -m pagermaid" 45 | screen -x -S userbot -p 0 -X stuff $'\n' 46 | sleep 3 47 | if [ "$(ps -def | grep [p]agermaid | grep -v grep)" == "" ]; then 48 | echo "PagerMaid 运行时发生错误,错误信息:" 49 | cd /var/lib/pagermaid && python3 -m pagermaid >err.log 50 | cat err.log 51 | screen -S userbot -X quit >>/dev/null 2>&1 52 | exit 1 53 | fi 54 | while :; do 55 | read -p "请输入您的 Telegram 手机号码(带国际区号 如 +8618888888888): " phonenum 56 | 57 | if [ "$phonenum" == "" ]; then 58 | continue 59 | fi 60 | 61 | screen -x -S userbot -p 0 -X stuff "$phonenum" 62 | screen -x -S userbot -p 0 -X stuff $'\n' 63 | 64 | sleep 2 65 | 66 | if [ "$(ps -def | grep [p]agermaid | grep -v grep)" == "" ]; then 67 | echo "手机号输入错误!请确认您是否带了区号(中国号码为 +86 如 +8618888888888)" 68 | screen -x -S userbot -p 0 -X stuff "cd /var/lib/pagermaid && python3 -m pagermaid" 69 | screen -x -S userbot -p 0 -X stuff $'\n' 70 | continue 71 | fi 72 | 73 | sleep 1 74 | if [ "$(ps -def | grep [p]agermaid | grep -v grep)" == "" ]; then 75 | echo "PagerMaid 运行时发生错误,可能是因为发送验证码失败,请检查您的 API_ID 和 API_HASH" 76 | exit 1 77 | fi 78 | 79 | read -p "请输入您的登录验证码: " checknum 80 | if [ "$checknum" == "" ]; then 81 | read_checknum 82 | break 83 | fi 84 | 85 | read -p "请再次输入您的登录验证码:" checknum2 86 | if [ "$checknum" != "$checknum2" ]; then 87 | echo "两次验证码不一致!请重新输入您的登录验证码" 88 | read_checknum 89 | break 90 | else 91 | screen -x -S userbot -p 0 -X stuff "$checknum" 92 | screen -x -S userbot -p 0 -X stuff $'\n' 93 | fi 94 | read -p "有没有二次登录验证码? [Y/n]" choi 95 | if [ "$choi" == "y" ] || [ "$choi" == "Y" ]; then 96 | read -p "请输入您的二次登录验证码: " twotimepwd 97 | screen -x -S userbot -p 0 -X stuff "$twotimepwd" 98 | screen -x -S userbot -p 0 -X stuff $'\n' 99 | break 100 | else 101 | break 102 | fi 103 | done 104 | sleep 5 105 | screen -S userbot -X quit >>/dev/null 2>&1 106 | } 107 | install_pagermaid(){ 108 | copyright 109 | echo -e "${red}即将开始安装pagermaid,${plain}${red}本脚本仅支持Debian 11${plain}" 110 | echo -e "${blue}脚本基于ARM64版本撰写,未测试AMD64,理论同样可行。${plain}" 111 | echo -e -n "${green}是否继续执行脚本,如需要继续请输入y,如不继续,请按Ctrl+C退出脚本···${plain}" 112 | read go 113 | if [[ "$go" == "y" ]] || [[ "$go" == "Y" ]];then 114 | 115 | #判断机器是否安装docker 116 | # if test -z "$(which docker)"; then 117 | # echo -e "${yellow}检测到系统未安装docker,开始安装docker{plain}" 118 | # curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 119 | # fi 120 | apt update && apt-get install libffi-dev libssl-dev -y && apt install python3-dev -y && apt-get install -y python3 python3-pip && apt install git -y 121 | echo -e "${yellow}开始拉取pagermaid项目···${plain}" 122 | sleep 10s 123 | cd /var/lib && git clone https://gitlab.com/Xtao-Labs/pagermaid-modify.git pagermaid && cd pagermaid 124 | echo -e "${yellow}开始安装相关依赖和前置命令···${plain}" 125 | sleep 10s 126 | apt-get install imagemagick -y && apt-get install software-properties-common -y && apt-get update && sudo apt-get install neofetch -y && apt-get install libzbar-dev -y && sudo apt-get install tesseract-ocr tesseract-ocr-all -y && apt-get install redis-server -y && pip3 install -r requirements.txt && cp config.gen.yml config.yml 127 | echo -e "${red}开始配置TG的api_id和api_hash,请按照命令行提示操作···${plain}" 128 | echo -e "${yellow}请输入TG的api_id:${plain}" 129 | read apiid 130 | echo -e "${yellow}请输入TG的api_hash:${plain}" 131 | read apihash 132 | sed -i "s/ID_HERE/$apiid/" /var/lib/pagermaid/config.yml 133 | sed -i "s/HASH_HERE/$apihash/" /var/lib/pagermaid/config.yml 134 | echo -e "${yellow}5秒后将首次启动pagermaid,请按照命令行提示完成账号的首次登录操作以获取session···${plain}" 135 | sleep 3s 136 | login_screen 137 | echo -e "${yellow}开始对pagermaid进行开机自启动设置···${plain}" 138 | cat <<'TEXT' > /etc/systemd/system/pagermaid.service 139 | [Unit] 140 | Description=PagerMaid-Modify telegram utility daemon 141 | After=network.target 142 | 143 | [Install] 144 | WantedBy=multi-user.target 145 | 146 | [Service] 147 | Type=simple 148 | WorkingDirectory=/var/lib/pagermaid 149 | ExecStart=/usr/bin/python3 -m pagermaid 150 | Restart=always 151 | TEXT 152 | systemctl start pagermaid && systemctl enable pagermaid 153 | echo -e "${blue}pagermaid已经部署完成,程序将自动退出${plain}" 154 | Goodbye 155 | else 156 | exit 0 157 | fi 158 | } 159 | install_pagermaid 160 | -------------------------------------------------------------------------------- /plex-backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | White='\033[37m' 5 | blue='\033[36m' 6 | yellow='\033[0;33m' 7 | plain='\033[0m' 8 | 9 | bakdir="" # 此处填写GD挂载路径下的备份目录路径 10 | DEL_DAY=7 # 备份文件保存的天数 11 | 12 | databasefile_dir='/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases/' 13 | # plexdir1='/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Cache' 14 | # plexdir2='/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Metadata' 15 | # plexdir3='/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Media' 16 | plexdir='/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/' 17 | # curr_date=`date +%Y-%m-%d` 18 | targz(){ 19 | if [[ `which pv` == "" ]]; then 20 | apt install pv -y || yum install pv -y 21 | fi 22 | if [[ $1 = '' ]]; then 23 | echo "参数缺失,用法 'targz 压缩名 文件名/目录名'" 24 | exit 1 25 | fi 26 | 27 | tar -cf - $4 $3 $2 | pv -s $(du -sk $2 | awk '{print $1}') | gzip > $1 28 | } 29 | backup_plex(){ 30 | service plexmediaserver stop 31 | cd "$databasefile_dir" 32 | if [[ ! -d $bakdir/$(date +%Y%m%d) ]]; then 33 | echo -e "${red}本地备份缓存目录不存在,开始创建备份缓存目录${plain}" 34 | mkdir -p $bakdir/$(date +%Y%m%d) 35 | else 36 | echo -e "${green}本地备份缓存目录存在,程序继续${plain}" 37 | fi 38 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 39 | echo -e "${White}开始打包plex削刮数据库${plain}" 40 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 41 | targz $bakdir/$(date +%Y%m%d)/plexdatabase.tar.gz ./com.plexapp.plugins.library.db 42 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 43 | echo -e "${White}plex削刮数据库打包完成,开始打包plex削刮缓存目录${plain}" 44 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 45 | # tar -czf /root/plex-bak/plexdatabase.tar.gz ./com.plexapp.plugins.library.db 46 | cd "$plexdir" 47 | # mkdir $bakdir/$(date +%Y%m%d) 48 | targz $bakdir/$(date +%Y%m%d)/plex-xuegua.tar.gz ./Metadata ./Cache ./Media 49 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 50 | echo -e "${White}打包plex削刮缓存目录完成${plain}" 51 | echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 52 | service plexmediaserver start 53 | # rclone copy -P /root/plex-bak/ $bakdir/$(date +%Y%m%d) 54 | # echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 55 | # echo -e "${White}同步plex削刮数据库和削刮缓存到谷歌盘完成,开始检查清理超${DEL_DAY}天的备份文件${plain}" 56 | # echo -e "${yellow}❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️${plain}" 57 | # rm /root/plex-bak/plexdatabase.tar.gz /root/plex-bak/plex-xuegua.tar.gz 58 | # 遍历备份目录下的日期目录 59 | LIST=$(ls $bakdir/) 60 | # 获取7天前的时间,用于作比较,早于该时间的文件将删除 61 | SECONDS=$(date -d "$(date +%F) -${DEL_DAY} days" +%s) 62 | for index in ${LIST} 63 | do 64 | # 对目录名进行格式化,取命名末尾的时间,格式如 20200902 65 | timeString=$(echo ${index} | egrep -o "?[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]") 66 | if [ -n "$timeString" ] 67 | then 68 | indexDate=${timeString//./-} 69 | indexSecond=$( date -d ${indexDate} +%s ) 70 | # 与当天的时间做对比,把早于7天的备份文件删除 71 | if [ $(( $SECONDS- $indexSecond )) -gt 0 ] 72 | then 73 | rm $bakdir/$index -rf 74 | # rclone purge $bakdir/$index 75 | fi 76 | fi 77 | done 78 | echo -e "${White}清理超${DEL_DAY}天的备份文件完成,程序退出${plain}" 79 | } 80 | restore_config(){ 81 | service plexmediaserver stop 82 | read -p "请输入要还原的数据的备份日期[yyyymmdd]:" bakdate 83 | cd "$databasefile_dir" 84 | tar xzvf $bakdir/${bakdate}/plexdatabase.tar.gz ./ 85 | cd "$plexdir" 86 | tar xzvf $bakdir/${bakdate}/plex-xuegua.tar.gz 87 | service plexmediaserver start 88 | echo "还原备份数据完成 ,程序退出······" 89 | exit 0 90 | } 91 | menu(){ 92 | echo -e " 93 | ${green}###########################################################${plain} 94 | ${green}# #${plain} 95 | ${green}# Plex削刮包、数据库一键备份&还原脚本 #${plain} 96 | ${green}# Powered by 翔翎 #${plain} 97 | ${green}# #${plain} 98 | ${green}###########################################################${plain}" 99 | echo -e " 100 | ${red}0.${plain} 退出脚本 101 | ${green}———————————————————————————————————————————————————————————${plain} 102 | ${green}1.${plain} 一键备份Plex削刮包、数据库 103 | ${green}2.${plain} 一键还原Plex削刮包、数据库 104 | " 105 | read -p "请输入你要选择的功能:" num 106 | case "$num" in 107 | 0) 108 | exit 0 109 | ;; 110 | 1) 111 | backup_plex 112 | ;; 113 | 2) 114 | restore_config 115 | ;; 116 | *) 117 | clear 118 | echo -e "${red}出现错误:请输入正确数字 [0-2]${plain}" 119 | sleep 3s 120 | menu 121 | ;; 122 | esac 123 | } 124 | if [[ $1 == "b" ]]; then 125 | # 可通过命令 bash plexback.sh b 实现一键备份 126 | backup_plex 127 | else 128 | menu 129 | fi 130 | -------------------------------------------------------------------------------- /plex.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 3 | 4 | function rclone_install() 5 | { 6 | echo "检查Rclone......" 7 | rclone --version 8 | if [ $? -eq 0 ]; then 9 | echo "检查到Rclone已安装!" 10 | else 11 | echo -e "\n| Rclone is installing ... " 12 | curl https://rclone.org/install.sh | sudo bash 13 | # 安装fuse 支持 14 | sudo apt-get install -y fuse 15 | fi 16 | } 17 | 18 | function gclone_install() 19 | { 20 | echo "检查Gclone......" 21 | gclone --version 22 | if [ $? -eq 0 ]; then 23 | echo "检查到Gclone已安装!" 24 | else 25 | echo -e "\n| Gclone is installing ... " 26 | bash <(wget -qO- https://raw.githubusercontent.com/07031218/normal-shell/main/gclone.sh) 27 | fi 28 | } 29 | 30 | function docker_install() 31 | { 32 | echo "检查Docker......" 33 | docker -v 34 | if [ $? -eq 0 ]; then 35 | echo "检查到Docker已安装!" 36 | else 37 | # 安装Docker 38 | echo -e "\n| Docker is installing ... " 39 | sudo apt-get update -y 40 | curl -fsSL get.docker.com -o get-docker.sh 41 | sudo sh get-docker.sh 42 | rm -f get-docker.sh 43 | fi 44 | } 45 | 46 | function download_res() 47 | { 48 | echo -e "\n| Resource File Downloading ... " 49 | sudo mkdir /plex 50 | cd /plex 51 | sudo curl -L https://install.emengweb.com/plex.tar.gz -o /plex/plex.tar.gz 52 | sudo tar zxvf plex.tar.gz 53 | rm -f plex.tar.gz 54 | } 55 | 56 | clear 57 | echo "+============================================================+" 58 | echo "| Plex with Nginx&SSL Installer |" 59 | echo "| |" 60 | echo "| |" 61 | echo "|------------------------------------------------------------|" 62 | echo "| https://emengweb.com |" 63 | echo "+============================================================+" 64 | echo -e "\n| 此Docker将自动帮您完成Nginx及SSL反带的配置,此后可直接通过https://域名进行访问Plex." 65 | echo "" 66 | # 安装基础组件 67 | echo -e "\n| Basic components is installing ... " 68 | sudo apt-get install -y curl 69 | 70 | # 安装Rclone 71 | rclone_install 72 | 73 | # 安装Gclone 74 | gclone_install 75 | 76 | # 安装Docker 77 | docker_install 78 | 79 | # 下载配置资源文件 80 | #download_res 81 | 82 | # 启动Docker Compose 83 | #echo -e "\n| Docker Compose Starting ... " 84 | #sudo docker-compose up 85 | 86 | # 配置完毕 87 | clear 88 | echo "+============================================================+" 89 | echo "| |" 90 | echo "| 目录配置 |" 91 | echo "| /plex/conf.d - Nginx虚拟主机配置目录 |" 92 | echo "| /plex/config:/config - Plex数据存储目录 |" 93 | echo "| /plex/transcode:/transcode - 转码预留目录 |" 94 | echo "| /plex/disk - Rclone请挂载在此目录下,例如gd目录 |" 95 | echo "| |" 96 | echo "+============================================================+" 97 | echo "" 98 | echo -e "\n| 配置完成." 99 | echo -e "\n| 您还需要完成以下配置:" 100 | echo -e "\n| 1、设置域名 DNS 解析到本机IP" 101 | echo -e "\n| 2、修改 '/plex/docker-compose.yml' 文件,确保正确设置'FQDN'-域名及邮箱地址 'CERTBOT_EMAIL'" 102 | echo -e "\n| 3、将Rclone磁盘映射至/plex/disk的子目录下,例如:/plex/disk/gd" 103 | echo -e "\n| 以上准备工作完成后,进入/plex文件夹,输入 'docker-compose up -d' 启动 plex docker 容器,记得先映射至127.0.0.1:32400端口,打开浏览器完成plex的配置。" 104 | echo -e "\n| 此Docker将自动帮您完成Nginx及SSL反带的配置,可直接通过https://域名进行访问Plex." 105 | echo -e "\n| 祝好运." 106 | -------------------------------------------------------------------------------- /plex/plex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/plex/plex -------------------------------------------------------------------------------- /plex/plex-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/plex/plex-arm -------------------------------------------------------------------------------- /plex/proxypass.conf: -------------------------------------------------------------------------------- 1 | #PROXY-START/ 2 | location ~* \.(php|jsp|cgi|asp|aspx)$ 3 | { 4 | proxy_pass http://127.0.0.1:32400; 5 | proxy_set_header Host $host; 6 | proxy_set_header X-Real-IP $remote_addr; 7 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 8 | proxy_set_header REMOTE-HOST $remote_addr; 9 | } 10 | location / 11 | { 12 | proxy_pass http://127.0.0.1:32400; 13 | proxy_set_header Host $host; 14 | proxy_set_header X-Real-IP $remote_addr; 15 | #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 16 | proxy_set_header REMOTE-HOST $remote_addr; 17 | 18 | # Plex start 19 | # 解决视频预览进度条无法拖动的问题 20 | proxy_set_header Range $http_range; 21 | proxy_set_header If-Range $http_if_range; 22 | proxy_no_cache $http_range $http_if_range; 23 | 24 | # 反带流式,不进行缓冲 25 | client_max_body_size 0; 26 | proxy_http_version 1.1; 27 | proxy_request_buffering off; 28 | #proxy_ignore_client_abort on; 29 | 30 | # 同时反带WebSocket协议 31 | proxy_set_header X-Forwarded-For $remote_addr:$remote_port; 32 | proxy_set_header Upgrade $http_upgrade; 33 | proxy_set_header Connection "upgrade"; 34 | 35 | gzip off; 36 | # Plex end 37 | 38 | add_header X-Cache $upstream_cache_status; 39 | 40 | 41 | #Set Nginx Cache 42 | add_header Cache-Control no-cache; 43 | expires 12h; 44 | } 45 | 46 | #PROXY-END/ 47 | location /download { 48 | autoindex on; 49 | autoindex_exact_size off; 50 | autoindex_localtime on; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /proxy-domains.txt: -------------------------------------------------------------------------------- 1 | akadns.net 2 | akam.net 3 | akamai.com 4 | akamai.net 5 | akamaiedge.net 6 | akamaihd.net 7 | akamaistream.net 8 | akamaitech.net 9 | akamaitechnologies.com 10 | akamaitechnologies.fr 11 | akamaized.net 12 | edgekey.net 13 | edgesuite.net 14 | srip.net 15 | footprint.net 16 | level3.net 17 | llnwd.net 18 | edgecastcdn.net 19 | cloudfront.net 20 | hulu.com 21 | huluim.com 22 | hbonow.com 23 | hbogo.com 24 | hbo.com 25 | amazon.com 26 | amazon.co.uk 27 | amazonvideo.com 28 | crackle.com 29 | pandora.com 30 | vudu.com 31 | blinkbox.com 32 | abc.com 33 | fox.com 34 | theplatform.com 35 | nbc.com 36 | nbcuni.com 37 | ip2location.com 38 | pbs.org 39 | warnerbros.com 40 | southpark.cc.com 41 | cbs.com 42 | brightcove.com 43 | cwtv.com 44 | spike.com 45 | go.com 46 | mtv.com 47 | mtvnservices.com 48 | playstation.net 49 | uplynk.com 50 | maxmind.com 51 | disney.com 52 | disneyjunior.com 53 | xboxlive.com 54 | lovefilm.com 55 | turner.com 56 | amctv.com 57 | sho.com 58 | mog.com 59 | wdtvlive.com 60 | beinsportsconnect.tv 61 | beinsportsconnect.net 62 | fig.bbc.co.uk 63 | open.live.bbc.co.uk 64 | sa.bbc.co.uk 65 | www.bbc.co.uk 66 | crunchyroll.com 67 | ifconfig.co 68 | omtrdc.net 69 | sling.com 70 | movetv.com 71 | optus.com.au 72 | optusnet.com.au 73 | ipinfo.io 74 | fast.com 75 | netflix.com 76 | netflix.net 77 | nflxext.com 78 | nflximg.com 79 | nflximg.net 80 | nflxso.net 81 | nflxvideo.net 82 | netflixdnstest0.com 83 | netflixdnstest1.com 84 | netflixdnstest2.com 85 | netflixdnstest3.com 86 | netflixdnstest4.com 87 | netflixdnstest5.com 88 | netflixdnstest6.com 89 | netflixdnstest7.com 90 | netflixdnstest8.com 91 | netflixdnstest9.com 92 | hotstar.com 93 | go-mpulse.net 94 | theplatform.com 95 | uplynk.com 96 | edgedatg.com 97 | edgedatg.go.com 98 | cdn.registerdisney.go.com 99 | bilibili.com 100 | biligame.com 101 | biligame.net 102 | bilivideo.com 103 | bilivideo.cn 104 | acgvideo.com 105 | hdslb.com 106 | acg.tv 107 | b23.tv 108 | biliapi.com 109 | biliapi.net 110 | foxsports01-i.akamaihd.net 111 | foxsports02-i.akamaihd.net 112 | foxsports03-i.akamaihd.net 113 | cdn-fox-networks-group-green.akamaized.net 114 | staticasiafox.akamaized.net 115 | d3cv4a9a9wh0bt.cloudfront.net 116 | foxplus.com 117 | bcbolthboa-a.akamaihd.net 118 | hboasia1-i.akamaihd.net 119 | hboasia2-i.akamaihd.net 120 | hboasia3-i.akamaihd.net 121 | hboasia4-i.akamaihd.net 122 | hboasia5-i.akamaihd.net 123 | 44wilhpljf.execute-api.ap-southeast-1.amazonaws.com 124 | s3-ap-southeast-1.amazonaws.com 125 | cf-images.ap-southeast-1.prod.boltdns.net 126 | players.brightcove.net 127 | dai3fd1oh325y.cloudfront.net 128 | hbogoasia.com 129 | hbogoasia.hk 130 | iqiyi.com 131 | iqiyipic.com 132 | qy.net 133 | mytvsuper.com 134 | tvb.com 135 | nowe.com 136 | nowestatic.com 137 | d1k2us671qcoau.cloudfront.net 138 | d2anahhhmp1ffz.cloudfront.net 139 | dfp6rglgjqszk.cloudfront.net 140 | api.viu.now.com 141 | viu.com 142 | viu.tv 143 | bahamut.com.tw 144 | gamer.com.tw 145 | gamer-cds.cdn.hinet.net 146 | gamer2-cds.cdn.hinet.net 147 | catchplay.com 148 | d2ivmxp5z2ww0n.cloudfront.net 149 | ols-ww100-cp.akamaized.net 150 | tra-www000-cp.akamaized.net 151 | apl-hamivideo.cdn.hinet.net 152 | banner-cfnetwork.cdn.hinet.net 153 | hamivideo.hinet.net 154 | previewvod-hamivideo.cdn.hinet.net 155 | kfs.io 156 | kktv-theater.kk.stream 157 | kkbox.com 158 | kkbox.com.tw 159 | kktv.com.tw 160 | kktv.me 161 | litvfreemobile-hichannel.cdn.hinet.net 162 | litv.tv 163 | d3c7rimkq79yfu.cloudfront.net 164 | linetv.tw 165 | 4gtv.tv 166 | 4gtvfreepc-cds.cdn.hinet.net 167 | 4gtvfreepcvod-cds.cdn.hinet.net 168 | 4gtvpc-cds.cdn.hinet.net 169 | 4gtvpcvod-cds.cdn.hinet.net 170 | hamifans.emome.net 171 | skyking.com.tw 172 | abema.io 173 | abema.tv 174 | ds-linear-abematv.akamaized.net 175 | ds-vod-abematv.akamaized.net 176 | ameba.jp 177 | hayabusa.io 178 | d151l6v8er5bdm.cloudfront.net 179 | dazn-api.com 180 | dazn.com 181 | dazndn.com 182 | indazn.com 183 | intercom.io 184 | dmm-extension.com 185 | dmm.co.jp 186 | dmm.com 187 | fujitv.co.jp 188 | stream.ne.jp 189 | happyon.jp 190 | hulu.jp 191 | dmc.nico 192 | nicovideo.jp 193 | nimg.jp 194 | socdm.com 195 | paravi.jp 196 | radiko.jp 197 | radionikkei.jp 198 | smartstream.ne.jp 199 | tver.jp 200 | wowow.co.jp 201 | naver.com 202 | smartmediarep.com 203 | c4assets.com 204 | channel4.com 205 | aod-dash-uk-live.akamaized.net 206 | aod-hls-uk-live.akamaized.net 207 | vod-dash-uk-live.akamaized.net 208 | vod-thumb-uk-live.akamaized.net 209 | bbc.co 210 | bbc.co.uk 211 | bbc.com 212 | bbci.co 213 | bbci.co.uk 214 | bbcfmt.hs.llnwd.net 215 | britbox.com 216 | britbox.co.uk 217 | itvpnpmobile-a.akamaihd.net 218 | itv.com 219 | itvstatic.com 220 | d349g9zuie06uo.cloudfront.net 221 | channel5.com 222 | my5.tv 223 | skysports.com 224 | molotov.tv 225 | salto.fr 226 | abc.com 227 | cbs.com 228 | cbsaavideo.com 229 | cbsivideo.com 230 | cbsi.live.ott.irdeto.com 231 | cwtv.com 232 | cwtv-amd-akamai.akamaized.net 233 | edge.cwtv-vod-ext.top.comcast.net 234 | edge.cwtv-egress.top.comcast.net 235 | thecwvideo.com 236 | www.cwseed.com 237 | bamgrid.com 238 | disney-plus.net 239 | disneyplus.com 240 | dssott.com 241 | disneynow.com 242 | bcbolt446c5271-a.akamaihd.net 243 | edge.api.brightcove.com 244 | encoretvb.com 245 | espn.com 246 | espncdn.com 247 | fox.com 248 | foxdcg.com 249 | freeform.com 250 | fxnetworks.com 251 | hbo.com 252 | hbogo.com 253 | hbomax.com 254 | hbonow.com 255 | hulu.com 256 | huluim.com 257 | hulustream.com 258 | paramountplus.com 259 | pbs.org 260 | peacocktv.com 261 | sling.com 262 | movetv.com 263 | mtv.com 264 | mtvnservices.com 265 | nationalgeographic.com 266 | nbcuadops-vh.akamaihd.net 267 | nbc.co 268 | nbc.com 269 | nbcuni.com 270 | tve-static-syfy.akamaized.net 271 | tve-static-telemundo.akamaized.net 272 | tve-static-universalkids.akamaized.net 273 | tve-static-usanetwork.akamaized.net 274 | tvebravoeast-x.akamaized.net 275 | tvebravoeast-y.akamaized.net 276 | tvecnbc-x.akamaized.net 277 | tvecnbc-y.akamaized.net 278 | tveeeast-x.akamaized.net 279 | tveeeast-y.akamaized.net 280 | tvemsnbc-x.akamaized.net 281 | tvenbcsn-x.akamaized.net 282 | tvenbcsn-y.akamaized.net 283 | tveoxygeneast-x.akamaized.net 284 | tveoxygeneast-x.akamaized.net 285 | tvesyfyeast-x.akamaized.net 286 | tvesyfyeast-y.akamaized.net 287 | tveuniversalkidshls.akamaized.net 288 | tveusaeast-x.akamaized.net 289 | tveusaeast-x.akamaized.net 290 | tvewnbc-x.akamaized.net 291 | tvewnbc-y.akamaized.net 292 | usanetwork.com 293 | -------------------------------------------------------------------------------- /refresh-dns.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | #安装dig命令 12 | yum install bind-utils -y > /dev/null 2>&1 || apt-get install dnsutils -y > /dev/null 2>&1 13 | #检测dig命令是否安装成功 14 | #hash dig 2> /dev/null || { echo -e >&2 "${RED}出现异常 dnsutils 没有安装成功,脚本无法继续,将自动退出...${PLAIN}"; exit 1; } 15 | #定义变量 16 | URL=nf.20120714.xyz 17 | #IP=`ping ${URL} -c 1 |awk 'NR==2 {print $4}' |awk -F ':' '{print $1}'` 18 | #IP=`ping ${URL} -c 1 |awk 'NR==2 {print $5}' |awk -F ':' '{print $1}' |sed -nr "s#\(##gp"|sed -nr "s#\)##gp"` 19 | #dig命令获取域名的ip地址 20 | IP=$(ping nf.20120714.xyz -c 1 |awk 'NR==2 {print $5}' |awk -F ':' '{print $1}' |sed -nr "s#\(##gp"|sed -nr "s#\)##gp") 21 | 22 | echo -e "${BLUE}当前解锁服务器IP地址是 ${IP} ${PLAIN}" 23 | record=$(sed -n '1p' /etc/resolv.conf | grep 'nameserver'| sed 's/^.*nameserver//g' | sed 's/\"//g' | sed 's/\,//g' | sed 's/ //g') 24 | if [[ -n "${record}" ]] && [[ "${IP}" = "${record}" ]]; then 25 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 26 | echo -e "${GREEN}DNS解锁服务器地址无变化,无需修改, current IP: ${IP}${PLAIN}" 27 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 28 | exit 29 | elif [ ! -n "${record}" ]; then 30 | echo -e "${red}DNS服务器出现空白bug,开始修正${PLAIN}" 31 | #chattr -i /etc/resolv.conf && echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > /etc/resolv.conf && chattr +i /etc/resolv.conf 32 | #IP1=`dig ${URL} @223.5.5.5 | awk -F "[ ]+" '/IN/{print $1}' | awk 'NR==2 {print $5}'` 33 | #echo -e "${YELLOW}解锁服务器IP获取完成,开始修改本机DNS服务器地址${PLAIN}" 34 | chattr -i /etc/resolv.conf && echo -e "nameserver ${IP}\nnameserver 8.8.8.8" > /etc/resolv.conf && chattr +i /etc/resolv.conf 35 | echo -e "${GREEN}错误修正完成,开始畅游Netflix吧^_^ ${PLAIN}" 36 | else 37 | echo -e "${YELLOW}解锁服务器IP有变化,开始修改DNS服务器地址${PLAIN}" 38 | chattr -i /etc/resolv.conf && echo -e "nameserver ${IP}\nnameserver 8.8.8.8" > /etc/resolv.conf && chattr +i /etc/resolv.conf 39 | echo -e "${GREEN}修改DNS服务器地址完成,开始畅游Netflix吧^_^ ${PLAIN}" 40 | fi 41 | -------------------------------------------------------------------------------- /refresh-dns1.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | #安装dig命令 12 | yum install bind-utils -y > /dev/null 2>&1 || apt-get install dnsutils -y > /dev/null 2>&1 13 | #检测dig命令是否安装成功 14 | #hash dig 2> /dev/null || { echo -e >&2 "${RED}出现异常 dnsutils 没有安装成功,脚本无法继续,将自动退出...${PLAIN}"; exit 1; } 15 | #定义变量 16 | URL=armsgp.20120714.xyz 17 | #IP=`ping ${URL} -c 1 |awk 'NR==2 {print $4}' |awk -F ':' '{print $1}'` 18 | #IP=`ping ${URL} -c 1 |awk 'NR==2 {print $5}' |awk -F ':' '{print $1}' |sed -nr "s#\(##gp"|sed -nr "s#\)##gp"` 19 | #dig命令获取域名的ip地址 20 | IP=$(ping armsgp.20120714.xyz -c 1 |awk 'NR==2 {print $5}' |awk -F ':' '{print $1}' |sed -nr "s#\(##gp"|sed -nr "s#\)##gp") 21 | 22 | echo -e "${BLUE}当前解锁服务器IP地址是 ${IP} ${PLAIN}" 23 | record=$(sed -n '1p' /etc/resolv.conf | grep 'nameserver'| sed 's/^.*nameserver//g' | sed 's/\"//g' | sed 's/\,//g' | sed 's/ //g') 24 | if [[ -n "${record}" ]] && [[ "${IP}" = "${record}" ]]; then 25 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 26 | echo -e "${GREEN}DNS解锁服务器地址无变化,无需修改, current IP: ${IP}${PLAIN}" 27 | echo -e "${GREEN}-----------------------------------------------------------------------------${PLAIN}" 28 | exit 29 | elif [ ! -n "${record}" ]; then 30 | echo -e "${red}DNS服务器出现空白bug,开始修正${PLAIN}" 31 | #chattr -i /etc/resolv.conf && echo -e "nameserver 8.8.8.8\nnameserver 8.8.4.4" > /etc/resolv.conf && chattr +i /etc/resolv.conf 32 | #IP1=`dig ${URL} @223.5.5.5 | awk -F "[ ]+" '/IN/{print $1}' | awk 'NR==2 {print $5}'` 33 | #echo -e "${YELLOW}解锁服务器IP获取完成,开始修改本机DNS服务器地址${PLAIN}" 34 | chattr -i /etc/resolv.conf && echo -e "nameserver ${IP}\nnameserver 8.8.8.8" > /etc/resolv.conf && chattr +i /etc/resolv.conf 35 | echo -e "${GREEN}错误修正完成,开始畅游Netflix吧^_^ ${PLAIN}" 36 | else 37 | echo -e "${YELLOW}解锁服务器IP有变化,开始修改DNS服务器地址${PLAIN}" 38 | chattr -i /etc/resolv.conf && echo -e "nameserver ${IP}\nnameserver 8.8.8.8" > /etc/resolv.conf && chattr +i /etc/resolv.conf 39 | echo -e "${GREEN}修改DNS服务器地址完成,开始畅游Netflix吧^_^ ${PLAIN}" 40 | fi 41 | -------------------------------------------------------------------------------- /refresh_library_for_plex.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import json 4 | from plexapi.server import PlexServer 5 | 6 | # rclone 远程目录路径 7 | RCLONE_REMOTE_PATH = 'nongjiale:' 8 | 9 | # Plex 服务器配置 10 | PLEX_BASEURL = 'http://plexurl:32400' 11 | PLEX_TOKEN = '' 12 | 13 | # rclone网盘目录名和对应媒体库名的映射关系 14 | MEDIA_DIRS = { 15 | '电影': '电影-11', 16 | '剧集追新/国产剧': '华语剧追新', 17 | '剧集追新/欧美剧': '欧美剧追新', 18 | '剧集追新/日韩剧': '日韩剧追新' 19 | } 20 | 21 | # 获取 Plex 服务器对象 22 | plex = PlexServer(PLEX_BASEURL, PLEX_TOKEN) 23 | 24 | # 遍历所有要监视的目录 25 | for media_dir in MEDIA_DIRS: 26 | # 打开要写入的 txt 文件,如果文件不存在则创建它 27 | txt_file = open(f'.{MEDIA_DIRS[media_dir]}.txt', 'a+') 28 | 29 | # 将文件指针移动到文件开头 30 | txt_file.seek(0) 31 | 32 | # 读取本地保存的目录大小,如果文件为空则默认为 0 33 | local_size = int(txt_file.read() or 0) 34 | 35 | # 构建 rclone 命令行 36 | cmd = ['rclone', 'size', '--json', os.path.join(RCLONE_REMOTE_PATH, media_dir)] 37 | 38 | # 执行命令并获取输出结果 39 | output = subprocess.check_output(cmd).decode().strip() 40 | 41 | # 解析输出结果中的目录大小 42 | rc_data = json.loads(output) 43 | rc_size = rc_data['bytes'] 44 | 45 | # 如果目录大小发生变化,则刷新媒体库并更新本地保存的目录大小 46 | if rc_size != local_size: 47 | # 将文件的操作模式从追加模式变更为覆写模式 48 | txt_file = open(f'.{MEDIA_DIRS[media_dir]}.txt', 'w') 49 | # 将目录大小写入 txt 文件 50 | txt_file.seek(0) 51 | txt_file.write(str(rc_size) + "\n") 52 | txt_file.truncate() 53 | 54 | # 获取要刷新的媒体库对象,并刷新它 55 | library_name = MEDIA_DIRS[media_dir] 56 | library = plex.library.section(library_name) 57 | library.update() 58 | 59 | # 输出刷新信息 60 | print(f'{library_name} refreshed.') 61 | 62 | # 关闭 txt 文件 63 | txt_file.close() 64 | -------------------------------------------------------------------------------- /ssh-key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | check_dependencies(){ 3 | 4 | os_detail=$(cat /etc/os-release 2> /dev/null) 5 | if_debian=$(echo $os_detail | grep 'ebian') 6 | if_redhat=$(echo $os_detail | grep 'rhel') 7 | if [ -n "$if_debian" ];then 8 | InstallMethod="apt-get" 9 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 10 | InstallMethod="yum" 11 | fi 12 | } 13 | check_dependencies 14 | $InstallMethod update > /dev/null 15 | $InstallMethod install curl -y > /dev/null 16 | echo '============================ 17 | SSH Key Installer 18 | V1.0 19 | Author:翔翎 20 | ============================' 21 | cd ~ 22 | if [[ ! -d .ssh ]]; then 23 | mkdir .ssh 24 | fi 25 | cd .ssh 26 | read -p "请输入公钥内容(注意,公钥内容千万别漏字也别多字,也千万不要错把私钥内容复制上来了!):" keywords 27 | echo "$keywords" >authorized_keys 28 | chmod 700 authorized_keys 29 | cd ../ 30 | chmod 600 .ssh 31 | cd /etc/ssh/ 32 | 33 | sed -i "/PasswordAuthentication no/c PasswordAuthentication no" sshd_config 34 | sed -i "/RSAAuthentication no/c RSAAuthentication yes" sshd_config 35 | sed -i "/PubkeyAuthentication no/c PubkeyAuthentication yes" sshd_config 36 | sed -i "/PasswordAuthentication yes/c PasswordAuthentication no" sshd_config 37 | sed -i "/RSAAuthentication yes/c RSAAuthentication yes" sshd_config 38 | sed -i "/PubkeyAuthentication yes/c PubkeyAuthentication yes" sshd_config 39 | service sshd restart 40 | service ssh restart 41 | echo "启用密钥登录完成,密码登录已失效,后续请用对应私钥登录小鸡。" 42 | -------------------------------------------------------------------------------- /ssl_update_for_dns_manager.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import sys 6 | import subprocess 7 | from typing import Optional, Tuple 8 | 9 | # ANSI 颜色代码 10 | class Colors: 11 | GREEN = '\033[0;32m' 12 | YELLOW = '\033[1;33m' 13 | RED = '\033[0;31m' 14 | NC = '\033[0m' # No Color 15 | 16 | def print_colored(text: str, color: str): 17 | """打印彩色文本""" 18 | print(f"{color}{text}{Colors.NC}") 19 | 20 | def install_pymysql(): 21 | """安装 PyMySQL 模块""" 22 | print_colored("\n正在安装 PyMySQL 模块...", Colors.YELLOW) 23 | try: 24 | # 尝试使用 python3 安装 25 | try: 26 | subprocess.check_call([sys.executable, "-m", "pip", "install", "--user", "pymysql"]) 27 | print_colored("PyMySQL 安装成功!", Colors.GREEN) 28 | 29 | # 重新加载 sys.path 以包含新安装的包 30 | import site 31 | import importlib 32 | importlib.reload(site) 33 | 34 | # 重新导入 35 | global pymysql 36 | import pymysql 37 | return True 38 | except subprocess.CalledProcessError: 39 | # 如果用户级安装失败,尝试使用 sudo 40 | print_colored("尝试使用 sudo 安装...", Colors.YELLOW) 41 | try: 42 | subprocess.check_call(["sudo", sys.executable, "-m", "pip", "install", "pymysql"]) 43 | print_colored("PyMySQL 安装成功!", Colors.GREEN) 44 | 45 | # 重新加载 sys.path 以包含新安装的包 46 | import site 47 | import importlib 48 | importlib.reload(site) 49 | 50 | # 重新导入 51 | global pymysql 52 | import pymysql 53 | return True 54 | except subprocess.CalledProcessError as e: 55 | print_colored(f"安装失败: {e}", Colors.RED) 56 | print_colored("\n请手动尝试以下命令:", Colors.YELLOW) 57 | print_colored(f"1. {sys.executable} -m pip install --user pymysql", Colors.GREEN) 58 | print_colored(f"2. sudo {sys.executable} -m pip install pymysql", Colors.GREEN) 59 | return False 60 | 61 | except Exception as e: 62 | print_colored(f"安装过程出错: {e}", Colors.RED) 63 | print_colored("请尝试重新运行脚本", Colors.YELLOW) 64 | return False 65 | 66 | # 检查并安装 PyMySQL 67 | try: 68 | import pymysql 69 | except ImportError: 70 | print_colored("检测到未安装 PyMySQL 模块", Colors.YELLOW) 71 | if not install_pymysql(): 72 | print_colored("请安装完成后重新运行脚本", Colors.YELLOW) 73 | sys.exit(1) 74 | 75 | # 数据库配置 76 | DB_CONFIG = { 77 | 'host': '', 78 | 'user': '', 79 | 'password': '', 80 | 'db': '', 81 | 'charset': 'utf8mb4' 82 | } 83 | 84 | # 证书目录 85 | CERT_DIR = "/certs" 86 | 87 | def check_cert_dir_permissions() -> bool: 88 | """检查证书目录权限""" 89 | try: 90 | if not os.path.exists(CERT_DIR): 91 | os.makedirs(CERT_DIR, mode=0o755) 92 | elif not os.access(CERT_DIR, os.W_OK): 93 | print_colored(f"错误:无权限写入证书目录 {CERT_DIR}", Colors.RED) 94 | return False 95 | return True 96 | except Exception as e: 97 | print_colored(f"检查证书目录权限时出错: {e}", Colors.RED) 98 | return False 99 | 100 | def restart_nginx() -> bool: 101 | """重启 nginx 服务""" 102 | try: 103 | subprocess.check_call(["service", "nginx", "restart"]) 104 | print_colored("nginx 服务重启完成", Colors.GREEN) 105 | return True 106 | except subprocess.CalledProcessError as e: 107 | print_colored(f"nginx 重启失败: {e}", Colors.RED) 108 | return False 109 | except Exception as e: 110 | print_colored(f"重启 nginx 时发生错误: {e}", Colors.RED) 111 | return False 112 | 113 | def clear_screen(): 114 | """清屏""" 115 | os.system('cls' if os.name == 'nt' else 'clear') 116 | 117 | def test_db_connection() -> bool: 118 | """测试数据库连接""" 119 | try: 120 | conn = pymysql.connect(**DB_CONFIG) 121 | conn.close() 122 | return True 123 | except pymysql.Error as e: 124 | print_colored(f"数据库连接错误: {e}", Colors.RED) 125 | print_colored("\n请检查以下内容:", Colors.YELLOW) 126 | print("1. 数据库连接信息是否正确") 127 | print("2. 数据库服务是否运行") 128 | print("3. 防火墙是否允许连接") 129 | return False 130 | 131 | def get_certificate(domain: str) -> Optional[Tuple[str, str]]: 132 | """查询域名证书信息""" 133 | try: 134 | conn = pymysql.connect(**DB_CONFIG) 135 | try: 136 | with conn.cursor() as cursor: 137 | sql = """ 138 | SELECT o.fullchain, o.privatekey 139 | FROM dnsmgr_cert_order o 140 | INNER JOIN dnsmgr_cert_domain d ON o.id = d.id 141 | WHERE d.domain = %s 142 | """ 143 | cursor.execute(sql, (domain,)) 144 | result = cursor.fetchone() 145 | return result if result else None 146 | finally: 147 | conn.close() 148 | except pymysql.Error as e: 149 | print_colored(f"数据库错误: {e}", Colors.RED) 150 | return None 151 | 152 | def save_certificate(domain: str, cert_data: Tuple[str, str]) -> bool: 153 | """保存证书到文件""" 154 | try: 155 | domain_cert_dir = f"{CERT_DIR}/{domain}/certificate" 156 | os.makedirs(domain_cert_dir, mode=0o755, exist_ok=True) 157 | 158 | fullchain, privatekey = cert_data 159 | 160 | # 保存完整证书链 161 | with open(f"{domain_cert_dir}/chained.pem", "w") as f: 162 | f.write(fullchain) 163 | 164 | # 保存私钥 165 | with open(f"{domain_cert_dir}/domain.key", "w") as f: 166 | f.write(privatekey) 167 | 168 | # 设置适当的文件权限 169 | os.chmod(f"{domain_cert_dir}/chained.pem", 0o644) 170 | os.chmod(f"{domain_cert_dir}/domain.key", 0o600) 171 | 172 | return True 173 | except IOError as e: 174 | print_colored(f"保存证书文件时出错: {e}", Colors.RED) 175 | return False 176 | except Exception as e: 177 | print_colored(f"处理证书文件时出错: {e}", Colors.RED) 178 | return False 179 | 180 | def process_domain(domain: str) -> Optional[str]: 181 | """处理域名,获取第一个点后面的内容""" 182 | try: 183 | # 用点分割域名 184 | parts = domain.split('.') 185 | if len(parts) < 2: 186 | print_colored("错误:输入的不是有效的域名格式", Colors.RED) 187 | return None 188 | # 返回第一个点后面的所有内容 189 | return '.'.join(parts[1:]) 190 | except Exception as e: 191 | print_colored(f"域名处理错误: {e}", Colors.RED) 192 | return None 193 | 194 | def main(): 195 | """主函数""" 196 | try: 197 | # 检查证书目录权限 198 | if not check_cert_dir_permissions(): 199 | input("\n按回车键退出...") 200 | return 201 | 202 | # 测试数据库连接 203 | if not test_db_connection(): 204 | input("\n按回车键退出...") 205 | return 206 | 207 | while True: 208 | clear_screen() 209 | print_colored("域名证书查询工具", Colors.GREEN) 210 | print("------------------------") 211 | 212 | try: 213 | # 获取用户输入 214 | print_colored("\n请输入要查询的域名 (输入 'q' 退出):", Colors.YELLOW) 215 | print_colored("例如: www.example.com 将会查询 *.example.com", Colors.YELLOW) 216 | domain = input("> ").strip() 217 | 218 | if domain.lower() == 'q': 219 | print_colored("\n感谢使用,再见!", Colors.GREEN) 220 | break 221 | 222 | if not domain: 223 | print_colored("错误:域名不能为空,请重新输入", Colors.RED) 224 | input("\n按回车键继续...") 225 | continue 226 | 227 | # 处理域名 228 | processed_domain = process_domain(domain) 229 | if not processed_domain: 230 | input("\n按回车键继续...") 231 | continue 232 | 233 | # 添加通配符 234 | wildcard_domain = f"*.{processed_domain}" 235 | print_colored(f"\n将查询域名: {wildcard_domain}", Colors.YELLOW) 236 | print_colored("正在查询数据库...", Colors.YELLOW) 237 | 238 | # 查询证书 239 | cert_data = get_certificate(wildcard_domain) 240 | if not cert_data: 241 | print_colored(f"未找到域名 '{wildcard_domain}' 的证书信息", Colors.RED) 242 | input("\n按回车键继续...") 243 | continue 244 | 245 | # 保存证书 246 | if save_certificate(domain, cert_data): 247 | print_colored("\n证书已成功保存:", Colors.GREEN) 248 | print_colored(f"完整证书链: {CERT_DIR}/{domain}/certificate/chained.pem", Colors.YELLOW) 249 | print_colored(f"私钥: {CERT_DIR}/{domain}/certificate/domain.key", Colors.YELLOW) 250 | 251 | # 重启 nginx 252 | if not restart_nginx(): 253 | print_colored("请手动重启 nginx 服务", Colors.YELLOW) 254 | 255 | # 询问是否继续 256 | print_colored("\n是否继续查询其他域名?(y/n)", Colors.YELLOW) 257 | if input("> ").lower() != 'y': 258 | print_colored("\n感谢使用,再见!", Colors.GREEN) 259 | break 260 | 261 | except KeyboardInterrupt: 262 | print_colored("\n\n程序被中断,正在退出...", Colors.YELLOW) 263 | break 264 | 265 | except KeyboardInterrupt: 266 | print_colored("\n\n程序被中断,正在退出...", Colors.YELLOW) 267 | except Exception as e: 268 | print_colored(f"\n发生错误: {e}", Colors.RED) 269 | finally: 270 | print_colored("\n感谢使用,再见!", Colors.GREEN) 271 | 272 | if __name__ == "__main__": 273 | main() 274 | -------------------------------------------------------------------------------- /stream: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/stream -------------------------------------------------------------------------------- /superspeed.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | 12 | checkroot(){ 13 | [[ $EUID -ne 0 ]] && echo -e "${RED}请使用 root 用户运行本脚本!${PLAIN}" && exit 1 14 | } 15 | 16 | checksystem() { 17 | if [ -f /etc/redhat-release ]; then 18 | release="centos" 19 | elif cat /etc/issue | grep -Eqi "debian"; then 20 | release="debian" 21 | elif cat /etc/issue | grep -Eqi "ubuntu"; then 22 | release="ubuntu" 23 | elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then 24 | release="centos" 25 | elif cat /proc/version | grep -Eqi "debian"; then 26 | release="debian" 27 | elif cat /proc/version | grep -Eqi "ubuntu"; then 28 | release="ubuntu" 29 | elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then 30 | release="centos" 31 | fi 32 | } 33 | 34 | checkpython() { 35 | if [ ! -e '/usr/bin/python' ]; then 36 | echo "正在安装 Python" 37 | if [ "${release}" == "centos" ]; then 38 | yum update > /dev/null 2>&1 39 | yum -y install python > /dev/null 2>&1 40 | else 41 | apt-get update > /dev/null 2>&1 42 | apt-get -y install python > /dev/null 2>&1 43 | fi 44 | 45 | fi 46 | } 47 | 48 | checkcurl() { 49 | if [ ! -e '/usr/bin/curl' ]; then 50 | echo "正在安装 Curl" 51 | if [ "${release}" == "centos" ]; then 52 | yum update > /dev/null 2>&1 53 | yum -y install curl > /dev/null 2>&1 54 | else 55 | apt-get update > /dev/null 2>&1 56 | apt-get -y install curl > /dev/null 2>&1 57 | fi 58 | fi 59 | } 60 | 61 | checkwget() { 62 | if [ ! -e '/usr/bin/wget' ]; then 63 | echo "正在安装 Wget" 64 | if [ "${release}" == "centos" ]; then 65 | yum update > /dev/null 2>&1 66 | yum -y install wget > /dev/null 2>&1 67 | else 68 | apt-get update > /dev/null 2>&1 69 | apt-get -y install wget > /dev/null 2>&1 70 | fi 71 | fi 72 | } 73 | 74 | checkspeedtest() { 75 | if [ ! -e './speedtest-cli/speedtest' ]; then 76 | echo "正在安装 Speedtest-cli" 77 | wget --no-check-certificate -qO speedtest.tgz https://install.speedtest.net/app/cli/ookla-speedtest-1.0.0-$(uname -m)-linux.tgz > /dev/null 2>&1 78 | fi 79 | mkdir -p speedtest-cli && tar zxvf speedtest.tgz -C ./speedtest-cli/ > /dev/null 2>&1 && chmod a+rx ./speedtest-cli/speedtest 80 | } 81 | 82 | speed_test(){ 83 | speedLog="./speedtest.log" 84 | true > $speedLog 85 | speedtest-cli/speedtest -p no -s $1 --accept-license > $speedLog 2>&1 86 | is_upload=$(cat $speedLog | grep 'Upload') 87 | if [[ ${is_upload} ]]; then 88 | local REDownload=$(cat $speedLog | awk -F ' ' '/Download/{print $3}') 89 | local reupload=$(cat $speedLog | awk -F ' ' '/Upload/{print $3}') 90 | local relatency=$(cat $speedLog | awk -F ' ' '/Latency/{print $2}') 91 | 92 | local nodeID=$1 93 | local nodeLocation=$2 94 | local nodeISP=$3 95 | 96 | strnodeLocation="${nodeLocation}      " 97 | LANG=C 98 | #echo $LANG 99 | 100 | temp=$(echo "${REDownload}" | awk -F ' ' '{print $1}') 101 | if [[ $(awk -v num1=${temp} -v num2=0 'BEGIN{print(num1>num2)?"1":"0"}') -eq 1 ]]; then 102 | printf "${RED}%-6s${YELLOW}%s%s${GREEN}%-24s${CYAN}%s%-10s${BLUE}%s%-10s${PURPLE}%-8s${PLAIN}\n" "${nodeID}" "${nodeISP}" "|" "${strnodeLocation:0:24}" "↑ " "${reupload}" "↓ " "${REDownload}" "${relatency}" | tee -a $log 103 | fi 104 | else 105 | local cerror="ERROR" 106 | fi 107 | } 108 | 109 | preinfo() { 110 | echo "————————————————————————————————————————SuperSpeed 全面测速版——————————————————————————————————————————————————" 111 | echo " 本脚本借鉴修改自https://github.com/ernisn/superspeed,感谢原作者的付出" 112 | echo " bash <(curl -Lso- https://raw.githubusercontent.com/07031218/normal-shell/main/superspeed.sh)" 113 | echo " 全部节点列表: https://git.io/superspeedList" 114 | echo " 节点更新: 2020/04/09 | 脚本更新: 2020/04/09" 115 | echo "——————————————————————————————————————————————————————————————————————————————————————————————————————————————" 116 | } 117 | 118 | selecttest() { 119 | echo -e " 测速类型: ${GREEN}1.${PLAIN} 三网测速 ${GREEN}2.${PLAIN} 取消测速" 120 | echo -ne " ${GREEN}3.${PLAIN} 电信节点 ${GREEN}4.${PLAIN} 联通节点 ${GREEN}5.${PLAIN} 移动节点" 121 | while :; do echo 122 | read -p " 请输入数字选择测速类型: " selection 123 | if [[ ! $selection =~ ^[1-5]$ ]]; then 124 | echo -ne " ${RED}输入错误${PLAIN}, 请输入正确的数字!" 125 | else 126 | break 127 | fi 128 | done 129 | } 130 | 131 | runtest() { 132 | [[ ${selection} == 2 ]] && exit 1 133 | 134 | if [[ ${selection} == 1 ]]; then 135 | echo "——————————————————————————————————————————————————————————" 136 | echo "ID 测速服务器信息 上传/Mbps 下载/Mbps 延迟/ms" 137 | start=$(date +%s) 138 | 139 | speed_test '3633' '上海' '电信' 140 | speed_test '24012' '内蒙古呼和浩特' '电信' 141 | speed_test '27377' '北京5G' '电信' 142 | speed_test '29026' '四川成都' '电信' 143 | # speed_test '29071' '四川成都' '电信' 144 | speed_test '17145' '安徽合肥5G' '电信' 145 | speed_test '27594' '广东广州5G' '电信' 146 | # speed_test '27810' '广西南宁' '电信' 147 | speed_test '27575' '新疆乌鲁木齐' '电信' 148 | # speed_test '26352' '江苏南京5G' '电信' 149 | speed_test '5396' '江苏苏州5G' '电信' 150 | # speed_test '5317' '江苏连云港5G' '电信' 151 | # speed_test '7509' '浙江杭州' '电信' 152 | speed_test '23844' '湖北武汉' '电信' 153 | speed_test '29353' '湖北武汉5G' '电信' 154 | speed_test '28225' '湖南长沙5G' '电信' 155 | speed_test '3973' '甘肃兰州' '电信' 156 | # speed_test '19076' '重庆' '电信' 157 | #*** 158 | # speed_test '21005' '上海' '联通' 159 | speed_test '24447' '上海5G' '联通' 160 | # speed_test '5103' '云南昆明' '联通' 161 | speed_test '5145' '北京' '联通' 162 | # speed_test '5505' '北京' '联通' 163 | # speed_test '9484' '吉林长春' '联通' 164 | speed_test '2461' '四川成都' '联通' 165 | speed_test '27154' '天津5G' '联通' 166 | # speed_test '5509' '宁夏银川' '联通' 167 | # speed_test '5724' '安徽合肥' '联通' 168 | # speed_test '5039' '山东济南' '联通' 169 | speed_test '26180' '山东济南5G' '联通' 170 | speed_test '26678' '广东广州5G' '联通' 171 | # speed_test '16192' '广东深圳' '联通' 172 | # speed_test '6144' '新疆乌鲁木齐' '联通' 173 | speed_test '13704' '江苏南京' '联通' 174 | speed_test '5485' '湖北武汉' '联通' 175 | # speed_test '26677' '湖南株洲' '联通' 176 | speed_test '4870' '湖南长沙' '联通' 177 | # speed_test '4690' '甘肃兰州' '联通' 178 | # speed_test '4884' '福建福州' '联通' 179 | # speed_test '31985' '重庆' '联通' 180 | speed_test '4863' '陕西西安' '联通' 181 | #*** 182 | # speed_test '30154' '上海' '移动' 183 | # speed_test '25637' '上海5G' '移动' 184 | # speed_test '26728' '云南昆明' '移动' 185 | # speed_test '27019' '内蒙古呼和浩特' '移动' 186 | speed_test '30232' '内蒙呼和浩特5G' '移动' 187 | # speed_test '30293' '内蒙古通辽5G' '移动' 188 | speed_test '25858' '北京' '移动' 189 | speed_test '16375' '吉林长春' '移动' 190 | # speed_test '24337' '四川成都' '移动' 191 | speed_test '17184' '天津5G' '移动' 192 | # speed_test '26940' '宁夏银川' '移动' 193 | # speed_test '31815' '宁夏银川' '移动' 194 | # speed_test '26404' '安徽合肥5G' '移动' 195 | speed_test '27151' '山东临沂5G' '移动' 196 | # speed_test '25881' '山东济南5G' '移动' 197 | # speed_test '27100' '山东青岛5G' '移动' 198 | # speed_test '26501' '山西太原5G' '移动' 199 | speed_test '31520' '广东中山' '移动' 200 | # speed_test '6611' '广东广州' '移动' 201 | # speed_test '4515' '广东深圳' '移动' 202 | # speed_test '15863' '广西南宁' '移动' 203 | # speed_test '16858' '新疆乌鲁木齐' '移动' 204 | speed_test '26938' '新疆乌鲁木齐5G' '移动' 205 | # speed_test '17227' '新疆和田' '移动' 206 | # speed_test '17245' '新疆喀什' '移动' 207 | # speed_test '17222' '新疆阿勒泰' '移动' 208 | # speed_test '27249' '江苏南京5G' '移动' 209 | # speed_test '21845' '江苏常州5G' '移动' 210 | # speed_test '26850' '江苏无锡5G' '移动' 211 | # speed_test '17320' '江苏镇江5G' '移动' 212 | speed_test '25883' '江西南昌5G' '移动' 213 | # speed_test '17223' '河北石家庄' '移动' 214 | # speed_test '26331' '河南郑州5G' '移动' 215 | # speed_test '6715' '浙江宁波5G' '移动' 216 | # speed_test '4647' '浙江杭州' '移动' 217 | # speed_test '16503' '海南海口' '移动' 218 | # speed_test '28491' '湖南长沙5G' '移动' 219 | # speed_test '16145' '甘肃兰州' '移动' 220 | speed_test '16171' '福建福州' '移动' 221 | # speed_test '18444' '西藏拉萨' '移动' 222 | speed_test '16398' '贵州贵阳' '移动' 223 | speed_test '25728' '辽宁大连' '移动' 224 | # speed_test '16167' '辽宁沈阳' '移动' 225 | # speed_test '17584' '重庆' '移动' 226 | # speed_test '26380' '陕西西安' '移动' 227 | # speed_test '29105' '陕西西安5G' '移动' 228 | # speed_test '29083' '青海西宁5G' '移动' 229 | # speed_test '26656' '黑龙江哈尔滨' '移动' 230 | 231 | end=$(date +%s) 232 | rm -rf speedtest* 233 | echo "——————————————————————————————————————————————————————————" 234 | time=$(( $end - $start )) 235 | if [[ $time -gt 60 ]]; then 236 | min=$(expr $time / 60) 237 | sec=$(expr $time % 60) 238 | echo -ne " 测试完成, 本次测速耗时: ${min} 分 ${sec} 秒" 239 | else 240 | echo -ne " 测试完成, 本次测速耗时: ${time} 秒" 241 | fi 242 | echo -ne "\n 当前时间: " 243 | echo $(date +%Y-%m-%d" "%H:%M:%S) 244 | echo -e " ${GREEN}# 三网测速中为避免节点数不均及测试过久,每部分未使用所${PLAIN}" 245 | echo -e " ${GREEN}# 有节点,如果需要使用全部节点,可分别选择三网节点检测${PLAIN}" 246 | fi 247 | 248 | if [[ ${selection} == 3 ]]; then 249 | echo "——————————————————————————————————————————————————————————" 250 | echo "ID 测速服务器信息 上传/Mbps 下载/Mbps 延迟/ms" 251 | start=$(date +%s) 252 | 253 | speed_test '3633' '上海' '电信' 254 | speed_test '24012' '内蒙古呼和浩特' '电信' 255 | speed_test '27377' '北京5G' '电信' 256 | speed_test '29026' '四川成都' '电信' 257 | speed_test '29071' '四川成都' '电信' 258 | speed_test '17145' '安徽合肥5G' '电信' 259 | speed_test '27594' '广东广州5G' '电信' 260 | speed_test '27810' '广西南宁' '电信' 261 | speed_test '27575' '新疆乌鲁木齐' '电信' 262 | speed_test '26352' '江苏南京5G' '电信' 263 | speed_test '5396' '江苏苏州5G' '电信' 264 | speed_test '5317' '江苏连云港5G' '电信' 265 | speed_test '7509' '浙江杭州' '电信' 266 | speed_test '23844' '湖北武汉' '电信' 267 | speed_test '29353' '湖北武汉5G' '电信' 268 | speed_test '28225' '湖南长沙5G' '电信' 269 | speed_test '3973' '甘肃兰州' '电信' 270 | speed_test '19076' '重庆' '电信' 271 | 272 | end=$(date +%s) 273 | rm -rf speedtest* 274 | echo "——————————————————————————————————————————————————————————" 275 | time=$(( $end - $start )) 276 | if [[ $time -gt 60 ]]; then 277 | min=$(expr $time / 60) 278 | sec=$(expr $time % 60) 279 | echo -ne " 测试完成, 本次测速耗时: ${min} 分 ${sec} 秒" 280 | else 281 | echo -ne " 测试完成, 本次测速耗时: ${time} 秒" 282 | fi 283 | echo -ne "\n 当前时间: " 284 | echo $(date +%Y-%m-%d" "%H:%M:%S) 285 | fi 286 | 287 | if [[ ${selection} == 4 ]]; then 288 | echo "——————————————————————————————————————————————————————————" 289 | echo "ID 测速服务器信息 上传/Mbps 下载/Mbps 延迟/ms" 290 | start=$(date +%s) 291 | 292 | speed_test '21005' '上海' '联通' 293 | speed_test '24447' '上海5G' '联通' 294 | speed_test '5103' '云南昆明' '联通' 295 | speed_test '5145' '北京' '联通' 296 | speed_test '5505' '北京' '联通' 297 | speed_test '9484' '吉林长春' '联通' 298 | speed_test '2461' '四川成都' '联通' 299 | speed_test '27154' '天津5G' '联通' 300 | speed_test '5509' '宁夏银川' '联通' 301 | speed_test '5724' '安徽合肥' '联通' 302 | speed_test '5039' '山东济南' '联通' 303 | speed_test '26180' '山东济南5G' '联通' 304 | speed_test '26678' '广东广州5G' '联通' 305 | speed_test '16192' '广东深圳' '联通' 306 | speed_test '6144' '新疆乌鲁木齐' '联通' 307 | speed_test '13704' '江苏南京' '联通' 308 | speed_test '5485' '湖北武汉' '联通' 309 | speed_test '26677' '湖南株洲' '联通' 310 | speed_test '4870' '湖南长沙' '联通' 311 | speed_test '4690' '甘肃兰州' '联通' 312 | speed_test '4884' '福建福州' '联通' 313 | speed_test '31985' '重庆' '联通' 314 | speed_test '4863' '陕西西安' '联通' 315 | 316 | end=$(date +%s) 317 | rm -rf speedtest* 318 | echo "——————————————————————————————————————————————————————————" 319 | time=$(( $end - $start )) 320 | if [[ $time -gt 60 ]]; then 321 | min=$(expr $time / 60) 322 | sec=$(expr $time % 60) 323 | echo -ne " 测试完成, 本次测速耗时: ${min} 分 ${sec} 秒" 324 | else 325 | echo -ne " 测试完成, 本次测速耗时: ${time} 秒" 326 | fi 327 | echo -ne "\n 当前时间: " 328 | echo $(date +%Y-%m-%d" "%H:%M:%S) 329 | fi 330 | 331 | if [[ ${selection} == 5 ]]; then 332 | echo "——————————————————————————————————————————————————————————" 333 | echo "ID 测速服务器信息 上传/Mbps 下载/Mbps 延迟/ms" 334 | start=$(date +%s) 335 | 336 | speed_test '30154' '上海' '移动' 337 | speed_test '25637' '上海5G' '移动' 338 | speed_test '26728' '云南昆明' '移动' 339 | speed_test '27019' '内蒙古呼和浩特' '移动' 340 | speed_test '30232' '内蒙呼和浩特5G' '移动' 341 | speed_test '30293' '内蒙古通辽5G' '移动' 342 | speed_test '25858' '北京' '移动' 343 | speed_test '16375' '吉林长春' '移动' 344 | speed_test '24337' '四川成都' '移动' 345 | speed_test '17184' '天津5G' '移动' 346 | speed_test '26940' '宁夏银川' '移动' 347 | speed_test '31815' '宁夏银川' '移动' 348 | speed_test '26404' '安徽合肥5G' '移动' 349 | speed_test '27151' '山东临沂5G' '移动' 350 | speed_test '25881' '山东济南5G' '移动' 351 | speed_test '27100' '山东青岛5G' '移动' 352 | speed_test '26501' '山西太原5G' '移动' 353 | speed_test '31520' '广东中山' '移动' 354 | speed_test '6611' '广东广州' '移动' 355 | speed_test '4515' '广东深圳' '移动' 356 | speed_test '15863' '广西南宁' '移动' 357 | speed_test '16858' '新疆乌鲁木齐' '移动' 358 | speed_test '26938' '新疆乌鲁木齐5G' '移动' 359 | speed_test '17227' '新疆和田' '移动' 360 | speed_test '17245' '新疆喀什' '移动' 361 | speed_test '17222' '新疆阿勒泰' '移动' 362 | speed_test '27249' '江苏南京5G' '移动' 363 | speed_test '21845' '江苏常州5G' '移动' 364 | speed_test '26850' '江苏无锡5G' '移动' 365 | speed_test '17320' '江苏镇江5G' '移动' 366 | speed_test '25883' '江西南昌5G' '移动' 367 | speed_test '17223' '河北石家庄' '移动' 368 | speed_test '26331' '河南郑州5G' '移动' 369 | speed_test '6715' '浙江宁波5G' '移动' 370 | speed_test '4647' '浙江杭州' '移动' 371 | speed_test '16503' '海南海口' '移动' 372 | speed_test '28491' '湖南长沙5G' '移动' 373 | speed_test '16145' '甘肃兰州' '移动' 374 | speed_test '16171' '福建福州' '移动' 375 | speed_test '18444' '西藏拉萨' '移动' 376 | speed_test '16398' '贵州贵阳' '移动' 377 | speed_test '25728' '辽宁大连' '移动' 378 | speed_test '16167' '辽宁沈阳' '移动' 379 | speed_test '17584' '重庆' '移动' 380 | speed_test '26380' '陕西西安' '移动' 381 | speed_test '29105' '陕西西安5G' '移动' 382 | speed_test '29083' '青海西宁5G' '移动' 383 | speed_test '26656' '黑龙江哈尔滨' '移动' 384 | 385 | end=$(date +%s) 386 | rm -rf speedtest* 387 | echo "——————————————————————————————————————————————————————————" 388 | time=$(( $end - $start )) 389 | if [[ $time -gt 60 ]]; then 390 | min=$(expr $time / 60) 391 | sec=$(expr $time % 60) 392 | echo -ne " 测试完成, 本次测速耗时: ${min} 分 ${sec} 秒" 393 | else 394 | echo -ne " 测试完成, 本次测速耗时: ${time} 秒" 395 | fi 396 | echo -ne "\n 当前时间: " 397 | echo $(date +%Y-%m-%d" "%H:%M:%S) 398 | fi 399 | } 400 | 401 | runall() { 402 | checkroot; 403 | checksystem; 404 | checkpython; 405 | checkcurl; 406 | checkwget; 407 | checkspeedtest; 408 | clear 409 | speed_test; 410 | preinfo; 411 | selecttest; 412 | runtest; 413 | rm -rf speedtest* 414 | } 415 | 416 | runall 417 | -------------------------------------------------------------------------------- /sync-time.sh: -------------------------------------------------------------------------------- 1 | apt install ntpdate -y 2 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 3 | ntpdate ntp.sjtu.edu.cn 4 | ntpsrc=$(which ntpdate) 5 | crontab -l 2>/dev/null > /root/crontab_test 6 | echo -e "*/5 * * * * ${ntpsrc} ntp.sjtu.edu.cn" >> /root/crontab_test 7 | crontab /root/crontab_test 8 | rm /root/crontab_test 9 | crontask=$(crontab -l) 10 | -------------------------------------------------------------------------------- /timesync-for-synology.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | #将脚本上传到linux中的/root目录,在root账户下执行bash timesync.sh 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | 12 | echo -e "${BLUE}开始获取京东服务器时间${PLAIN}" 13 | Time=$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' ) 14 | date -s "$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' )" 15 | echo -e "${BLUE}当前京东服务器时间为${PLAIN}${RED}${Time}${PLAIN}" 16 | echo -e "${BLUE}开始进行时间同步${PLAIN}" 17 | echo -e "${BLUE}与京东服务器时间同步完成,脚本将自动退出。${PLAIN}" 18 | exit 19 | -------------------------------------------------------------------------------- /timesync.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | #将脚本上传到linux中的/root目录,在root账户下执行bash timesync.sh 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | apt install sudo -y >>/dev/null 2>&1 && sudo timedatectl set-ntp no 12 | echo -e "${BLUE}开始获取京东服务器时间${PLAIN}" 13 | Time=$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' ) 14 | sudo timedatectl set-time "$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' )" 15 | #sudo timedatectl set-time "${Time}" 16 | echo -e "${BLUE}当前京东服务器时间为${PLAIN}${RED}${Time}${PLAIN}" 17 | echo -e "${BLUE}开始进行时间同步${PLAIN}" 18 | echo -e "${BLUE}时间同步完成,脚本将自动退出。${PLAIN}" 19 | exit 20 | -------------------------------------------------------------------------------- /user.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 3 | export PATH 4 | #=================================================================# 5 | # System Required: CentOS 6+, Debian8+, Ubuntu16+ # 6 | # Description: One click adduser and deluser for linux # 7 | # Author: 翔翎 # 8 | #=================================================================# 9 | 10 | echoType='echo -e' 11 | echoContent() { 12 | case $1 in 13 | # 红色 14 | "red") 15 | # shellcheck disable=SC2154 16 | ${echoType} "\033[31m$2\033[0m" 17 | ;; 18 | # 绿色 19 | "green") 20 | ${echoType} "\033[32m$2\033[0m" 21 | ;; 22 | # 黄色 23 | "yellow") 24 | ${echoType} "\033[33m$2\033[0m" 25 | ;; 26 | # 蓝色 27 | "blue") 28 | ${echoType} "\033[34m$2\033[0m" 29 | ;; 30 | # 紫色 31 | "purple") 32 | ${echoType} "\033[35m$2\033[0m" 33 | ;; 34 | # 天蓝色 35 | "skyBlue") 36 | ${echoType} "\033[36m$2\033[0m" 37 | ;; 38 | # 白色 39 | "white") 40 | ${echoType} "\033[37m$2\033[0m" 41 | ;; 42 | esac 43 | } 44 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 45 | apt install sudo -y || yum install sudo -y 46 | clear 47 | add_user(){ 48 | echoContent green "请输入要添加用户的用户名⬇️" 49 | read user 50 | sudo useradd \ 51 | --system \ 52 | --shell /bin/bash \ 53 | --create-home \ 54 | --home-dir /home/${user} \ 55 | ${user} 56 | echoContent red "请为用户名${user}设置登陆密码⬇️" 57 | read pass 58 | echo ${user}:${pass} | chpasswd 59 | sed -i "/PasswordAuthentication no/c PasswordAuthentication yes" /etc/ssh/sshd_config 60 | echo "${user} ALL=(ALL:ALL) ALL" >>/etc/sudoers 61 | echo "AllowUsers root ${user}" >>/etc/ssh/sshd_config 62 | service sshd restart 63 | service ssh restart 64 | echoContent green "新用户${user}增加成功,现在可通过密码 ${pass} 登陆ssh,脚本执行完毕,即将退出" 65 | exit 0 66 | } 67 | del_user(){ 68 | echoContent green "请输入要删除的用户名⬇️" 69 | read user 70 | userdel -r ${user} 71 | sed -i "/${user} ALL=(ALL:ALL) ALL/d" /etc/sudoers 72 | echoContent yellow "用户${user}已成功删除,脚本退出" 73 | exit 0 74 | } 75 | menu() { 76 | echoContent skyBlue "请选择你要执行的功能" 77 | echoContent red "0. 退出脚本" 78 | echoContent green "1. 增加用户" 79 | echoContent green "2. 删除用户" 80 | read -p "请输入数字 :" num 81 | case "$num" in 82 | 0) 83 | exit 0 84 | ;; 85 | 1) 86 | add_user 87 | ;; 88 | 2) 89 | del_user 90 | ;; 91 | *) 92 | clear 93 | echoContent red "出现错误:请输入正确数字 [0-2]" 94 | sleep 3s 95 | clear 96 | menu 97 | ;; 98 | esac 99 | } 100 | menu 101 | -------------------------------------------------------------------------------- /vertex.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | if [[ $EUID -ne 0 ]]; then 7 | echo -e "${red}本脚本必须root账号运行,请切换root用户后再执行本脚本!${plain}" 8 | exit 1 9 | fi 10 | check_docker(){ 11 | if test -z "$(which docker)"; then 12 | echo -e "${yellow}检测到系统未安装docker,开始安装docker${plain}" 13 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 14 | if [[ "$#" -eq 0 ]]; then 15 | echo -e "${green}docker安装成功······${plain}" 16 | else 17 | echo -e "${red}docker安装失败······${plain}" 18 | exit 1 19 | fi 20 | fi 21 | if test -z `which docker-compose`;then 22 | echo -e "${yellow}检测到系统未安装docker-compose,开始安装docker-compose${plain}" 23 | curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose && ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 24 | if [[ "$#" -eq 0 ]]; then 25 | echo -e "${green}docker-compose安装成功······${plain}" 26 | else 27 | echo -e "${red}docker-compose安装失败······${plain}" 28 | exit 1 29 | fi 30 | fi 31 | } 32 | install_vertex(){ 33 | check_docker 34 | local_ip=$(ip a 2>&1 | grep -w 'inet' | grep 'global' | grep -E '\ 1(92|0|72|00|1)\.' | sed 's/.*inet.//g' | sed 's/\/[0-9][0-9].*$//g' | head -n 1) 35 | baseip=$(curl -s http3.ooo) > /dev/null 36 | if [[ `docker ps |grep vertex` == "" ]]; then 37 | mkdir -p /root/vertex && chmod 777 /root/vertex 38 | cd /root 39 | cat >/root/docker-compose.yml </root/docker-compose.yml </root/qBittorrent.yml<> /etc/sysctl.conf 78 | sysctl -p /etc/sysctl.conf 79 | fi 80 | echo "1"> /proc/sys/net/ipv4/ip_forward 81 | mkdir -p /etc/wireguard 82 | cd /etc/wireguard 83 | wg genkey | tee sprivatekey | wg pubkey > spublickey 84 | wg genkey | tee cprivatekey | wg pubkey > cpublickey 85 | s1=$(cat sprivatekey) 86 | s2=$(cat spublickey) 87 | c1=$(cat cprivatekey) 88 | c2=$(cat cpublickey) 89 | serverip=$(curl ipv4.icanhazip.com) 90 | port=$(rand 10000 60000) 91 | eth=$(ls /sys/class/net | awk '/^e/{print}') 92 | read -p "请输入该设备预备设置的wireguard内网IP地址:" vvip 93 | ipmask1=$(echo $vvip|awk -F '.' '{print $1"."$2"."$3}') 94 | cat > /etc/wireguard/wg0.conf <<-EOF 95 | [Interface] 96 | PrivateKey = $s1 97 | Address = ${vvip}/24 98 | PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $eth -j MASQUERADE 99 | PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $eth -j MASQUERADE 100 | ListenPort = $port 101 | DNS = 8.8.8.8,8.8.4.4 102 | MTU = 1420 103 | [Peer] 104 | PublicKey = $c2 105 | AllowedIPs = $ipmask1.2/32 106 | EOF 107 | cat > /etc/wireguard/client.conf <<-EOF 108 | [Interface] 109 | PrivateKey = $c1 110 | Address = $ipmask1.2/24 111 | DNS = 8.8.8.8,8.8.4.4 112 | MTU = 1420 113 | [Peer] 114 | PublicKey = $s2 115 | Endpoint = $serverip:$port 116 | AllowedIPs = 0.0.0.0/0, ::0/0 117 | PersistentKeepalive = 25 118 | EOF 119 | cat > /etc/init.d/wgstart <<-EOF 120 | #! /bin/bash 121 | ### BEGIN INIT INFO 122 | # Provides: wgstart 123 | # Required-Start: $remote_fs $syslog 124 | # Required-Stop: $remote_fs $syslog 125 | # Default-Start: 2 3 4 5 126 | # Default-Stop: 0 1 6 127 | # Short-Description: wgstart 128 | ### END INIT INFO 129 | wg-quick up wg0 130 | EOF 131 | chmod +x /etc/init.d/wgstart 132 | cd /etc/init.d 133 | if [ $os_version == "18" ] 134 | then 135 | update-rc.d wgstart defaults 90 136 | else 137 | update-rc.d wgstart defaults 138 | fi 139 | chmod 600 /etc/wireguard/wg0.conf 140 | wg-quick up wg0 141 | 142 | content=$(cat /etc/wireguard/client.conf) 143 | echo -e "${yellowb}电脑端请下载/etc/wireguard/client.conf,手机端可直接使用软件扫码${end}" 144 | echo "${content}" | qrencode -o - -t UTF8 145 | } 146 | wireguard_remove(){ 147 | 148 | wg-quick down wg0 149 | apt-get remove -y wireguard 150 | rm -rf /etc/wireguard 151 | rm /etc/init.d/wgstart 152 | } 153 | add_user(){ 154 | echo -e "${yellowb}给新用户起个名字,不能和已有用户重复${end}" 155 | read -p "请输入用户名:" newname 156 | cd /etc/wireguard/ 157 | cp client.conf $newname.conf 158 | wg genkey | tee temprikey | wg pubkey > tempubkey 159 | ipnum=$(grep Allowed /etc/wireguard/wg0.conf | tail -1 | awk -F '[ ./]' '{print $6}') 160 | ipmask=$(grep Allowed /etc/wireguard/wg0.conf | tail -1 | awk -F '[ ./]' '{print $3"."$4"."$5}') 161 | newnum=$((10#${ipnum}+1)) 162 | sed -i 's%^PrivateKey.*$%'"PrivateKey = $(cat temprikey)"'%' $newname.conf 163 | sed -i 's%^Address.*$%'"Address = $ipmask.$newnum\/24"'%' $newname.conf 164 | 165 | cat >> /etc/wireguard/wg0.conf <<-EOF 166 | [Peer] 167 | PublicKey = $(cat tempubkey) 168 | AllowedIPs = $ipmask.$newnum/32 169 | EOF 170 | wg set wg0 peer $(cat tempubkey) allowed-ips $ipmask.$newnum/32 171 | echo -e "${yellowb}添加完成,文件:/etc/wireguard/$newname.conf${end}" 172 | rm -f temprikey tempubkey 173 | content=$(cat /etc/wireguard/$newname.conf) 174 | echo -e "${yellowb}电脑端请下载/etc/wireguard/$newname.conf,手机端可直接使用软件扫码${end}" 175 | echo "${content}" | qrencode -o - -t UTF8 176 | } 177 | del_user(){ 178 | echo -e "${yellowb}/etc/wireguard目录下包含如下配置文件,其中wg0.conf为服务端配置文件${end}" 179 | path="/etc/wireguard" ; files=$(ls $path) ; for filename in $files ; do echo $filename ; done 180 | echo -n -e "${yellowb}请输入需要删除的用户:${end}" 181 | read delname 182 | iprule=$(cat /etc/wireguard/$delname.conf |grep Address | awk '{print $3}' | awk -F "/" '{print $1}') 183 | rm /etc/wireguard/$delname.conf 184 | key=$(wg |grep -B 1 "${iprule}" | head -1 |awk -F ":" '{print $2}') 185 | wg set wg0 peer $key remove 186 | wg-quick save wg0 187 | echo -e "${yellowb}用户已删除,脚本执行完毕${end}" 188 | } 189 | #开始菜单 190 | start_menu(){ 191 | clear 192 | echo -e "${green} ====================================${end}" 193 | echo -e "${green} 介绍:wireguard一键脚本 ${end}" 194 | echo -e "${green} 支持系统:Ubuntu、Debian ${end}" 195 | echo -e "${green} 作者:翔翎 ${end}" 196 | echo -e "${green} ====================================${end}" 197 | echo 198 | echo -e "${lightblue} 1. 安装wireguard${end}" 199 | echo -e "${lightblue} 2. 查看客户端二维码${end}" 200 | echo -e "${red} 3. 卸载wireguard${end}" 201 | echo -e "${lightblue} 4. 增加用户${end}" 202 | echo -e "${lightblue} 5. 删除用户${end}" 203 | echo -e "${red} 0.${end} 退出脚本" 204 | echo 205 | read -p "请输入数字:" num 206 | case "$num" in 207 | 1) 208 | wireguard_install 209 | ;; 210 | 2) 211 | echo -e "${green}/etc/wireguard目录下包含如下配置文件,其中wg0.conf为服务端配置文件${end}" 212 | path="/etc/wireguard" ; files=$(ls $path) ; for filename in $files ; do echo $filename ; done 213 | echo -n -e "${green}请输入需要查看的配置文件的文件名(不包含.conf):${end}" 214 | read username 215 | content=$(cat /etc/wireguard/$username.conf) 216 | echo -e "${yellowb}请用手机客户端软件扫码进行配置${end}" 217 | echo "${content}" | qrencode -o - -t UTF8 218 | ;; 219 | 3) 220 | wireguard_remove 221 | ;; 222 | 4) 223 | add_user 224 | ;; 225 | 5) 226 | del_user 227 | ;; 228 | 0) 229 | exit 0 230 | ;; 231 | *) 232 | clear 233 | echo -e "请输入正确数字" 234 | sleep 2s 235 | start_menu 236 | ;; 237 | esac 238 | } 239 | 240 | start_menu 241 | -------------------------------------------------------------------------------- /x-ui-one.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | red='\033[0;31m' 4 | green='\033[0;32m' 5 | yellow='\033[0;33m' 6 | plain='\033[0m' 7 | 8 | cur_dir=$(pwd) 9 | # check root 10 | [[ $EUID -ne 0 ]] && echo -e "${red}错误:${plain} 必须使用root用户运行此脚本!\n" && exit 1 11 | 12 | # check os 13 | if [[ -f /etc/redhat-release ]]; then 14 | release="centos" 15 | elif cat /etc/issue | grep -Eqi "debian"; then 16 | release="debian" 17 | elif cat /etc/issue | grep -Eqi "ubuntu"; then 18 | release="ubuntu" 19 | elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then 20 | release="centos" 21 | elif cat /proc/version | grep -Eqi "debian"; then 22 | release="debian" 23 | elif cat /proc/version | grep -Eqi "ubuntu"; then 24 | release="ubuntu" 25 | elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then 26 | release="centos" 27 | else 28 | echo -e "${red}未检测到系统版本,请联系脚本作者!${plain}\n" && exit 1 29 | fi 30 | 31 | arch=$(arch) 32 | 33 | if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then 34 | arch="amd64" 35 | elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then 36 | arch="arm64" 37 | elif [[ $arch == "s390x" ]]; then 38 | arch="s390x" 39 | else 40 | arch="amd64" 41 | echo -e "${red}检测架构失败,使用默认架构: ${arch}${plain}" 42 | fi 43 | 44 | echo "架构: ${arch}" 45 | 46 | if [ $(getconf WORD_BIT) != '32' ] && [ $(getconf LONG_BIT) != '64' ]; then 47 | echo "本软件不支持 32 位系统(x86),请使用 64 位系统(x86_64),如果检测有误,请联系作者" 48 | exit -1 49 | fi 50 | 51 | os_version="" 52 | 53 | # os version 54 | if [[ -f /etc/os-release ]]; then 55 | os_version=$(awk -F'[= ."]' '/VERSION_ID/{print $3}' /etc/os-release) 56 | fi 57 | if [[ -z "$os_version" && -f /etc/lsb-release ]]; then 58 | os_version=$(awk -F'[= ."]+' '/DISTRIB_RELEASE/{print $2}' /etc/lsb-release) 59 | fi 60 | 61 | if [[ x"${release}" == x"centos" ]]; then 62 | if [[ ${os_version} -le 6 ]]; then 63 | echo -e "${red}请使用 CentOS 7 或更高版本的系统!${plain}\n" && exit 1 64 | fi 65 | elif [[ x"${release}" == x"ubuntu" ]]; then 66 | if [[ ${os_version} -lt 16 ]]; then 67 | echo -e "${red}请使用 Ubuntu 16 或更高版本的系统!${plain}\n" && exit 1 68 | fi 69 | elif [[ x"${release}" == x"debian" ]]; then 70 | if [[ ${os_version} -lt 8 ]]; then 71 | echo -e "${red}请使用 Debian 8 或更高版本的系统!${plain}\n" && exit 1 72 | fi 73 | fi 74 | 75 | install_base() { 76 | if [[ x"${release}" == x"centos" ]]; then 77 | yum install wget curl tar -y 78 | else 79 | apt install wget curl tar -y 80 | fi 81 | } 82 | 83 | config_after_install() { 84 | echo -e "${yellow}开始还原x-ui个人设置,请等待······${plain}" 85 | dburl="https://github.com/07031218/normal-shell/raw/main/emby/x-ui.db" # 填写x-ui.db数据库http下载地址 86 | mkdir -p /etc/x-ui/ 87 | wget -O /etc/x-ui/x-ui.db ${dburl} 88 | } 89 | 90 | install_x-ui() { 91 | systemctl stop x-ui 92 | cd /usr/local/ 93 | 94 | if [ $# == 0 ]; then 95 | last_version=$(curl -Ls "https://api.github.com/repos/vaxilu/x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') 96 | if [[ ! -n "$last_version" ]]; then 97 | echo -e "${red}检测 x-ui 版本失败,可能是超出 Github API 限制,请稍后再试,或手动指定 x-ui 版本安装${plain}" 98 | exit 1 99 | fi 100 | echo -e "检测到 x-ui 最新版本:${last_version},开始安装" 101 | wget -N --no-check-certificate -O /usr/local/x-ui-linux-${arch}.tar.gz https://github.com/vaxilu/x-ui/releases/download/${last_version}/x-ui-linux-${arch}.tar.gz 102 | if [[ $? -ne 0 ]]; then 103 | echo -e "${red}下载 x-ui 失败,请确保你的服务器能够下载 Github 的文件${plain}" 104 | exit 1 105 | fi 106 | else 107 | last_version=$1 108 | url="https://github.com/vaxilu/x-ui/releases/download/${last_version}/x-ui-linux-${arch}.tar.gz" 109 | echo -e "开始安装 x-ui v$1" 110 | wget -N --no-check-certificate -O /usr/local/x-ui-linux-${arch}.tar.gz ${url} 111 | if [[ $? -ne 0 ]]; then 112 | echo -e "${red}下载 x-ui v$1 失败,请确保此版本存在${plain}" 113 | exit 1 114 | fi 115 | fi 116 | 117 | if [[ -e /usr/local/x-ui/ ]]; then 118 | rm /usr/local/x-ui/ -rf 119 | fi 120 | 121 | tar zxvf x-ui-linux-${arch}.tar.gz 122 | rm x-ui-linux-${arch}.tar.gz -f 123 | cd x-ui 124 | chmod +x x-ui bin/xray-linux-${arch} 125 | cp -f x-ui.service /etc/systemd/system/ 126 | wget --no-check-certificate -O /usr/bin/x-ui https://raw.githubusercontent.com/vaxilu/x-ui/main/x-ui.sh 127 | chmod +x /usr/bin/x-ui 128 | config_after_install 129 | systemctl daemon-reload 130 | systemctl enable x-ui 131 | systemctl start x-ui 132 | echo -e "${green}x-ui安装成功······${plain}" 133 | } 134 | echo -e "${green}开始安装x-ui${plain}" 135 | install_base 136 | install_x-ui $1 137 | -------------------------------------------------------------------------------- /xrayr/XrayR-linux-64.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/xrayr/XrayR-linux-64.zip -------------------------------------------------------------------------------- /xrayr/xrayr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/xrayr/xrayr -------------------------------------------------------------------------------- /xrayr/xrayr-arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/07031218/normal-shell/07cddbdb6477f7bed06bebd50eccb1ba0c001e7c/xrayr/xrayr-arm -------------------------------------------------------------------------------- /yuanlam.ini: -------------------------------------------------------------------------------- 1 | ;设置规则标志位 2 | ruleset=📽 Youtube,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/YouTube.list,10800 3 | ruleset=🎬 Netflix,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/Netflix.list,10800 4 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/Disney.list,10800 5 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/HBO.list,10800 6 | ruleset=🎥 港澳台媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/HMTmedia.list,10800 7 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/YoutubeMusic.list,10800 8 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%e5%aa%92%e4%bd%93%e6%9c%8d%e5%8a%a1/AppleTV.list,10800 9 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/GlobalMedia.list,10800 10 | ruleset=🎥 国内媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/Chinesemedia.list,10800 11 | ruleset=🎥 国内媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1/wyy.list,10800 12 | ruleset=📱 苹果服务,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%e7%bd%91%e7%bb%9c%e6%9c%8d%e5%8a%a1/AppleAPI.list,10800 13 | ruleset=⭕ 直连,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/AppleCDN.list,10800 14 | ruleset=🔄 谷歌服务,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%e7%bd%91%e7%bb%9c%e6%9c%8d%e5%8a%a1/Google.list,10800 15 | ruleset=🔄 谷歌服务,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%e7%bd%91%e7%bb%9c%e6%9c%8d%e5%8a%a1/GoogleCDN.list,10800 16 | ruleset=🖥 微软服务,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Microsoft.list,10800 17 | ruleset=⭕ 直连,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/MicrosoftCDN.list,10800 18 | ruleset=🎥 国际媒体,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Digital.list,10800 19 | ruleset=💰 PayPal,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Paypal.list,10800 20 | ruleset=📈 Speedtest,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Speedtest.list,10800 21 | ruleset=💬 即时通讯,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Telegram.list,10800 22 | ruleset=⭕ 直连,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Domestic.list,10800 23 | ruleset=⭕ 直连,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1/Lan.list,10800 24 | ruleset=🌍 国际互联,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%e7%bd%91%e7%bb%9c%e6%9c%8d%e5%8a%a1/Proxy.list,10800 25 | ruleset=🌍 国际互联,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E9%BB%91%E7%99%BD%E5%90%8D%E5%8D%95/Black.list,10800 26 | ruleset=⭕ 直连,clash-classic:https://cdn.jsdelivr.net/gh/clash1step/rule-provider@master/%E9%BB%91%E7%99%BD%E5%90%8D%E5%8D%95/White.list,10800 27 | ruleset=⭕ 直连,[]GEOIP,CN 28 | ruleset=⬛️ 漏网之鱼,[]MATCH 29 | ;设置规则标志位 30 | 31 | 32 | ;设置分组标志位 33 | custom_proxy_group=🚀 节点选择`select`[]🔰 全部节点`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🎮 游戏节点`[]🇩🇪 德国节点`[]⭕ 直连 34 | custom_proxy_group=📈 Speedtest`select`[]⭕ 直连`[]🚀 节点选择 35 | custom_proxy_group=💬 即时通讯`select`[]🚀 节点选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🇩🇪 德国节点`[]⭕ 直连 36 | custom_proxy_group=🌍 国际互联`select`[]🚀 节点选择`[]⭕ 直连 37 | custom_proxy_group=🎬 Netflix`select`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🇩🇪 德国节点`🔰 全部节点`[]⭕ 直连 38 | custom_proxy_group=📽 Youtube`select`[]🚀 节点选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🇩🇪 德国节点`[]⭕ 直连 39 | custom_proxy_group=🎥 港澳台媒体`select`[]🚀 节点选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]⭕ 直连 40 | custom_proxy_group=🎥 国际媒体`select`[]🚀 节点选择`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🇩🇪 德国节点`[]⭕ 直连 41 | custom_proxy_group=🎥 国内媒体`select`[]⭕ 直连`[]🚀 节点选择`[]🌍 国际互联 42 | custom_proxy_group=🔄 谷歌服务`select`[]🌍 国际互联`[]⭕ 直连 43 | custom_proxy_group=🖥 微软服务`select`[]🌍 国际互联`[]⭕ 直连 44 | custom_proxy_group=📱 苹果服务`select`[]⭕ 直连`[]🌍 国际互联 45 | custom_proxy_group=⬛️ 漏网之鱼`select`[]🚀 节点选择`[]⭕ 直连`[]🌍 国际互联`[]🇭🇰 香港节点`[]🇨🇳 台湾节点`[]🇸🇬 新加坡节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🇩🇪 德国节点 46 | custom_proxy_group=🔰 全部节点`select`.* 47 | custom_proxy_group=🇭🇰 香港节点`select`(香港|港|HK|Hong Kong) 48 | custom_proxy_group=🇯🇵 日本节点`select`(日本|川日|东京|大阪|泉日|埼玉|沪日|深日|[^-]日|JP|Japan) 49 | custom_proxy_group=🇺🇲 美国节点`select`(美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|United States) 50 | custom_proxy_group=🇨🇳 台湾节点`select`(台|新北|hinet|彰化|TW|Taiwan) 51 | custom_proxy_group=🇸🇬 新加坡节点`select`(新加坡|坡|狮城|SG|Singapore) 52 | custom_proxy_group=🇩🇪 德国节点`select`(德|DE|法兰克福|Germany) 53 | custom_proxy_group=🇰🇷 韩国节点`select`(韩|春川|汉城|KR|Korea|KOR|首尔) 54 | custom_proxy_group=🎮 游戏节点`select`.* 55 | custom_proxy_group=⭕ 直连`select`[]DIRECT 56 | ;设置分组标志位 57 | 58 | enable_rule_generator=true 59 | overwrite_original_rules=true 60 | 61 | 62 | --------------------------------------------------------------------------------