使用expect4j执行命令

时间:2014-11-27 08:13:25

标签: java tcl expect

我使用此Code Example来执行Tcl shell中的命令。

如果查看页面中的main函数,执行命令的方法是:

 SSHClient ssh = new SSHClient("linux_host", "root", "password");
 List<String> cmdsToExecute = new ArrayList<String>();
 cmdsToExecute.add("ls");
 cmdsToExecute.add("pwd");
 cmdsToExecute.add("mkdir testdir");
 String outputLog = ssh.execute(cmdsToExecute);

在我的节目中我正在做:

 SSHClient ssh = new SSHClient("linux_host", "root", "password");
 List<String> cmdsToExecute = new ArrayList<String>();
 cmdsToExecute.add("bpsh"); // open Tcl Shell
 cmdsToExecute.add("set bps [bps::connect ... ]"); // Tcl shell commands
 String outputLog = ssh.execute(cmdsToExecute);

现在问题是我无法退出Tcl Shell而无法从arrayList执行命令 这意味着如果我运行此代码:

 SSHClient ssh = new SSHClient("linux_host", "root", "password");
 List<String> cmdsToExecute = new ArrayList<String>();
 cmdsToExecute.add("bpsh"); // open Tcl Shell
 cmdsToExecute.add("set bps [bps::connect ... ]"); // Tcl shell commands
 String outputLog = ssh.execute(cmdsToExecute);
 cmdsToExecute.clear();
 cmdsToExecute.add("set sf [$bps createSuperflow ... ]"); 
 String outputLog = ssh.execute(cmdsToExecute);

我得到的是在远程机器上第一次执行后退出第一个tcl shell并返回到原始shell,在第二次执行时它尝试运行:
 &#34;设置sf [$ bps createSuperflow ...&#34;在原始的壳中。
我假设因为这条线:
  cmdsToExecute.add(&#34; BPSH&#34);
不存在。

我使用的expect4j的代码在上面的链接中,有人可以告诉我需要修改的内容,以便我可以使用ssh.execute()执行许多命令而不退出Tcl shell吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用命令列表构建文件并将其获取。

像...一样的东西。

cmdsToExecute.add("echo \"\" > tmpcmd.txt");
cmdsToExecute.add("echo \"set bps [bps::connect ... ]\" >> tmpcmd.txt");
cmdsToExecute.add("echo \"set sf [$bps createSuperflow ... ]\" >> tmpcmd.txt");
cmdsToExecute.add("bpsh");
cmdsToExecute.add("source tmpcmd.txt");