我正在尝试从jenkins机器上运行远程服务器上的一系列命令。 这些命令在下面填写
我创建了以下脚本,
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输出分配给版本变量失败。
我尝试了很多选项,如果这是正确的方法,我不会。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
在您的脚本中,`grep version ...`
的扩展由本地shell而不是远程shell执行。这同样适用于/home/user/${version}
的扩展。在my answer到the 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
的结束标记 - 文献。有两种方法可以保留缩进:
缩进除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
这看起来有些难看。
使用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