You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件,添加全局配置:
    Host *
        IdentityFile /home/.ssh/id_rsa
    
    或者执行SSH命令时手动指定密钥路径:
    ssh -i /home/.ssh/id_rsa user@your-remote-server
    

办法二:通过启动脚本自动重建密钥

如果因为某些场景无法使用/home目录,可以把密钥内容存在App Service的应用设置里,通过启动脚本在每次启动时自动生成.ssh文件夹和密钥文件:

  1. 准备密钥并配置应用设置

    • 在本地生成好密钥对,把私钥的完整内容(包括-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----)复制到App Service的「应用设置」中,新建一个名为SSH_PRIVATE_KEY的配置项,值为私钥内容。
    • 同理,把公钥内容复制到另一个配置项SSH_PUBLIC_KEY中。
  2. 创建启动脚本
    在你的应用代码根目录下创建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
    
  3. 配置启动命令
    在App Service的「应用设置」中,找到WEBSITE_STARTUP_COMMAND,设置为bash startup.sh,这样每次App Service启动时都会自动运行这个脚本重建密钥。

关键注意事项

  • 权限是核心:.ssh目录必须是700权限,私钥必须是600权限,否则SSH客户端会因为权限过于宽松而拒绝使用密钥。
  • 用应用存储密钥时,确保复制的密钥内容没有多余的换行或空格,否则会导致密钥无效。
  • 如果使用/home目录,这个目录是跨实例共享的,当你缩放App Service实例时,所有实例都会使用同一套密钥。

内容的提问来源于stack exchange,提问作者Lopuch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:02:40