Azure VM执行SCP传文件报Permission denied (publickey)求助
你遇到的Permission denied (publickey)报错首先来自命令参数写法错误,其次可能伴随私钥权限、云主机配置类问题,按以下步骤逐一排查即可解决:
1. 修正SCP命令参数
你当前写的命令没有指定私钥作为认证凭证,反而把.pem私钥文件当成了要上传的源文件,SCP连接VM时没有携带匹配的私钥,自然会被公钥认证规则拒绝。
SCP指定私钥需要加-i参数,正确的命令格式如下:
scp -i <你的pem私钥完整本地路径> -r <要上传的服务端程序文件夹本地路径> azureuser@<Azure VM公网IP>:/home/azureuser/
注意:命令里的尖括号<>是占位符标记,实际执行时要替换成真实路径/IP,不要把尖括号写进命令里。
2. 修复本地私钥文件权限
Windows下OpenSSH客户端会强制校验私钥文件的访问权限,如果私钥所在文件夹继承了过多用户的访问权限,客户端会直接拒绝使用该私钥,在PowerShell中执行以下命令重置私钥权限:
# 替换成你自己的pem文件实际路径 icacls.exe "C:\path\to\your\key.pem" /inheritance:r /grant:r "$($env:USERNAME):(R)"
执行完成后重新运行修正后的SCP命令即可。
额外注意:不要把pem私钥放在C盘根目录、开启了云同步的桌面/文档文件夹,这类文件夹默认有其他系统账户的访问权限,容易触发OpenSSH的权限校验拦截,建议放在当前用户目录下的
.ssh文件夹内,比如C:\Users\你的用户名\.ssh\路径下。
3. 排查Azure VM侧配置问题
如果修正命令和权限后仍然报错,逐一检查VM侧配置:
- 确认你使用的IP是VM当前生效的公网IP,Azure动态公网IP会在VM关机重启后重新分配,不要使用历史留存的旧IP
- 确认VM绑定的网络安全组(NSG)放行了22端口的入站流量,源地址建议配置为你本地电脑的公网IP,不要开放0.0.0.0/0全段访问避免被暴力扫描攻击
- 确认创建VM时设置的管理员用户名确实为
azureuser,如果创建时自定义了其他用户名,替换命令里的用户名部分即可 - 确认VM创建时选择的是SSH公钥认证模式,不是密码认证模式
4. 连通性验证与debug
先跳过文件传输,直接用SSH命令测试连接,能正常登录VM终端的话SCP一定可以正常使用:
ssh -i <你的pem私钥路径> azureuser@<Azure VM公网IP>
如果连接仍然失败,给SSH命令加-v参数输出详细debug日志,日志会明确标注失败原因:是私钥加载失败、算法不匹配、还是服务端公钥不匹配:
ssh -v -i <你的pem私钥路径> azureuser@<Azure VM公网IP>
如果日志提示密钥算法不匹配,在命令里加兼容参数即可,部分老版本Azure Linux镜像默认不支持新版本OpenSSH的默认密钥算法:
scp -i <你的pem私钥路径> -r -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa <要上传的文件夹路径> azureuser@<VM公网IP>:/home/azureuser/
内容的提问来源于stack exchange,提问作者Antonio

