青龙面板保活Serv00并启用TG推送

网上有很多使用GitHub Actions来保号的教程,关于青龙面板的很少,所以自己研究了一下,下面是我的方案。如有不当之处,欢迎大家批评指正。注意,此方法有点毛病,请见此处

安装sshpass依赖和jq

青龙面板—依赖管理—Linux—添加sshpassjq
sshpass的使用可以见这篇文章

添加脚本 24.8.3 更新脚本

青龙面板—脚本管理—添加sh脚本
以下脚本是GPT写的多账号脚本,(第二次感受到生成式AI的便利,第一次是写openclah的防火墙规则)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

echo "开始执行任务..."

# 执行远程命令并将输出存储在变量中
OUTPUT1=$(sshpass -p '密码' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt 用户名@主机 "ps -A; exit" 2>&1)
if [ $? -ne 0 ]; then
echo "执行命令失败: $OUTPUT1"
exit 1
fi

OUTPUT2=$(sshpass -p '密码' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt 用户名@主机 "ps -A; exit" 2>&1)
if [ $? -ne 0 ]; then
echo "执行命令失败: $OUTPUT2"
exit 1
fi

# 输出命令的结果
echo "输出1:\n$OUTPUT1"
echo "输出2:\n$OUTPUT2"

echo "任务执行完成"

# 发送 Telegram 推送通知
TOKEN="机器人token"
CHAT_ID="用户id"
MESSAGE="任务执行完成\n\n输出1:\n$OUTPUT1\n\n输出2:\n$OUTPUT2"

# 使用 urlencode 对消息进行编码,以便在 URL 中安全传输
MESSAGE_ENCODED=$(echo -e "$MESSAGE" | jq -sRr @uri)

curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID&text=$MESSAGE_ENCODED"

记得把其中的密码、用户名、主机、机器人token、用户id修改为自己的。

更新脚本

后面闲着没事又整了两个号,发现脚本添加账号不方便,而且没有报错的提示,有指令输入错误就会卡死’ps -A; exit’没用,所以又去和GPT聊了聊,更新下面几点:

  1. 多账号添加更方便;
  2. 设置了ssh超时,避免了脚本卡死;
  3. 电报消息可以提示哪些账号出错。

如有连接不上可以检查是否在 https://www.serv00.com/ip_unban/ 解锁了IP(我调试脚本就把我IP禁过😂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/bash

echo "开始执行任务..."

# 定义一个数组来存储输出和错误信息
declare -A OUTPUTS
# 用于标记是否有命令失败
has_error=false
# 用于存储成功的命令
successful_commands=()
# 用于存储失败的命令
failed_commands=()

# 设置 SSH 超时(单位:秒)
SSH_TIMEOUT=15

# 定义账号、密码和主机信息数组,每个元素包含 "账号:密码:主机",一行一组
CREDENTIALS=(
"账号1:密码1:主机1"
"账号2:密码2:主机2"
)

# 循环遍历每行并执行命令
for cred in "${CREDENTIALS[@]}"; do
IFS=':' read -r user pass host <<< "$cred"

if [ -z "$user" ]; then
continue
fi

OUTPUTS["$user"]=$(sshpass -p "$pass" ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=$SSH_TIMEOUT -t $user@$host "ps -A" 2>&1)
if [ $? -ne 0 ]; then
echo "执行命令失败: $user: ${OUTPUTS["$user"]}"
has_error=true
failed_commands+=("$user")
else
echo "执行命令成功: $user: ${OUTPUTS["$user"]}"
successful_commands+=("$user")
fi
done

# 构建 Telegram 消息内容
TOKEN="机器人token"
CHAT_ID="用户id"
MESSAGE="保号任务执行结果:\n"

# 添加成功的命令到消息
if [ ${#successful_commands[@]} -gt 0 ]; then
MESSAGE+="保号成功:\n"
for user in "${successful_commands[@]}"; do
MESSAGE+="\n$user:\n${OUTPUTS[$user]}\n"
done
fi

# 添加失败的命令到消息
if [ ${#failed_commands[@]} -gt 0 ]; then
MESSAGE+="\n以下账号出错了😭:\n"
for user in "${failed_commands[@]}"; do
MESSAGE+="$user:\n${OUTPUTS[$user]}\n"
done
fi

# 使用 urlencode 对消息进行编码,以便在 URL 中安全传输
MESSAGE_ENCODED=$(echo -e "$MESSAGE" | jq -sRr @uri)

# 发送 Telegram 推送通知
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID&text=$MESSAGE_ENCODED"

# 输出最终结果
if [ "$has_error" = true ]; then
echo "请检查输入是否正确,或是否在 https://www.serv00.com/ip_unban/ 解锁了IP"
else
echo "任务执行完成,所有机器保号成功"
fi

附telegram的通知截图

以上代码一些参数的作用

-o StrictHostKeyChecking=no
这是 SSH 的一个选项,表示在连接到新主机时不进行主机密钥检查。这可以避免在第一次连接时出现提示,适用于自动化脚本,但会降低安全性。

-o UserKnownHostsFile=/dev/null
这个选项指定 SSH 不使用已知主机文件(通常是 ~/.ssh/known_hosts),而是将其输出重定向到 /dev/null,即不保存任何主机密钥。这也是为了避免在自动化脚本中出现提示。

由上面两条可见此方法不是很安全,所以大家自行选择是否使用此方法。

-tt
这个选项强制分配一个伪终端(pseudo-terminal),这在某些情况下是必要的,尤其是当你需要在远程执行的命令中使用交互式功能时。

ps -A; exit
ps -A 命令用于列出系统上所有正在运行的进程。; exit 可以确保在执行 ps -A 后,无论其成功与否,SSH 会话都会自动退出。如果想”ps-A”成功运行后再退出使用"ps -A && exit"

添加定时任务

青龙面板—定时任务—创建任务
名称随意
命令/脚本填入你自定义的脚本名称,如:
task Serv00.sh
定时规则(cron表达式)
叫GPT帮着写吧,我也不会😂, 下面是每 7 天的 6:00 AM 执行一次。
0 6 */7 * *
点击确定就完成了。
(由于博客的图床还没想好用什么,所以就没放图了。)

参考文章

  1. https://gaojilingjuli.blogspot.com/2024/07/sshserv00.html
  2. https://saika.us.kg/2024/01/27/serv00_logs#%E8%87%AA%E5%8A%A8%E7%BB%AD%E6%9C%9F
  3. https://linux.cn/article-8086-1.html