Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSch如何从一系列管道命令中检索结果_Java_Jsch - Fatal编程技术网

Java JSch如何从一系列管道命令中检索结果

Java JSch如何从一系列管道命令中检索结果,java,jsch,Java,Jsch,我的命令有一个第一部分,其结果通过管道传输到第二部分。当我运行代码时,我总是返回第一部分的结果,而第二部分应用的过滤器显然没有执行 所以我得到: CONTAINER ID IMAGE命令创建的状态端口名称 abcdeff a/b/1“usr/”。15分钟前最多2分钟。1.2 123abcd a/b/2“usr/。”32分钟前退出了某些内容。1.3 234456d a/b/3“usr/。”2天前退出了某些内容。1.4 我想去哪里 容器 abcdeff 123abcd 234456d 公共类测试

我的命令有一个第一部分,其结果通过管道传输到第二部分。当我运行代码时,我总是返回第一部分的结果,而第二部分应用的过滤器显然没有执行

所以我得到:

CONTAINER ID IMAGE命令创建的状态端口名称
abcdeff a/b/1“usr/”。15分钟前最多2分钟。1.2
123abcd a/b/2“usr/。”32分钟前退出了某些内容。1.3
234456d a/b/3“usr/。”2天前退出了某些内容。1.4
我想去哪里

容器
abcdeff
123abcd
234456d
公共类测试{
专用静态命令=
“echo \“password \”sudo-S bash-c \“docker容器ls--all | awk'{print$1}'”
executeExecCommand(命令){
JSch JSch=新的JSch();
Session Session=jschgetSession(用户名,ipaddress,22);
session.setConfig(“StrictHostKeyChecking”、“no”);
setConfif(“首选身份验证”、“密码”);
Channel=session.openChannel(“exec”);
((ChannelExec)channel).setCommand(COMMAND);
channel.setInputStream(空);
((ChannelExec)channel.setErrStream(System.err);
InputStream输入=channel.getInputStream();
InputStream错误=channel.getOutputStream();
channel.connect();
列表输出=新的ArrayList();
List errorOutput=new ArrayList();
try(InputStreamReader inputReader=新的InputStreamReader(输入);
BufferedReader BufferedReader=新的BufferedReader(inputReader);
InputStreamReader errorReader=新的InputStreamReader(错误)){
字符串行=null;
while(true){
而((line=bufferedReader.readLine()!=null){
输出。添加(行:
System.out.println(“line=“+line”);
等
等
}
}
}
这是否与在目标服务器上的不同shell中执行的管道化进程有关?
如果是这样,我如何实现返回过滤列表的目标?

我需要避开$.COMMAND=“echo\”password\“| sudo-S bash-c\”docker容器ls--所有| awk'{print\$1}'都有效

注意,如果我想进一步开发这个命令来删除容器,例如,我还需要转义backtick

COMMAND=“echo\”password\”| sudo-S bash-c\“docker容器rm`docker容器ls--all | awk'{print\$1}`”


它需要一个双反斜杠来转义$and backtick。这里显示为一个反斜杠

当您使用常规SSH终端客户端登录
ipaddress
时,您的命令是否可以正常工作?Hello@Martin。是的,我应该说,当我登录服务器并在命令行运行管道命令时,它确实可以工作。我可以应用多个管道并以增量方式过滤结果。您好@Martin我将管道命令放入目标服务器上名为cleanup.sh的脚本中/home/abcd,然后运行命令:“echo\”password\“| sudo-S bash-c\”/home/abcd/cleanup,sh\”;这是可行的。但我不想依赖任何远程服务器上现有的脚本。你能给我们展示一个仍然存在相同问题的最简单命令吗?@Martin:这是最简单的命令。(完整命令有3个管道)。这只是检索docker容器的详细信息列表,并打印出每个列表中的第一个参数
public class Test {

  private static COMMAND =
  "echo \"password\" | sudo -S bash -c \"docker container ls --all | awk '{print $1}'\""

  executeExecCommand(command){
    JSch jsch = new JSch();
    Session session=jschgetSession(username, ipaddress, 22);
    session.setConfig("StrictHostKeyChecking", "no");
    session.setConfif("PreferredAuthentications", "password");
    Channel channel = session.openChannel("exec");
    ((ChannelExec)channel).setCommand(COMMAND);
    channel.setInputStream(null);
    ((ChannelExec)channel).setErrStream(System.err);
    InputStream input = channel.getInputStream();
    InputStream error = channel.getExtInputStream();
    channel.connect();
    List<String> output = new ArrayList<>();
    List<String> errorOutput = new ArrayList<>();

    try (InputStreamReader inputReader = new InputStreamReader(input);
      BufferedReader bufferedReader = new BufferedReader(inputReader);
      InputStreamReader errorReader = new InputStreamReader(error)) {

       String line = null;
       while (true) {
         while ((line = bufferedReader.readLine() != null {
         output.add(line:
         System.out.println("line = " + line);

       etc
       etc
       }
     }
}