diff --git a/sudo-ssh.sh b/sudo-ssh.sh index 14abdda..35604e3 100644 --- a/sudo-ssh.sh +++ b/sudo-ssh.sh @@ -1,5 +1,51 @@ #!/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='' 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 TARGET_USER=${TARGET_USER:-leador} @@ -224,6 +270,17 @@ check_connectivity() { 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() { if command -v sshd >/dev/null 2>&1; then log_info "openssh-server 已存在,跳过安装" @@ -236,9 +293,7 @@ install_ssh_server() { fi log_info "安装 openssh-server" - need_cmd apt-get - run_root apt-get update - run_root apt-get install -y openssh-server + repair_apt_dependencies } configure_sshd() {