在运行Java程序时,如何在shell脚本中提供输入选择?

在运行Java程序时,如何在shell脚本中提供输入选择?,java,shell,unix,automation,Java,Shell,Unix,Automation,在我的Java程序中,我尝试做的是: 首先,我连接到Unix服务器并执行一个shell脚本。但在该shell脚本中,一旦选择了该选项,就必须选择该选项来执行不同的操作 例如: Please select from below menu options 1. Create directory and subdirectory 2. Copy files 3. Update paths 4. Press 9 to exit 在这里,每个选项执行不同的操作,并在选择任何选项时请求进一步输入。 例如:

在我的Java程序中,我尝试做的是:

首先,我连接到Unix服务器并执行一个shell脚本。但在该shell脚本中,一旦选择了该选项,就必须选择该选项来执行不同的操作

例如:

Please select from below menu options
1. Create directory and subdirectory
2. Copy files
3. Update paths
4. Press 9 to exit
在这里,每个选项执行不同的操作,并在选择任何选项时请求进一步输入。 例如:如果我选择选项1,它将询问路径:

Please enter the path where you want to create a directory
现在我的问题是:从Java代码运行这个shell脚本时,如何输入这个输入

下面编写的代码用于连接到unix服务器并执行shell脚本:

JSch jsch = new JSch();

String command = "/tmp/myscript.sh";
Session session = jsch.getSession(user, host, 22);
session.connect();

Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);

channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
channel.connect();

byte[] tmp = new byte[1024];
while (true) {
  while (in.available() > 0) {
      int i = in.read(tmp, 0, 1024);
      if (i < 0) {
          break;
      }
      System.out.print(new String(tmp, 0, i));
  }
  if (channel.isClosed()) {
      if (channel.getExitStatus() == 0) {
          System.out.println("Command executed successully.");
      }
      break;
  }
}
channel.disconnect();
session.disconnect();

您可能可以在shell脚本中打印到/dev/tty并从/dev/tty读取。像这样包装/tmp/myscript.sh:


假设我们要创建目录和子目录,然后退出。 频道准备就绪后,我们必须:

发送创建命令1 发送路径/路径/到/目录 发送退出命令9 JSch JSch=新的JSch; String命令=/tmp/myscript.sh; Session=jsch.getSessionuser,主机,22; session.setConfigStrictHostKeyChecking,否; session.setPasswordpasswd; session.connect; ChannelExec channel=ChannelExec session.openChannelexec; channel.setCommandcommand; channel.setInputStreamnull; channel.setErrStreamSystem.err; InputStream=channel.getInputStream; //我们将通过此流发送命令 OutputStream os=channel.getOutputStream; channel.connect; int步长=1; 字节[]tmp=新字节[1024]; int-read; 虽然是真的{ //等待可用数据 whileis.available==0{ 线程100; } //读取脚本/命令输出 whileis.available>0{ read=is.readtmp; 如果读取<0{ 打破 } System.out.printnew Stringtmp,0,读取; } //根据当前步骤发送命令 开关站{ 案例1: //1.创建目录命令 os.write1\n.getBytes; os.flush; 打破 案例2: //2.创建的路径 os.write/path/to/directory\n.getBytes; os.flush; 打破 案例3: //3.退出命令 os.write9\n.getBytes; os.flush; 打破 } step++; 如果频道是关闭的{ 如果channel.getExitStatus==0{ 成功执行System.out.PrintLn命令。; } 打破 } } 通道断开; session.disconnect;
最后\n和对os.flush的调用对于每个命令都是必需的。

您好,这里有人能帮忙吗?您想如何获取输入?GUI?您的程序中有自定义的内容吗?你的节目怎么样?在最后一种情况下,您可以尝试channel.setInputStreamSystem.In;。为什么要从频道的输入流中读取而不是写入?顺便说一句,如果您不依赖myscript.sh,而是执行字符串[]{bash,-c,read-p'needinput:'input;echo\got input:$input\}之类的命令会更好-这样,您的代码就不需要它不包含的依赖项。很可能您不能,使用shell select创建一个交互式shell并保留stdin,而您仍然在尝试用java粘合,为什么?哈哈
#!/bin/bash
(
ORIGINAL_CODE_HERE
) < /dev/tty > /dev/tty