WSL中无法修改EC2密钥.pem文件权限导致SSH连接失败的问题咨询
WSL中无法修改EC2密钥.pem文件权限导致SSH连接失败的问题咨询
你好!作为经常折腾WSL和EC2的开发者,我完全懂你这种跨系统权限踩坑的痛苦,咱们一步步来解决这个问题:
首先先给你明确两个核心问题:
- Windows文件权限确实会直接映射到WSL的权限——如果你的pem文件是存放在Windows的磁盘(比如C:/、D:/)里,WSL只是通过挂载的方式访问这些文件,底层权限还是Windows在管控,这就是为什么你用
chmod、chown甚至root操作都报错的原因。 - SSH要求密钥文件的权限必须是
600(也就是只有自己能读写),权限太松或者太严都会导致连接失败,这也是AWS提示你“文件权限太开放”的原因。
接下来给你几个优先级从高到低的解决方案:
方案一:把密钥移到WSL原生文件系统(最推荐)
WSL自己的文件系统(比如/home/你的用户名/下的目录)不受Windows权限管控,操作起来最顺畅:
- 打开WSL终端,先创建标准的密钥存放目录:
mkdir -p ~/.ssh - 把Windows里的pem文件复制过来,假设你的pem在Windows的
D:\dev\keys\ec2key1.pem,那么在WSL里执行:cp /mnt/d/dev/keys/ec2key1.pem ~/.ssh/ - 现在就可以正常修改权限了,执行SSH要求的
600权限:chmod 600 ~/.ssh/ec2key1.pem - 执行
ls -l ~/.ssh/ec2key1.pem确认,输出应该是-rw-------开头,这就对了 - 之后用这个密钥连接EC2:
ssh -i ~/.ssh/ec2key1.pem 你的用户名@EC2公网IP(注意:不同系统的用户名不一样,Amazon Linux是ec2-user,Ubuntu是ubuntu,CentOS是centos)
方案二:修改WSL挂载配置(不用移动文件)
如果你不想移动文件,可以调整WSL的挂载参数,让Windows磁盘里的文件能被WSL修改权限:
- 在WSL里编辑(或新建)
/etc/wsl.conf文件:sudo nano /etc/wsl.conf - 粘贴以下内容:
[automount] enabled = true options = "metadata,umask=0022" mountFsTab = false
- 按
Ctrl+O保存,Ctrl+X退出编辑器 - 关闭所有WSL窗口,然后在Windows的命令提示符里执行
wsl --shutdown重启WSL - 重新打开WSL后,你就可以对Windows里的pem文件执行
chmod 600修改权限了
方案三:给EC2实例绑定新密钥(最稳妥的兜底方案)
如果上面的方法都走不通,或者担心前同事的密钥有安全隐患(毕竟他已经离职了),最稳妥的办法是生成新的密钥对绑定到EC2:
- 登录AWS控制台,创建一个新的密钥对,下载对应的pem文件到你的电脑
- 按照方案一的步骤把新pem放到WSL原生目录并设置
600权限 - 给EC2实例替换密钥:
- 如果你能通过其他方式(比如AWS SSM会话管理器)登录实例,可以直接编辑
~/.ssh/authorized_keys文件,添加新密钥的公钥内容(公钥可以通过ssh-keygen -y -f 新pem文件路径生成) - 如果无法登录,就需要停止EC2实例,把它的根磁盘挂载到另一个临时EC2实例上,修改临时实例里挂载磁盘的
authorized_keys文件,再把磁盘挂回原实例启动
- 如果你能通过其他方式(比如AWS SSM会话管理器)登录实例,可以直接编辑
关于前同事机器的ACL操作
其实完全没必要折腾前同事的机器,就算你在他的机器上改了ACL,复制到你的电脑后,Windows还是会根据你的用户权限重新设置文件权限,反而多此一举,不如直接用上面的方案解决。
最后再提醒你:除了密钥权限,EC2的安全组必须开放22端口给你的IP,而且连接时的用户名要正确,这些也可能导致“Permission denied”的错误,排查的时候别漏了!
备注:内容来源于stack exchange,提问作者hnewbie
相关产品推荐
相关产品推荐

