我正在尝试一种新的方法让我陷入困境。而不是使用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
答案 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内置函数的单词。