リモートsedがファイルを変更できませんでした。

リモートsedがファイルを変更できませんでした。

古い文字列と新しい文字列を定義する次のスクリプトがあります。リモート接続を介してsedを使用して、古いものを新しいものと交換したいと思います。 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' の不明なオプション

ベストアンサー1

このコードはいくつかの場所で精密検査が必要です。

  • $OLD$NEWバックスラッシュがダウンストリームとして使用される場合、環境変数nの初期化は二重エスケープを防ぐためにエスケープを使用しません。
  • sed 代替コマンドの LHS を安全に挿入できるように、$OLD var をエスケープしてください。
  • 同様に、代替コマンドのRHSに対して$ NEW varをエスケープします。
  • 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

おすすめ記事