Я хочу найти файл для вхождения слова Logmon в любом месте многострочного файла. Для каждой строки, где найдено совпадение, вставьте # в начале строки. Я могу сделать это с помощью:

sed -i '/Logmon/ s/^/#/' nrds.cfg

Вышеприведенное выполняет мою задачу, однако у меня возникают проблемы с этим для списка удаленных серверов. Ниже то, что я имею до сих пор.

#!/bin/ksh

DEST="/usr/local/nrdp/clients/nrds/"

for x in `cat /home/jack/hostlist`
do
SSH_STATUS=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $USER@$x "pwd" >/dev/null)
if [[ $? = "0" ]];then
ssh -o "StrictHostKeyChecking no" $x "sudo /usr/localcw/bin/eksh -c 'cd $DEST; sed -i "/Logmon/ s/^/#/" nrds.cfg'"
else
echo "Cannot connect to $x" >> badhosts
fi
done

Выше выдает следующую ошибку: sed: -e выражение # 1, char 8: пропущенная команда

Я подозреваю, что проблема либо в моей цитате, либо мне нужно избежать одной или нескольких косых черт. Я пробовал множество вещей и всегда, кажется, получаю ту же ошибку выше.

1 ответ1

1

Проблема с цитированием. Вот что происходит:

"sudo /usr/localcw/bin/eksh -c 'cd $DEST; sed -i "/Logmon/ s/^/#/" nrds.cfg'"
^ double quoting starts                 ends here^    starts anew^      ends^

Из-за этого sshd на удаленной стороне работает:

sudo /usr/localcw/bin/eksh -c 'cd $DEST; sed -i /Logmon/ s/^/#/ nrds.cfg'

eksh получает:

cd $DEST; sed -i /Logmon/ s/^/#/ nrds.cfg

так что теперь выражение # 1 для sed - это просто /Logmon/ . Чтобы это исправить, вы должны избегать двойных кавычек, которые должны попасть на удаленную сторону, например так:

"sudo /usr/localcw/bin/eksh -c 'cd \"$DEST\" && sed -i \"/Logmon/ s/^/#/\" nrds.cfg'"

Есть несколько дополнительных улучшений:

  • Я также цитирую $DEST чтобы убедиться, что вы получаете cd "<local value of $DEST>" на удаленной стороне вместо cd <local value of $DEST> . Это не имеет значения в вашем конкретном случае сейчас, когда значением является /usr/local/nrdp/clients/nrds/ ; но если вы измените этот путь, например, на /foo/bar baz/ то он прервет ваш "без кавычек" вызов cd .
  • && гарантирует, что sed запускается только в случае успеха cd (я не уверен, что он работает в eksh , каким бы он ни был; хотя он работает во многих оболочках). Если по какой-то причине произойдет сбой cd sed не будет действовать в вашем начальном каталоге. Опять же, это, вероятно, никогда не поразит вас, но все же это хорошая общая практика.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .