使用ssh将grep命令的输出存储到变量?

时间:2016-06-24 17:54:12

标签: linux bash shell ssh grep

我正在尝试从jenkins机器上运行远程服务器上的一系列命令。 这些命令在下面填写

  1. 在远程服务器上创建目录
  2. 将一些文件从远程服务器复制到该目录
  3. 我创建了以下脚本,

    q.options={fields:['active^0.5']}

    脚本失败并出现以下错误,

        servername=<remote server ip>
    
        sshuserconnect() {
            echo `/usr/bin/sshpass -p passwd ssh -o ConnectTimeout=5 -o UserKnownHostsFile=knownhosts -o StrictHostKeyChecking=no $*`
        }
    
    sshuserconnect user@$servername << ENDOFSSH
    
        sqlplus -s /nolog << EOF > /home/user/output.txt
        connect user/pwd@$servername:<port>/<DB schema>
        select column1||','||value from table where column1 like 'param1';
        EOF
    
        version=`grep version /home/user/output.txt | cut -f 2 -d ","`
        mkdir /home/user/${version}
    
    ENDOFSSH
    

    经过一些调试后,我发现该脚本仅对grep命令失败。将grep输出分配给版本变量失败。

    我尝试了很多选项,如果这是正确的方法,我不会。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

在您的脚本中,`grep version ...`的扩展由本地shell而不是远程shell执行。这同样适用于/home/user/${version}的扩展。在my answerthe canonical question addressing problems of this kind中介绍了在here-documents中使用扩展的细微之处。

您的脚本属于混合大小写&#34; 3。必须在子shell中执行一些扩展,有些扩展在父级中。&#34;其中讨论,必须修改如下:

sshuserconnect user@$servername <<ENDOFSSH

sqlplus -s /nolog <<EOF > /home/user/output.txt
connect user/pwd@$servername:<port>/<DB schema>
select column1||','||value from table where column1 like 'param1';
EOF

version=\$(grep version /home/user/output.txt | cut -f 2 -d ",")
mkdir /home/user/\${version}

ENDOFSSH

请注意,我有意删除了<<ENDOFSSH here-document中脚本部分的缩进,以便EOF被正确识别为嵌套<<EOF的结束标记 - 文献。有两种方法可以保留缩进:

  1. 缩进除EOF结束标记之外的所有内容:

    sshuserconnect user@$servername <<ENDOFSSH
    
        sqlplus -s /nolog <<EOF > /home/user/output.txt
        connect user/pwd@$servername:<port>/<DB schema>
        select column1||','||value from table where column1 like 'param1';
    EOF
    
        version=\$(grep version /home/user/output.txt | cut -f 2 -d ",")
        mkdir /home/user/\${version}
    
    ENDOFSSH
    

    这看起来有些难看。

  2. 使用TAB缩进而不是空格,并使用<<-ENDOFSSH代替<<ENDOFSSH,这会导致删除此文档中的前导标签字符。在下面的代码中,我有目的地使用<TAB>标记了制表符,这两者都是为了显式,因为StackOverflow使用空格呈现制表符,这意味着复制和粘贴代码将无法正常工作:

    sshuserconnect user@$servername <<-ENDOFSSH
    
    <TAB>sqlplus -s /nolog <<EOF > /home/user/output.txt
    <TAB>connect user/pwd@$servername:<port>/<DB schema>
    <TAB>select column1||','||value from table where column1 like 'param1';
    <TAB>EOF
    
    <TAB>version=\$(grep version /home/user/output.txt | cut -f 2 -d ",")
    <TAB>mkdir /home/user/\${version}
    
    ENDOFSSH