여러 줄로 된 파일의 어디에서나 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시작 디렉토리에서 작동하지 않습니다. 다시 이것은 아마도 당신에게 결코 영향을 미치지 않을 것이지만 여전히 좋은 습관입니다.