sed para inserir um caractere de comentário em uma conexão remota

0

Eu quero pesquisar um arquivo para a ocorrência da palavra Logmon em qualquer lugar em um arquivo multi-alinhado. Para cada linha em que uma correspondência é encontrada, insira um # no início da linha. Eu sou capaz de fazer isso usando:

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

O objetivo acima é o meu objetivo, no entanto, estou tendo problemas para fazer isso em uma lista de servidores remotos. Abaixo está o que eu tenho até agora.

#!/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

O acima retorna o seguinte erro: sed: -e expressão # 1, char 8: comando ausente

Eu suspeito que o problema seja com minhas citações ou eu precise escapar de uma ou mais das barras. Eu tentei várias coisas e sempre pareço ter o mesmo erro acima.

    
por jackcsprat 19.05.2018 / 06:01

1 resposta

1

Um problema de citação. Isso é o que acontece:

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

Por causa disso, sshd no lado remoto é executado:

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

eksh fica:

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

então agora a expressão # 1 para sed é apenas /Logmon/ . Para corrigir isso, você deve evitar as aspas duplas que devem chegar ao lado remoto, assim:

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

Existem algumas melhorias extras:

  • Também cito $DEST para garantir que você receba cd "<local value of $DEST>" no lado remoto, em vez de cd <local value of $DEST> . Isso não faz diferença no seu caso particular agora, quando o valor é /usr/local/nrdp/clients/nrds/ ; mas se você alterou esse caminho para, por exemplo, /foo/bar baz/ , então, ele quebraria sua invocação "% de coquetel" cd .
  • && garante que sed seja executado apenas se cd for bem-sucedido (não sei se funciona em eksh , o que quer que seja; no entanto, ele funciona em muitos shells). Se por algum motivo cd falhar, sed não atuará no diretório inicial. Novamente, isso provavelmente nunca vai bater em você, ainda é uma boa prática geral.
por 19.05.2018 / 08:38

Tags