gpt4 book ai didi

linux - 将使用 ssh 远程执行的 grep 命令的输出存储到变量?

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:00 27 4
gpt4 key购买 nike

我正在尝试从 jenkins 机器上的远程服务器上运行一系列命令。这些命令执行以下操作

  1. 在远程服务器上创建目录
  2. 从远程服务器复制一些文件到那个目录

我已经创建了下面的脚本,

    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: output.txt: No such file or directory
Pseudo-terminal will not be allocated because stdin is not a terminal.

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

我已经尝试了很多选项,但如果这是正确的方法,我不会。谁能帮我解决这个问题?

最佳答案

在您的脚本扩展中 `grep version ...`由本地 shell 而不是远程 shell 执行。这同样适用于 /home/user/${version} 的扩展. my answer 中介绍了在此处文档中使用扩展的细节。至 the canonical question addressing problems of this kind .

您的脚本属于混合大小写“3. 一些扩展必须在子 shell 中执行,一些 - 在父 shell 中执行。”在其中讨论,并且必须按如下方式修复:

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 中脚本部分的缩进。此处文档,以便 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. 缩进用制表符而不是空格,并使用<<-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

关于linux - 将使用 ssh 远程执行的 grep 命令的输出存储到变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38019415/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com