Java在运行expect脚本时抛出进程exitValue:127

时间:2012-08-24 16:24:32

标签: java bash cygwin expect

我正在尝试一种新的方法让我陷入困境。而不是使用expect4j进行我的SSH连接,(我无法找到阻止消费者运行和关闭问题的方法,如果你知识渊博并且感觉很圣洁,请参阅过去的帖子以获取更多信息),我要去尝试使用expect脚本。我有一个运行时exec编码到button.onclick,见下文。为什么我得到127退出值?我基本上只需要这个期望脚本ssh in,运行一组expect和send,给我读出,就是它......

我正在使用cygwin。不知道这与为什么这不起作用有关......我的sh-bang线指向正确的位置?我的cygwin安装是一个完整的安装,所有软件包都在C:\ cygwin。

为什么我从服务器获取127退出值而不是读数,我该如何缓解这个?

try
    {            
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec( new String [] {"C:\\cygwin\\bin\\bash.exe", "C:\\scripts\\login.exp"});
        InputStream stdin = proc.getInputStream();
        InputStreamReader isr = new InputStreamReader(stdin);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        System.out.println("<OUTPUT>");
        while ( (line = br.readLine()) != null)
            System.out.println(line);
        System.out.println("</OUTPUT>");
        int exitVal = proc.waitFor();            
        System.out.println("Process exitValue: " + exitVal);
    } catch (Throwable t)
      {
        t.printStackTrace();
      }







#!/usr/bin/expect -f
spawn ssh userid@xxx.xxx.xxx.xxx password
match_max 100000
expect "/r/nDestination: "
send -- "xxxxxx\r"
expect eof

1 个答案:

答案 0 :(得分:4)

问题是您使用bash来执行expect脚本。你需要使用expect执行expect脚本,或者bash通过shell命令行执行expect脚本(可能是Process proc = rt.exec( new String [] {"C:\\cygwin\\bin\\bash.exe", "-c", "C:\\scripts\\login.exp"});,注意我插入的"-c",它使用了脚本顶部的神奇魔术。或者更好的是,只使用shebang:Process proc = rt.exec( new String [] {"C:\\scripts\\login.exp"});

127的退出值是一个特殊的退出值,并告诉您“未找到命令”。这是有道理的,因为您希望脚本包含许多没有系统二进制文件或shell内置函数的单词。