awk通过plink和多个服务器跃点没有响应

问题描述

为什么awk无法回复文字?我知道我在正确的服务器上(将awk命令/ Object更改为ls -la会返回显示正确信息的文本)。而且我知道awk命令在直接在服务器上运行时可以工作-我可以复制粘贴该命令,它将运行

def tailLogs(Object object){
    def cmd = jumperBox() + " " + object
    Runtime rt = Runtime.getRuntime()
    log.info("Running: "+cmd)
    Process process = rt.exec(cmd.toString())
    StringBuilder cmdReturn = new StringBuilder()
    try{
        InputStream inputStream = process.getInputStream()
        int c
        while ((c = inputStream.read()) != -1) {
            cmdReturn.append((char) c)
        }
        log.info("CMD RESPONSE: "+ cmdReturn)
        process.waitFor()
    }catch(Exception e){
        log.warn(e.getMessage())
    }finally{
        process.destroy()

    }

日志:

2020-08-27 09:21:56.359 INFO  server@R_17_4045@ion  -Running: plink.exe -batch -ssh user@server1 -i C:\privateKey.ppk ssh user2@server2 -i ~/.ssh/id_rsa awk '$0 >= "2020-08-27 09:06:56,236" && $0 <= "2020-08-27 09:21:56,238"' logfile
2020-08-27 09:21:59.119 INFO  server@R_17_4045@ion  -CMD RESPONSE: 
2020-08-27 09:21:59.147 INFO  logTester  -2

我查看了以下链接,它们仅提供了帮助,使用流程生成器意味着重写了我不想做的其他功能(我尝试了但失败了,我不知道如何发送多个命令(例如服务器使用-i选项跳。)在看到ls -la输出后,我对这种解决方案非常满意:(

No response when running AWK shell script using java

https://superuser.com/questions/950560/escaping-awk-with-remote-ssh-command-and-bash-that-is-already-escaped

Run a remote awk command using ssh

我使用流程生成器将上面的代码更新为以下代码,但是现在我在日志中得到-255 :(您可以快速了解为什么我不想走这条路线:(

    def getLogs(String serverConnection,String serverKey,String fileName){
        if(osName.contains('windows')){
            ProcessBuilder pb = new ProcessBuilder(ssh(),//this Could be plink or straight ssh
                    "-batch","-ssh","user@server1","-i",server1key(),//changes depending on server
                    "ssh",serverConnection,serverKey,"awk","'\$0 >= \"${startTime.format(DateTimeFormatter.ofPattern(pattern))}\" && \$0 <= \"${endTime.format(DateTimeFormatter.ofPattern(pattern))}\"'",fileName
            )
            log.info "running: "+pb.toString() //didnt show me
            pb.redirectErrorStream()
            Process process = pb.start()
            StringBuilder cmdReturn = new StringBuilder()
            try{
                InputStream inputStream = process.getInputStream()
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))
                int c
                while ((c = reader.read()) != -1) {
                    cmdReturn.append((char) c)
                }
                log.info("CMD RESPONSE: "+ cmdReturn)
                process.waitFor()
            }catch(Exception e){
                log.warn(e.getMessage())
            }finally{
                process.destroy()
            }
        }else{
            ProcessBuilder pb = new ProcessBuilder("ssh","ssh",fileName
            )
            pb.redirectErrorStream()
            Process process = pb.start()
            StringBuilder cmdReturn = new StringBuilder()
            try{
                InputStream inputStream = process.getInputStream()
                int c
                while ((c = inputStream.read()) != -1) {
                    cmdReturn.append((char) c)
                }
                log.info("CMD RESPONSE: "+ cmdReturn)
                process.waitFor()
            }catch(Exception e){
                log.warn(e.getMessage())
            }finally{
                process.destroy()
            }
        }

    }

与此相关的日志没有太大不同:

2020-09-02 16:50:54.520 INFO  server@R_17_4045@ion  -running: java.lang.ProcessBuilder@1c691f9f
2020-09-02 16:50:57.335 INFO  server@R_17_4045@ion  -CMD RESPONSE: 
2020-09-02 16:50:57.346 INFO  logTester  -255

根据How do I run multiple commands in SSH through Java?,我建立流程的方式是正确的吗?

解决方法

因此,在尝试使用Java \ groovy代码进行许多不同的变化之后,我求助于制作一个bash文件:

#!/bin/bash

while getopts ?s:e:c:k:f: flag
do
    case "${flag}" in
        s) startTime=${OPTARG};;
        e) endTime=${OPTARG};;
        c) serverConnection=${OPTARG};;
        k) serverKey=${OPTARG};;
        f) fileName=${OPTARG};;
        \?)echo "This will not work without all options below:
                -s startTime format: 2020-08-27 09:06:56,236
                -e endTime format: 2020-08-27 09:16:56,236
                -c server connection eg: user@server
                -k id_rsa file
                -f logfile eg: APPLICATION/logs/log.file"
        exit;;
    esac
done


ssh $serverConnection -i $serverKey "awk '\$0 >= \"$startTime\" && \$0 <= \"$endTime\"' $fileName"

我在PB中通过这种方式称呼它

pb.command(ssh(),//dbl check the environment we are in
        "-batch","-ssh","user@server","-i",jumperKey(),//again to dbl check the environment we are in
        "./awk.sh","-s",startTime.format(DateTimeFormatter.ofPattern(pattern)).replaceAll(/ /,'\\\\ '),"-e",endTime.format(DateTimeFormatter.ofPattern(pattern)).replaceAll(/ /,"-c",serverConnection,"-k",serverKey,"-f",fileName
)

老实说,对拥有bash文件不满意,但对tempus fugit满意