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