SSH密钥部署需手动在authorized_keys中添加command=限制项,可自动化生成ED25519密钥、构造带no-pty等限制的授权行,并安全写入远程服务器,最后验证权限与配置。

在Linux中,用ssh-keygen生成部署专用密钥对本身不直接支持绑定Command权限——那是SSH服务端authorized_keys文件里针对单条公钥的限制项,需手动或脚本注入。但你可以完整自动化“生成密钥 + 部署 + 添加带command=限制的授权行”这一整套流程。
生成专用密钥对并指定用途标识
为部署场景生成独立密钥,避免混用主密钥,同时加入清晰注释便于识别:
- 运行命令:
ssh-keygen -t ed25519 -b 256 -f ~/.ssh/id_deploy_web -C "deploy@webapp-prod-2026" -
-b 256对ED25519是标准位长,无需增大;RSA则建议-b 4096 -
-f指定专属路径,防止覆盖默认密钥;-C中的注释将出现在authorized_keys里,用于快速定位用途
构造带Command限制的授权行
command=限制让该密钥只能执行预设命令(如部署脚本),即使被泄露也无法交互式登录:
- 先确认目标服务器上已存在可执行的部署脚本,例如
/home/deploy/bin/deploy.sh,且属主为deploy用户、权限为755 - 构造完整授权行(一行,无换行):
command="/home/deploy/bin/deploy.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA... deploy@webapp-prod-2026 - 其中
AAAA...是cat ~/.ssh/id_deploy_web.pub输出的公钥内容(开头为ssh-ed25519那一整行) -
no-pty禁用伪终端,强制非交互;其他no-*进一步收窄能力
自动部署到远程服务器的authorized_keys
跳过ssh-copy-id(它不支持注入command=),改用安全的一行部署:
- 执行(替换
user@host和路径):cat ~/.ssh/id_deploy_web.pub | ssh user@host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo "command=\"/home/deploy/bin/deploy.sh\",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty $(cat) \" >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys' - 注意:公钥内容需用
$(cat)包裹并双引号包围,确保空格与特殊字符不被shell截断 - 首次部署后,可用
ssh -i ~/.ssh/id_deploy_web user@host测试是否仅能执行指定脚本,且无法进入shell
验证与最小权限加固
完成部署后务必检查关键点,避免因权限松动导致command=失效:
- 远程服务器上,确认
~/.ssh目录权限为700,authorized_keys为600,且文件属主是登录用户(不是root) - 检查sshd配置:
sudo grep -E "^(PubkeyAuthentication|ForceCommand)" /etc/ssh/sshd_config,确保PubkeyAuthentication yes且未全局启用ForceCommand(否则会覆盖单行command=) - 测试异常行为:尝试
ssh -i ~/.ssh/id_deploy_web user@host bash,应被拒绝或直接执行部署脚本后退出


















