如何在SSH远程AWS EC2实例后自动切换root并进入指定目录?
解决AWS EC2远程连接后自动切换root并进入指定目录的Shell脚本问题
我明白你现在的困扰——想通过Shell脚本一键连接AWS EC2实例,自动切换到root用户并进入/var/files目录,但当前脚本不仅完成不了这两步,还存在变量传递的问题。咱们一步步拆解解决:
先说说你当前脚本的核心问题
你原来的写法里,USER='sudo su'和PATH='cd /var/files'是在本地设置变量,根本没传递到远程实例;而且echo $USER和echo $PATH也是在本地执行的(因为变量没被引号保护,本地Shell会先解析它们),完全达不到远程执行的目的。
给你两种可行的解决办法
方法1:直接在SSH命令中传递远程执行的命令链
用单引号把所有要在远程执行的命令包裹起来,确保本地Shell不会提前解析内容,而是原封不动传到EC2实例执行:
cd "C:\Operations\sys_admin" && ssh -i "mykeypair.pem" ec2-user@[IP].[location].compute.amazonaws.com 'sudo su - && cd /var/files && bash'
sudo su -:切换到root用户的同时加载root的完整环境变量(比单纯sudo su更规范)cd /var/files:进入目标目录bash:启动交互式Shell,避免执行完命令后直接退出连接
方法2:用Here-Doc实现更清晰的命令序列
如果后续要加更多远程命令,用Here-Doc结构会更易读,记得加上-t参数强制分配伪终端(避免sudo时可能出现的终端错误):
cd "C:\Operations\sys_admin" && ssh -t -i "mykeypair.pem" ec2-user@[IP].[location].compute.amazonaws.com << 'EOF' sudo su - cd /var/files bash EOF
- 这里的
'EOF'加单引号是为了禁止本地变量替换,确保所有命令都在远程实例执行
额外注意事项
- 确保EC2实例中的
ec2-user有sudo权限,最好配置免密sudo(可以在实例中编辑/etc/sudoers,添加ec2-user ALL=(ALL) NOPASSWD:ALL),避免脚本执行时需要手动输入密码 - 密钥文件
mykeypair.pem的权限要正确:如果是在Linux/macOS环境下执行脚本,需要设置chmod 400 mykeypair.pem;Windows下可忽略,但要确保文件路径正确 - 替换命令中的
[IP].[location]为你EC2实例的实际公有IP或域名
内容的提问来源于stack exchange,提问作者Kerbol
相关产品推荐
相关产品推荐

