如何处理引号,反引号特殊字符以在远程服务器中运行linux bash shell命令

时间:2019-06-10 08:05:48

标签: linux bash shell ansible sh

有人,请帮助我纠正下面的命令,我浪费了一天多的时间来修复下面的命令,但是失败了,请帮助,我将在下面的ansible shell模块中使用该命令。

 ssh -o ConnectTimeout=5 splunk@10.145.32.172 '
     sdline="`
           grep -n TA-aws-hf-{{client_code}}-{{env_name}} /opt/splunk/etc/system/local/serverclass.conf
          | awk -F \":\" \'{print $1}\'
         ` 
         && sed -ie \"$sdline,`
              echo $sdline + 3 
              | bc
         `d\"  /opt/splunk/etc/system/local/serverclass.conf
     " 
> ^C

甚至尝试过以下方式:

ssh -o ConnectTimeout=5 splunk@10.145.32.172 exec sdline=`grep -n TA-aws-hf-{{client_code}}-{{env_name}} /opt/splunk/etc/system/local/serverclass.conf|awk -F ":" '{print $1}'` && sed -ie "$sdline,`echo $sdline + 3|bc` d"  /opt/splunk/etc/system/local/serverclass.conf
grep: /opt/splunk/etc/system/local/serverclass.conf: No such file or directory
bash: line 0: exec: sdline=: not found

2 个答案:

答案 0 :(得分:2)

上下文:看来这个问题起源于XY Problem。 OP似乎想删除3行,包括字符串“ TA-aws-hf-{{client_code}}-{{env_name}}”之后。


不推荐使用反引号;必要时使用$(modern $(command) substitution)。在这种情况下没有必要。

如果您的远程服务器具有GNU sed:

ssh splunk@10.145.32.172 'sed -i "/TA-aws-hf-{{client_code}}-{{env_name}}/,+2d" /opt/splunk/etc/system/local/serverclass.conf' 

如果这样可以给您sed: -e expression #1, char 19: unexpected ','

ssh splunk@10.145.32.172 '
  cd /opt/splunk/etc/system/local
  awk "/TA-aws-hf-{{client_code}}-{{/ {i=-3} i++>0" \
    serverclass.conf > temp && mv $_ serverclass.conf
'

答案 1 :(得分:2)

您的远程命令非常复杂。

我建议以下内容:

  1. 使用ssh10.145.32.172中获得交互式外壳
  2. 10.145.32.172上创建一个完成所有工作的脚本,并对其进行硬编码。

  3. 将命令行参数重构为脚本。

  4. 从本地计算机远程调用脚本。

此策略简化了脚本及其维护。仅允许您发送重要参数。

如果必须在许多远程计算机上部署脚本。使用共享存储资源,例如NFS。 (可选)在运行脚本之前使用scp复制脚本。