RT,我想要在A电脑的Linux上通过ssh命令执行B电脑Linux上的java程序。出现如下问题:
A,B电脑的用户都叫sam,B的IP是192.168.1.X,B电脑的~目录下有个a.java,并且已经编译完成。
我直接 ssh [email protected] ‘java a’ ,报错:bash:java未找到命令。
但是如果先ssh [email protected]进入B电脑,然后在下一行输入java a,便可以执行,希望大神帮我解释一下,有点蒙。

解决方案 »

  1.   

    自己顶一下,顺便补充,我利用绝对java命令运行就好使:
    例如ssh [email protected] '/java/jdk/bin/java a'就好用,很明显是环境变量出了问题,但是我在AB两个机器上配置的环境变量是完全一样的。包括root的/etc/profile和用户sam的~/.bash_profile,相当于四个文件都是一样的配置。那么问题来了,是不是因为ssh执行命令时因为它是个短链接,没有打开终端,所以不会去加载环境变量从而导致不识别java命令呢?如果是这样的话,有没有什么更好的解决办法呢,总不能每次ssh执行命令都用java的绝对路径去执行吧
      

  2.   

    你的分析正确。更好的办法是写一个shell脚本,远程执行shell脚本
      

  3.   

    ssh [email protected] ‘java a’ 确定能否执行前,你先执行下ssh [email protected] ‘env’,看下你远程执行时,模拟终端的env的PATH中是否有你的java可执行文件的路径,没有的话,你就需要带全路径。
     根据ssh的帮助文档:If command is specified, command is executed on the remote host instead of a login shell.
    你不是直接登录主机的,所以这些.bash_profile是没有执行的,即前面的env看到的,只有一些基础的shell变量值,若你不想带全路径,就需要把可执行命令放到这些系统默认的PATH下
      

  4.   


    您的办法我起初也有试过。在B端写了个脚本,脚本里面写了java a这行代码,然后在A端运行这个脚本的时候,他也会报错,比如java a这行代码在脚本的第三行,他就会提示脚本的第三行有误,java未找到该命令,是一样的效果。难道还要在脚本里面配置环境变量么?请不吝赐教。
      

  5.   


    您说的我也听明白了。正常访问要带全路径。如果想不带全路径,是要在/etc/profile中配置path么?但是我在/etc/profile中已经做了和~/.bash_profile一样的配置呀,为什么还是不可以呢?
      

  6.   


    您的办法我起初也有试过。在B端写了个脚本,脚本里面写了java a这行代码,然后在A端运行这个脚本的时候,他也会报错,比如java a这行代码在脚本的第三行,他就会提示脚本的第三行有误,java未找到该命令,是一样的效果。难道还要在脚本里面配置环境变量么?请不吝赐教。
    用绝对路径
      

  7.   


    您说的我也听明白了。正常访问要带全路径。如果想不带全路径,是要在/etc/profile中配置path么?但是我在/etc/profile中已经做了和~/.bash_profile一样的配置呀,为什么还是不可以呢?不是,前面已经说过了,你远程执行,并不是真的终端,所以不会执行用户的.bahs_profile的,没有执行相当于没有这个环境变量,这个就有点类似su -sam 和su sam 后你的env是不同的一样。不想带全路径,你就ssh [email protected] ‘cd '/java/jdk/bin/;./java a’
      

  8.   

    ssh ... echo $JAVA_HOME输出是正常的, 执行java就找不到, 同样的别人机器执行就行
    用全路径不是不可以, 但是很傻
    比如
    for (( ... )) ; do
    ssh $host java spring-boot.jar
    done
    不一定每台机器java路径是一致的, 所以每台都得知道路径
    楼主找到药了吗?
      

  9.   

    找到方法了,vim /etc/environment 中添加path就好了JAVA_HOME=/usr/local/jdk1.8.0_144
    PATH="usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_144/bin"然后 ssh .... java 
      

  10.   

    做自动化部署jmeter的时候,遇到了跟题主一样的问题,看了这篇文章后http://blog.csdn.net/whitehack/article/details/51705889,发现,在#!/bin/bash 改成#!/bin/bash --login就可以了。原因是ssh时,没有加载/etc/profile,感谢楼上各位的启发。