【发布时间】:2014-06-18 21:29:21
【问题描述】:
我正在编写一个脚本来匹配本地值和远程值。到目前为止,我的代码可以正常运行,看起来像这样:
#!bin/bash
MY_ARRAY=('value1' 'value2' 'value3' 'wrongValue)
for VALUE in "${MY_ARRAY[@]}"
do
if [[ $VALUE =~ ^v ]] ; then
echo "$VALUE : $(ssh admin@machine matching_function $VALUE)" >> output.file
else
echo "$VALUE : this is a wrong value" >> output.file
fi
done
唯一的问题是,对于循环的每次迭代,它都会创建并关闭一个新的 ssh 连接。由于我原来的数据集比较大,执行起来需要很长时间。
我正在寻找一种优化方法,并阅读了有关使用 ssh admin@machine <<EOF 将多行命令传递给 ssh 并修改了我的代码:
MY_ARRAY=('value1' 'value2' 'value3' 'wrongValue)
ssh admin@machine << EOF
for VALUE in "${MY_ARRAY[@]}"
do
if [[ $VALUE =~ ^v ]] ; then
echo "$VALUE : $(matching_function $VALUE)" >> output.file
else
echo "$VALUE : this is a wrong value" >> output.file
fi
done
EOF
但是,它不起作用,我收到了几个错误:
Pseudo-terminal will not be allocated because stdin is not a terminal.。我怀疑这部分是由于我的远程 shell 受到限制,并且与echo冲突。-
$MY_ARRAY 似乎在远程机器上未定位:
-rbash: line 5: conditional binary operator expected -rbash: line 5: syntax error near unexpected token '^v' -rbash: line 5: ' if [[ =~ ^v ]] ; then'
我也不确定 bash 将如何区分 $VALUE(应该从我的本地计算机解释)和 matching_function(应该从远程计算机解释)
【问题讨论】:
-
请在您的问题中包含“它不起作用”的证据。是否有任何错误信息,请也包括这些信息。否则你走在正确的轨道上。
<< HEREDOCS内的 var sub 是标准的,而不会尝试在本地空间中执行该代码,因此您的macthing_function应该远程执行。 -
@shellter 我扩展了我的示例以指出我现在遇到的 2 个不同的错误
-
进行小测试,让您了解
ssh x@y.com '/bin/ls -l $VAL'与ssh x@y.com "/bin/ls -ls $VAL"之间的区别。然后将match_func添加到组合中。任何在"..."中工作的东西都将在<<HEREDOC中工作,除非你调用像<<'HEREDOC'这样的“硬”引用,这给你与..com '/bin/ls -l $VAL'相同的行为。祝你好运。 -
@shellter 感谢您的提示。我已经使用了 ssh 引号,但在执行以下操作时仍然遇到问题:
ssh x@y "VAL=\$(match_func arg1)。我不能将结果归因于局部变量,而是创建一个远程变量并将函数的结果分配给它(我尝试了其他语法来尝试获取此结果,但无济于事) -
那么您从
ssh x@y "VAL=\$(match_func arg1); echo \${VAL}"得到任何结果吗?更重要的是,再次回到小步骤的想法,当您执行ssh x@y "match_func StringArg"时会发生什么?祝你好运!