从Java GUI应用程序执行SH不起作用

时间:2014-07-18 09:12:19

标签: java bash sh

我正在尝试从我的java GUI应用程序执行SH脚本。我正在使用jsch连接到机器。 我可以执行“ls”或“pwd”等命令。当我尝试执行我的SH时,我只从它获得所有输出,如果我直接在机器中执行它需要几次(这是预期的)并且工作正常。

脚本以

开头
  

“#!/斌/庆典”

并且调用它的代码是:

String command=  "cd /opt/app/ordersync/scripts/RE-INJEC;sh ./proc_reinjec.sh"; // enter any command you need to execute  
         Channel channel=session.openChannel("exec");
         ((ChannelExec)channel).setCommand(command);
        channel.setInputStream(null);
         ((ChannelExec)channel).setErrStream(System.err);
         in = channel.getInputStream();
         channel.connect();

当我执行它时

  

我没有设置TERM环境变量

我无法弄清楚问题是什么。我在php中使用shell_exec尝试了同样的问题(结果)是一样的。

1 个答案:

答案 0 :(得分:0)

这只是一个猜测。因此,请考虑主要作为(长)评论。但是你假设你的"命令"实际上将由中间 shell 解析,甚至可能负责设置适当的环境。但是,ChannelExec真的启动了一个shell吗?或者它直接执行命令?

无论如何,请尝试:

String command=  "sh -l -c 'cd /opt/app/ordersync/scripts/RE-INJEC;sh ./proc_reinjec.sh'";
//                ^^^^^^^^^^                                                           ^
//                  explicit sub-shell       don't forget the closing quote >-->-->----/
//                  '-l' is for login shell: reads /etc/profile, ... at startup
//                                           I don't know if this is required here

但实际上你可能正在寻找ChannelShell而已?


来自RFC 4254, section 6.5. Starting a Shell or a Command

  

6.5。启动Shell或命令

     

一旦设置了会话,就会启动一个程序   远程端。该程序可以是shell,应用程序或   具有独立于主机的名称的子系统。只有其中一个   请求可以在每个频道成功。

  byte      SSH_MSG_CHANNEL_REQUEST
  uint32    recipient channel
  string    "shell"
  boolean   want reply
     

此消息将请求用户的默认shell (通常是   在UNIX系统中的/ etc / passwd中定义)在另一端启动。

  byte      SSH_MSG_CHANNEL_REQUEST
  uint32    recipient channel
  string    **"exec"**
  boolean   want reply
  string    command
     

此消息将请求服务器启动执行   给定的命令。 '命令'字符串可能包含路径。   必须采取正常的预防措施以防止执行   未经授权的命令。