【Linux】转载:解决SSH远程执行命令找不到环境变量的问题
原文地址:https://www.cnblogs.com/zhenyuyaodidiao/p/9287497.html
通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题。
但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的。
两种相似的方法,得到的结果却截然不同,看起来很诡异的现象,根本原因在于这两种方式使用的bash模式不同!
1. 通过SSH登录后再执行命令和脚本
这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login。
login故名思义,即登陆,login shell是指用户以非图形化界面或者以ssh登陆到机器上时获得的第一个shell,简单些说就是需要输入用户名和密码的shell。
因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。
interactive意为交互式,这也很好理解,interactive shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。
所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的shell都是interactive shell。
而如果无需用户交互,它便是non-interactive shell。通常来说如bash script.sh此类执行脚本的命令就会启动一个non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的Shell。
- 在interactive + login shell模式中,Shell首先会加载/etc/profile文件,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找:
~/.bash_profile
~/.bash_login
~/.profile
2. 通过SSH直接执行远程命令和脚本
这种方式会使用Bash的non-interactive + non-login shell模式,它会创建一个shell,执行完脚本之后便退出,不再需要与用户交互。
no-login shell,顾名思义就是不是在登录Linux系统时启动的(比如你在命令行提示符上输入bash启动)。
它不会去执行/etc/profile文件,而会去用户的HOME目录检查.bashrc并加载。
系统执行Shell脚本的时候,就是属于这种non-interactive shell。
Bash通过BASH_ENV环境变量来记录要加载的文件,默认情况下这个环境变量并没有设置。
如果有指定文件,那么Shell会先去加载这个文件里面的内容,然后再开始执行Shell脚本。
3. 结论
- 可以在登录用户的HOME目录的.bashrc中添加需要的环境变量。
- 可以在执行命令时使用绝对路径
4. 示例
在服务器2上启动服务器1上面的jar包,需要在服务器1的root目录下.bashrc文件里增加环境变量。
1.服务器1添加java环境变量
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias date='date "+%a %b %d %H:%M:%S %Z %Y"'
export JAVA_HOME=/home/jdk-11.0.2
export PATH=$PATH:$JAVA_HOME/bin
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
2.服务器2上执行命令
ssh root@10.168.0.200 "cd /home/hello;nohup java -jar /home/hello/helloworld.jar --spring.profiles.active=sit --apollo.cluster=default2 > /home/hello/helloworld.log 2>&1 &"
执行后服务器1上面的jar包启动
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix