~全新升级的Linux主机自动注册NPS客户端脚本~
参考官方对API使用方法的定义:https://ehang-io.github.io/nps/#/
1、首先必须要在配置文件中开启 auth_key
并配置一个合适的密钥
2、修改脚本中的可变量参数,以适配自己的环境
#!/bin/bash
# 脚本使用说明:
# 脚本名称:npc_create.sh
# 编写人:清瞳清
# 编写时间:2023-12-10
# 描述:这是一个用于自动注册创建 NPC 客户端的脚本。
# 定义第一部分变量
download_url=www.qingtongqing.cc
port=8080
npcname=linux_amd64_client.tar.gz
# 下载软件
wgetnpc() {
echo -e "\033[33m正在下载npc软件......\033[0m"
yum -y install wget > /dev/null
yum -y install vim > /dev/null
mkdir -p /npc1/npc
if wget -q -P /npc1/npc "https://$download_url/npc/$npcname"; then
echo -e "\033[32mnpc软件下载成功......\033[0m"
else
echo -e "\033[31mnpc软件下载失败......\033[0m"
exit 1
fi
}
# 解压软件
tarxzf() {
echo -e "\033[33m正在解压npc软件......\033[0m"
if tar -xzf "/npc1/npc/$npcname" -C /npc1/npc && cp /npc1/npc/npc /usr/bin/npc1; then
echo -e "\033[32mnpc软件解压安装成功......\033[0m"
else
echo -e "\033[31mnpc软件解压安装失败......\033[0m"
exit 1
fi
}
# 从配置文件中获取 auth_key
config_auth_key="qingtongqingc" # 请将此处替换为实际的配置文件中的 auth_key
# 获取当前时间戳(以秒为单位)
timestamp=$(date +%s)
# 将配置文件中的 auth_key 和当前时间戳拼接起来
concatenated_string="${config_auth_key}${timestamp}"
# 对拼接后的字符串进行 MD5 哈希加密
new_auth_key=$(echo -n "$concatenated_string" | md5sum | awk '{print $1}')
# 随机生成16位的字符串作为密钥
random_variable=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)
# 随机生成20000-40000之间的端口号
random_port=$((20000 + RANDOM % 20001))
# 添加客户端
insert_data() {
echo -e "\033[33m正在添加客户端......\033[0m"
response=$(curl -s --request POST \
--url "http://$download_url:$port/client/add" \
--data "auth_key=$new_auth_key×tamp=$timestamp&remark=$random_port&u=&p=&vkey=$random_variable&config_conn_allow=1&compress=0&crypt=0")
if [[ $response == *"success"* ]]; then
echo -e "\033[32m客户端添加成功......\033[0m"
else
echo -e "\033[31m客户端添加失败......\033[0m"
exit 1
fi
}
# 获取最后一个客户端ID和密钥
get_last_client_info() {
response=$(curl -s --request POST \
--url "http://$download_url:$port/client/list" \
--data "auth_key=$new_auth_key×tamp=$timestamp&search=&order=asc&offset=0&limit=3000")
#search代表搜索条件,order代表排序顺序,offset代表偏移量,limit代表限制返回结果的数量(如果存在数量很多出现分页的情况下建议把数值调大)
get_last_client_id=$(echo "$response" | grep "Id" | awk -F ': ' '{print $2}' | tail -n 1 | tr -d ',')
#取出返回结果中的Id字段,然后取最后一行,然后去掉逗号
#get_last_client_key=$(echo "$response" | grep "VerifyKey" | tail -n 1 | tr -d '," ' | awk -F ':' '{print $2}')
#取出返回结果中的Addr字段,然后取最后一行,然后去掉逗号和空格,然后以冒号为分隔符取第二个字段
get_last_client_addr=$(echo "$response" | grep "Addr" | tail -n 1 | tr -d '," ' | awk -F ':' '{print $2}')
}
# 添加TCP隧道
insert_tcp() {
echo -e "\033[33m正在添加TCP隧道......\033[0m"
#随机生成固定范围的端口号取决于配置文件中对端口适用范围的限制,如无限制请修改取值范围以免发生冲突
if curl -s --request POST \
--url "http://$download_url:$port/index/add" \
--data "auth_key=$new_auth_key×tamp=$timestamp&type=tcp&client_id=$get_last_client_id&remark=$random_variable&port=$random_port&target=22&local_path=&strip_pre=&password=" > /dev/null; then
echo -e "\033[32mTCP隧道添加成功......\033[0m"
else
echo -e "\033[31mTCP隧道添加失败......\033[0m"
exit 1
fi
}
# 在Linux主机内添加NPS客户端
add_nps() {
cat <<EOF > /usr/lib/systemd/system/npc1.service
[Unit]
Description=NPC Client Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/npc1 -server=$download_url:8024 -vkey=$random_variable -type=tcp &> /var/log/npc1.log &
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl restart npc1
}
# 输出客户端的相关信息
add_success() {
echo -e "\033[32m添加成功: \033[0m"
echo '服务器名称: '$random_port'_client'
echo "服务器地址: $download_url"
echo "客户端ID: $get_last_client_id"
echo "客户端端口: $random_port"
echo "客户端密钥: $random_variable"
echo "客户端地址: $get_last_client_addr"
}
add_success2() {
echo -e "\033[35m快捷登录方式为 ssh $download_url $random_port\033[0m"
}
# 主函数
main() {
wgetnpc
tarxzf
insert_data
get_last_client_info
insert_tcp
add_nps
add_success >> /npc1/nps.txt
add_success2
}
main
3、测试结果如下,也可按自己喜欢的方式更改输出结果