增强 sudo-ssh.sh 脚本,添加 SSH 和 apt 依赖修复功能

This commit is contained in:
sanyitec
2026-06-12 15:14:46 +08:00
parent 72f220b3f8
commit ee4f8a7a31

View File

@@ -1,5 +1,51 @@
#!/bin/bash #!/bin/bash
# 一键准备目标 Linux 设备的 SSH 和部署 sudo 权限。
#
# 作用:
# 1. 先验证/补齐 TARGET_USER 的 sudo 权限;没有 sudo 时尝试用 root 权限自动补齐。
# 2. 判断目标设备是否已联网,避免 apt 安装时才失败。
# 3. 清理并修复 apt 依赖状态,安装 openssh-server 相关依赖。
# 4. 配置 SSH 端口、密码登录、key 登录和 root 登录策略。
# 5. 自动放行 UFW/firewalld 中的 SSH 端口。
# 6. 验证 ssh 服务 active、sshd 配置合法、端口已监听。
# 7. 写入 /etc/sudoers.d/ecu-debug-client-deploy供 client-deploy.sh 远程部署使用。
# 8. 验证 TARGET_USER 可以无密码执行部署 sudo 命令。
#
# 前置要求:
# - 本脚本需要在目标 Linux 设备本地执行,不依赖目标设备已开启 SSH。
# - 目标系统为 Ubuntu/Debian 或兼容 apt 的发行版。
# - 当前用户需要具备 sudo 权限;如果没有,需要当前 shell 已是 root或知道 root 密码。
# - 目标设备需要能访问 apt 软件源;如果只通 ZeroTier/LAN 但不通公网,请先修复 DNS/网关/代理。
#deve
# 常用用法:
# 默认配置当前用户、22 端口、完整免密 sudo
# ./tools/ssh-sudo-zerotier/start.sh
#
# 指定目标用户名和 IP
# TARGET_USER=leador TARGET_IP=192.168.191.37 ./tools/ssh-sudo-zerotier/start.sh
#
# 当前用户没有 sudo但知道 root 密码:
# ROOT_PASSWORD='<root-password>' TARGET_USER=leador TARGET_IP=192.168.191.37 ./tools/ssh-sudo-zerotier/start.sh
#
# 使用非 22 端口:
# SSH_PORT=2222 TARGET_USER=leador TARGET_IP=192.168.191.37 ./tools/ssh-sudo-zerotier/start.sh
#
# 环境变量:
# TARGET_USER 后续部署机 SSH 登录和部署 sudo 的目标用户,默认取当前用户。
# TARGET_IP 后续部署机访问目标设备的 IP默认自动探测本机 IPv4。
# SSH_PORT SSH 监听端口,默认 22。
# PASSWORD_AUTH 是否允许密码登录yes/no默认 yes。
# PUBKEY_AUTH 是否允许 SSH key 登录yes/no默认 yes。
# PERMIT_ROOT_LOGIN 是否允许 root SSH 登录,默认 no。
# CONNECTIVITY_HOSTS 联网检测地址列表,默认 "223.5.5.5 1.1.1.1 8.8.8.8"。
# ROOT_PASSWORD 当前用户无 sudo 时可选传入 root 密码;为空时 su 会交互询问。
#
# 执行后,在部署机验证并部署:
# nc -vz -w 3 "$TARGET_IP" "$SSH_PORT"
# ssh -p "$SSH_PORT" "$TARGET_USER@$TARGET_IP" "hostname && whoami && sudo -n id"
# ./client-deploy.sh --deploy-only
set -euo pipefail set -euo pipefail
TARGET_USER=${TARGET_USER:-leador} TARGET_USER=${TARGET_USER:-leador}
@@ -224,6 +270,17 @@ check_connectivity() {
fi fi
} }
repair_apt_dependencies() {
log_info "清理并修复 apt 依赖状态"
need_cmd apt-get
run_root apt-get clean
run_root bash -c 'rm -rf /var/lib/apt/lists/*'
run_root apt-get update
run_root apt-get --fix-broken install -y
run_root apt-get install -y libtalloc2 libtdb1 libtevent0 openssh-client openssh-server
}
install_ssh_server() { install_ssh_server() {
if command -v sshd >/dev/null 2>&1; then if command -v sshd >/dev/null 2>&1; then
log_info "openssh-server 已存在,跳过安装" log_info "openssh-server 已存在,跳过安装"
@@ -236,9 +293,7 @@ install_ssh_server() {
fi fi
log_info "安装 openssh-server" log_info "安装 openssh-server"
need_cmd apt-get repair_apt_dependencies
run_root apt-get update
run_root apt-get install -y openssh-server
} }
configure_sshd() { configure_sshd() {