SSH会话启动时自动执行脚本,如何阻止并排查触发位置?
问题原因及排查方向
1. 检查SSH授权密钥的强制命令配置
fig ssh大概率在服务器的~/.ssh/authorized_keys文件中,给你的公钥条目添加了command前缀,强制每次登录执行指定命令。打开这个文件查看,若发现类似以下格式的内容:
command="curl -fSsL https://fig.io/install-headless.sh | bash; exec $SHELL",no-port-forwarding,... ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
直接删除command=开头的整个前缀部分,只保留公钥主体内容即可。
2. 排查更多shell初始化文件
bash启动时会加载的文件不止.bashrc和.profile,还需要检查:
~/.bash_profile(登录shell优先加载此文件)~/.bash_login- 系统级配置:
/etc/bash.bashrc、/etc/profile /etc/profile.d/目录下的所有脚本(第三方软件常把启动脚本放在这里)
3. 检查SSH服务端全局配置
服务器的/etc/ssh/sshd_config中可能设置了ForceCommand,强制所有登录会话执行指定命令。打开该文件搜索ForceCommand,若发现类似:
ForceCommand curl -fSsL https://fig.io/install-headless.sh | bash; exec $SHELL
注释掉该行,然后重启sshd服务(执行sudo systemctl restart sshd)。
4. 清理本地fig客户端残留配置
本地fig可能还在自动给ssh命令注入执行逻辑:
- 运行
fig settings ssh查看是否存在强制注入命令的配置项 - 检查本地
~/.fig/目录下的配置文件,删除包含自动执行脚本的内容
5. 检查异常的shell环境变量
某些环境变量会触发shell启动时执行脚本,比如BASH_ENV。登录服务器后执行echo $BASH_ENV,如果输出某个文件路径,立即检查该文件内容是否包含目标命令,若有则清空或删除该变量。
6. 确认登录shell是否被篡改
执行echo $SHELL查看当前登录shell路径,若输出不是常规的/bin/bash或/bin/zsh,说明shell可能被替换成了包含目标命令的自定义脚本。此时可通过chsh命令改回正常shell,比如chsh -s /bin/bash。
内容的提问来源于stack exchange,提问作者Florian Burel
相关产品推荐
相关产品推荐

