远程sed更改文件失败

千斤顶

我有以下脚本定义了OLD和NEW字符串。我想通过远程连接使用sed将OLD替换为NEW。除sed以外的所有命令似乎都可以使用。我试图调整标点符号并使用管道而不是sed而不使用正斜杠,但无济于事。从命令提示符处执行sed命令是有效的,但在脚本中则行不通。我对此表示感谢。

#!/bin/ksh

OLD="command\[Check_Memory_OS_10038\]=/opt/tools/nagitem/libexec/check_mem.pl -w 80,10 -c 90,25";export OLD
NEW="command\[Check_Memory_OS_10038\]=/opt/tools/nagitem/libexec/check_mem_ng.sh -w 80 -c 90";export NEW
DEST1="/opt/tools/nagitem/libexec/"
DEST2="/opt/tools/nagitem/nrdp/clients/nrds/"

for x in `cat /home/joe/nagios/hostlist`
do
SSH_STATUS=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $USER@$x "pwd" >/dev/null)
  if [[ $? = "0" ]];then
    scp -p /home/joe/nagios/check_mem_ng.sh $x:/tmp
    ssh -o "StrictHostKeyChecking no" $x "sudo /usr/localcw/bin/eksh -c '/bin/cp /tmp/check_mem_ng.sh $DEST1;chown nagitem:nagitem $DEST1/check_mem_ng.sh;cd $DEST2; /bin/sed -i -e 's/'$OLD'/'$NEW'/g' /opt/tools/nagitem/nrdp/clients/nrds/nrds.cfg '"
else
   echo "Cannot connect to $x" >> badhosts
fi
done

收到的错误是:/ bin / sed:-e表达式#1,字符39:`s'的未知选项

guest_7

您的这段代码需要在几个地方进行大修。

  • 环境的初始化瓦尔$OLDñ $NEW,因为他们得到的反斜杠编下游,以免他们被双逃到使用没有逃脱。
  • 转义$ OLD var,以便它可以安全地插入sed替代命令的LHS中。
  • 类似地,转义$ NEW var以用于替代命令的RHS。
  • sed命令在双引号的总括下使用单引号内的单引号,因此,在转义它们时要格外小心,也要在新或旧var值内转义任何单引号。
#!/bin/ksh

OLD="command[Check_Memory_OS_10038]=/opt/tools/nagitem/libexec/check_mem.pl -w 80,10 -c 90,25";export OLD
NEW="command[Check_Memory_OS_10038]=/opt/tools/nagitem/libexec/check_mem_ng.sh -w 80 -c 90";export NEW
DEST1="/opt/tools/nagitem/libexec/"
DEST2="/opt/tools/nagitem/nrdp/clients/nrds/"

#--------------------
# escape variables
eOLD=$(printf '%s\n' "$OLD" | sed -e 's:[][\/^$.*]:\\&:g' -e "s:':&\\&&:g")
eNEW=$(printf '%s\n' "$NEW" | sed -e 's:[\/&]:\\&:g' -e "s:':&\\&&:g")
#--------------------

for x in `cat /home/joe/nagios/hostlist`
do
SSH_STATUS=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $USER@$x "pwd" >/dev/null)
  if [[ $? = "0" ]];then
    scp -p /home/joe/nagios/check_mem_ng.sh $x:/tmp
    ssh -o "StrictHostKeyChecking no" $x "sudo /usr/localcw/bin/eksh -c '/bin/cp /tmp/check_mem_ng.sh $DEST1;chown nagitem:nagitem $DEST1/check_mem_ng.sh;cd $DEST2; /bin/sed -i -e '\\''s/$eOLD/$eNEW/g'\\'' /opt/tools/nagitem/nrdp/clients/nrds/nrds.cfg'"
else
   echo "Cannot connect to $x" >> badhosts
fi
done

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章