Shell脚本中SSH命令执行失败(Permission denied(publickey))求助
解决方案与建议
1. 显式指定密钥文件绝对路径
脚本执行时的工作目录可能和终端手动执行不同,导致SSH无法自动找到密钥文件。直接在SSH命令里指定绝对路径的密钥:
ssh -i /home/ec2-user/.ssh/your-key-name.pem ec2-user@target-server-ip
2. 对比脚本与终端的环境变量差异
终端手动执行时的环境变量(比如SSH_AUTH_SOCK,若使用ssh-agent管理密钥)和脚本执行时可能不一致。可以在脚本开头添加环境变量输出命令,对比终端执行env的结果:
# 在脚本开头加入,运行后查看输出差异 env > /tmp/script_env.log
如果发现SSH_AUTH_SOCK缺失,可在脚本中手动导出正确的路径后再执行SSH:
export SSH_AUTH_SOCK=/run/user/1000/ssh-agent.sock # 替换为你终端中实际的路径 ssh ec2-user@target-server-ip
3. 启用SSH调试模式定位问题
在脚本的SSH命令中添加-vvv参数,输出详细的验证日志,从中查看密钥加载、公钥验证的具体环节哪里出错:
ssh -vvv -i /home/ec2-user/.ssh/your-key-name.pem ec2-user@target-server-ip
4. 确认脚本的执行用户
如果脚本是通过cron、systemd等服务触发执行,可能实际执行用户并非ec2-user。在脚本开头加入身份检查命令:
# 运行脚本后查看输出,确认执行用户 whoami id
如果是cron任务,需确保任务的执行用户是ec2-user,且脚本及所有相关路径都使用绝对路径。
5. 再次验证目标服务器的密钥配置
虽然手动执行成功,但仍需确认目标服务器上:
~/.ssh/authorized_keys文件包含当前密钥的公钥~/.ssh/authorized_keys权限为600~/.ssh目录权限为700- 上述文件/目录的所有者为目标服务器的登录用户
内容的提问来源于stack exchange,提问作者JapaneseE.Eggs
相关产品推荐
相关产品推荐

