
古い文字列と新しい文字列を定義する次のスクリプトがあります。リモート接続を介して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
答え2
ekshパラメータは一重引用符で囲みます'
。一重引用符内では特殊文字を拡張できません。したがって、$DEST
変数と他の変数は拡張されず、奇妙な残差が残ります。