JSCH 不能运行JAVA bash java Command not found

JSCH 不能运行JAVA bash java Command not found



问题现象

用SSH工具连接主机,手动执行程序,正常。

通过平台WEB网页方式连接主机,执行程序,报错,找不到Oracle库文件。

测试中发现读取到的环境变量少了很多。

分析

经过查询资料,是因为程序采用了non interactive + non login shell的方式。

hint:工具手动SSH登录是interactive + login shell方式。

所以无法读取到全局配置:/etc/profile

详细的原理:交互方式/登录shell,参考其他资料吧。

这里借一张图说明几种方式的不同:

笔记插图(第 1 页)

解决办法

最简单的解决办法就是把需要读取环境变量放入用户的~/.bashrc中。

小问题:由于平台不知道应用的程序会读取哪些环境变量,所以需要用户自己把/etc/profile中已知需要用到的环境变量

都在~/.bashrc中再写一次……

exec模式下解决方式有两种

channel.setCommand(“bash –login -c ‘"+command.getCommand()+”’");

或

channel.setCommand(“source /etc/profile &&"+command.getCommand());

/etc/profile: 用来设置系统环境参数,比如$PATH. 这里面的 是对系统内所有用户生效的。

环境变量

/etc/bashrc: 这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命

令,那么这里面的东西就在起作用。

~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的,也就

是说,你在/home/user1/.bash_profile 中设定了环境变量,那么这个环境变量只针对 user1 这个用户生

效.

~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。

另外/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继

承/etc/profile中的变量,他们是"父子"关系.

~/.bash_profile 是交互式、login 方式进入 bash 运行的,意思是只有用户登录时才会生效。

~/.bashrc 是交互式 non-login 方式进入 bash 运行的,用户不一定登录,只要以该用户身份运行命令行就

会读取该文件。

这里我们可以看到,/etc/profile和~./bashrc_profile是等价的,/etc/bashrc和~/.bashrc是等价的,区别只

是针对的用户范围不同,前者是针对所有用户的,而后者是针对单个用户的。这里重点注意一句话:

“/etc/bashrc: 这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命

令,那么这里面的东西就在起作用。”我们刚才提示的问题就是bash命令找不到,现在我们在/etc/bashrc

内重新配置所需命令的环境变量,source /etc/bashrc使配置生效,再次执行上面的程序,就能看到相应

命令的正确的返回结果了。