Azure Linux App Service重启后OpenSSH私钥丢失,求无密码SSH解决方案
解决Azure App Service Linux重启后.ssh文件夹消失的问题
这个问题其实是Azure App Service Linux的一个常见坑——你在根目录生成的.ssh文件夹是存在临时文件系统里的,每次App Service重启,临时存储都会被重置清空,所以密钥自然就没了。下面给你两个靠谱的解决办法:
办法一:使用持久化存储目录存放密钥
Azure App Service Linux提供了/home目录作为持久化存储,这个目录里的内容不会因为App Service重启、缩放或者部署而丢失。步骤如下:
- 先在
/home下创建.ssh目录并设置正确权限:mkdir -p /home/.ssh chmod 700 /home/.ssh - 在这个目录下生成密钥对(跳过密码输入直接回车):
ssh-keygen -t rsa -b 4096 -f /home/.ssh/id_rsa -N "" - 把
/home/.ssh/id_rsa.pub里的公钥复制到远程服务器的~/.ssh/authorized_keys中(和你之前的操作一样)。 - 让SSH客户端默认读取这个路径的密钥:
可以在/home/.ssh下创建config文件,添加全局配置:
或者执行SSH命令时手动指定密钥路径:Host * IdentityFile /home/.ssh/id_rsassh -i /home/.ssh/id_rsa user@your-remote-server
办法二:通过启动脚本自动重建密钥
如果因为某些场景无法使用/home目录,可以把密钥内容存在App Service的应用设置里,通过启动脚本在每次启动时自动生成.ssh文件夹和密钥文件:
准备密钥并配置应用设置
- 在本地生成好密钥对,把私钥的完整内容(包括
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----)复制到App Service的「应用设置」中,新建一个名为SSH_PRIVATE_KEY的配置项,值为私钥内容。 - 同理,把公钥内容复制到另一个配置项
SSH_PUBLIC_KEY中。
- 在本地生成好密钥对,把私钥的完整内容(包括
创建启动脚本
在你的应用代码根目录下创建startup.sh脚本,内容如下(根据你的应用启动命令调整最后一行):# 创建.ssh目录并设置安全权限 mkdir -p ~/.ssh chmod 700 ~/.ssh # 写入私钥并设置权限(必须600,否则SSH会拒绝) echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # 写入公钥 echo "$SSH_PUBLIC_KEY" > ~/.ssh/id_rsa.pub chmod 644 ~/.ssh/id_rsa.pub # 执行你的应用启动命令,比如Node.js用npm start,Python用gunicorn等 npm start配置启动命令
在App Service的「应用设置」中,找到WEBSITE_STARTUP_COMMAND,设置为bash startup.sh,这样每次App Service启动时都会自动运行这个脚本重建密钥。
关键注意事项
- 权限是核心:
.ssh目录必须是700权限,私钥必须是600权限,否则SSH客户端会因为权限过于宽松而拒绝使用密钥。 - 用应用存储密钥时,确保复制的密钥内容没有多余的换行或空格,否则会导致密钥无效。
- 如果使用
/home目录,这个目录是跨实例共享的,当你缩放App Service实例时,所有实例都会使用同一套密钥。
内容的提问来源于stack exchange,提问作者Lopuch
相关产品推荐
相关产品推荐

