ssh citação de execução de comando remoto

4

Eu encontrei esta solução que funciona para mim, mas eu não entendo como funciona, já que o comando sed inclui seu próprio parâmetro entre aspas simples, e todo o comando ssh também é passado entre aspas simples. Isso está sendo executado no OSX (bsd).

ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done'

Alguém pode me explicar por que isso funciona e por que eu não precisei escapar das aspas simples para o comando sed - não consigo encontrar uma referência em lugar algum? Obrigado.

    
por Santrix 17.04.2015 / 08:46

1 resposta

5

Você não faz isso porque o seu texto sed não precisa ser citado e, de fato, no servidor remoto, ele não é citado.

O que é passado como argumento para o seu comando ssh se parece com isto:

for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i s/^RS=paper_lantern$/RS=x3/ /var/cpanel/users/${user}; fi; done

E funciona bem porque não há espaços dentro do argumento do seu sed comando.

Se você quiser passar um argumento sed com espaços, você deve escapar suas aspas simples assim:

'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i '\''s/^RS=paper_lantern$/RS=x3/'\'' /var/cpanel/users/${user}; fi; done'

Com aspas simples, você não pode escapar de aspas simples assim: \'

Você tem que usar um truque. Você precisa fechar aspas, escapar do seu ' e reabrir aspas. ( '\'' )

    
por 17.04.2015 / 09:43

Tags