원격 연결을 통해 주석 문자를 삽입하기 위해 sed #을 삽입하십시오. 나는 이것을 사용하여

여러 줄로 된 파일의 어디에서나 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 expression # 1, char 8 : missing command

인용에 문제가 있거나 하나 이상의 슬래시를 이스케이프해야한다고 생각합니다. 나는 많은 것을 시도했지만 항상 위의 동일한 오류가 발생하는 것 같습니다.



답변

인용 문제. 이것이 일어나는 일입니다.

"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/“quoteless” cd호출 이 중단 됩니다.
  • &&보장 sed경우에만 실행됩니다 cd(나는 그것이 작동 확실하지 않다 성공 eksh, 그것은 비록 많은 쉘에서 작동 그것이 무엇이든). 어떤 이유로 든 cd실패하면 sed시작 디렉토리에서 작동하지 않습니다. 다시 이것은 아마도 당신에게 결코 영향을 미치지 않을 것이지만 여전히 좋은 습관입니다.