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
}
}
}