1.
生成 SSH 密钥对(推荐 ed25519)
步骤小分段:
(a) 在本地终端运行:ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
(b) 当提示输入 passphrase,若要无交互自动登录可直接按回车留空(不推荐生产环境),更安全做法是设置口令并使用 ssh-agent 缓存。
(c) 生成后会得到 id_ed25519(私钥)和 id_ed25519.pub(公钥)。
2.
设置本地密钥权限
步骤小分段:
(a) chmod 700 ~/.ssh
(b) chmod 600 ~/.ssh/id_ed25519
(c) chmod 644 ~/.ssh/id_ed25519.pub
3.
把公钥上传到台湾 VPS(推荐 ssh-copy-id)
步骤小分段:
(a) 使用 ssh-copy-id:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@taiwan-vps-ip
(b) 如果没有 ssh-copy-id,可手动登录:ssh user@ip,然后在服务器上执行 mkdir -p ~/.ssh && chmod 700 ~/.ssh
(c) 在本地执行:cat ~/.ssh/id_ed25519.pub | ssh user@ip 'cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'。
4.
服务器端权限与 SSHD 配置检查
步骤小分段:
(a) 确认服务器 ~/.ssh/authorized_keys 权限为 600,.ssh 为 700:chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh
(b) 检查 /etc/ssh/sshd_config:确保 PubkeyAuthentication yes,AuthorizedKeysFile .ssh/authorized_keys
(c) 修改后重启 ssh:sudo systemctl restart sshd(或 sudo service ssh restart)。
5.
测试免密登录与常见选项
步骤小分段:
(a) 本地执行:ssh -i ~/.ssh/id_ed25519 user@taiwan-vps-ip
(b) 若想脚本化且避免首次主机指纹交互,可使用:ssh -o StrictHostKeyChecking=accept-new -i ...(注意安全风险)
(c) 若需要无提示失败可用 BatchMode:ssh -o BatchMode=yes -i ... user@host
6.
使用 ssh-agent 加载带口令的私钥(更安全)
步骤小分段:
(a) 启动 agent:eval "$(ssh-agent -s)"
(b) 添加密钥:ssh-add ~/.ssh/id_ed25519(会提示输入口令,只需输入一次)
(c) 验证:ssh-add -l,之后脚本或 cron 执行时会共享 agent 环境或用 keychain / systemd 用户服务管理。
7.
编写自动化登录脚本示例(bash)
步骤小分段:
(a) 简单远程命令执行 save as ~/bin/run_on_taiwan.sh:
内容示例(单行表示):#!/bin/bash; ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 user@taiwan-vps-ip "$@"
(b) 给脚本执行权限:chmod +x ~/bin/run_on_taiwan.sh
(c) 使用示例:~/bin/run_on_taiwan.sh "hostname && uptime"
8.
用 rsync/scp 自动化文件同步
步骤小分段:
(a) scp 示例:scp -i ~/.ssh/id_ed25519 localfile user@ip:/path/
(b) rsync 增量:rsync -avz -e "ssh -i ~/.ssh/id_ed25519" ./localdir/ user@ip:/remotedir/
(c) 在脚本中捕获返回值并做错误重试(示例:重试 3 次,每次 sleep 5s)。
9.
长期运行或定时任务:使用 systemd 用户服务或 cron
步骤小分段:
(a) 若使用 cron,需保证私钥无口令或用 ssh-agent;编辑 crontab:crontab -e,写入定时任务调用上面的脚本。
(b) 更推荐 systemd user 单元:~/.config/systemd/user/myjob.service + .timer,可在服务单元里设置 Environment=SSH_AUTH_SOCK=/run/user/1000/ssh-agent.sock 来共享 agent。
(c) 对于长连接隧道建议使用 autossh 并创建 systemd 服务以自动重连。
10.
当无法使用密钥时的方案(谨慎)
步骤小分段:
(a) 临时需要用密码自动化,可用 expect 脚本模拟输入,但不安全,尽量避免。
(b) expect 示例会在文末附带注意。更安全的是申请 API 或控制面板的密钥管理功能,或使用 jump host/堡垒机统一认证。
11.
示例 expect(不推荐,仅供紧急)
步骤小分段:
#!/usr/bin/expect -f
set timeout 30
spawn ssh user@taiwan-vps-ip
expect "password:" { send "your_password\r" }
interact
(注意:此脚本会在磁盘留明文密码,生产环境请勿使用)
12.
安全建议与备份
步骤小分段:
(a) 建议使用 ed25519 并为私钥设置口令,使用 ssh-agent 缓存;
(b) 备份私钥到安全的离线介质或使用硬件密钥(YubiKey);
(c) 定期更换密钥并在不需要时撤销 authorized_keys 中的公钥。
13.
问:如何把带口令的私钥用于定时任务(cron)?
答:将私钥保有口令更安全,但 cron 无交互。推荐两种方式:一是使用 ssh-agent 在用户登录时加载密钥,并用 systemd user 服务或 keychain 将 SSH_AUTH_SOCK 导出给定时任务;二是在 systemd 中写 user 单元并通过 Environment 或 ExecStartPre 启动一个 ssh-agent 并加载密钥,避免在 cron 中明文口令。
14.
问:台湾 VPS 的网络延时对自动化有什么影响,我如何改进?
答:较高延时会导致连接建立慢或超时。可通过启用 SSH 连接复用(在 ~/.ssh/config 中设置 ControlMaster auto、ControlPath 和 ControlPersist),或者使用 autossh/retry 脚本减少重连开销,并在 ssh 命令里增加 ConnectTimeout 和 ServerAliveInterval 以提高稳定性。
15.
问:如果我的 VPS 管理面板支持密钥上传,是否还需手动操作?
答:面板上传公钥通常会自动写入 authorized_keys,省去 ssh-copy-id 步骤。但仍要在服务器端确认权限(.ssh 700、authorized_keys 600)及 sshd 配置,并建议通过实际 ssh 登录测试。同时在本地保管好私钥并按策略备份与轮换。
来源:自动登录台湾vps云服务器登录的密钥管理与自动化脚本示例