É possível escapar citações dentro de citações de escape dentro de citações de escape dentro de citações de escape?

4

Eu estou supondo que alguém vai me dizer que estou fazendo algo errado e estúpido e noobish, mas eu estou tentando escrever algo no método mais simples possível e usar comandos do sudo para fazer algo específico, então eu acho que estou fazendo a coisa certa (onde a melhor alternativa seria usar ansible).

Então, o que estou tentando fazer é executar um comando dentro de um ...

su - someuser -c "ssh someplace \"if ( ! grep <b>[WHAT DO I PUT HERE?]</b>some thing<b>[WHAT DO I PUT HERE]</b> /etc/somefile ); then doSomething; fi\""

São aquelas citações para a string grep que estão me confundindo, eu vou contorná-la procurando por algo sem espaços por enquanto, mas eu prefiro o grep para a coisa que eu quero fazer.

Então, se isso for impossível, por favor me avise.

    
por Peter Turner 17.07.2015 / 15:28

2 respostas

3

Fazer três citações não ajuda, você simplesmente desota, cita e desota novamente. Você também não precisa do subshell.

O que você realmente quer é:

su - someuser -c 'ssh someplace "if ! grep \"some thing\" /etc/somefile; then doSomething; fi"'

Esse tipo de abordagem pode se tornar pesado rapidamente - considere simplesmente colocar um script em seu servidor e executá-lo. Isso manteria você longe do inferno das citações.

    
por 17.07.2015 / 15:35
3

Você pode usar apenas um documento aqui.

su -someuser -c '<&1 >&2 ssh you@machine sh' 1<<\SCRIPT
    if   ! grep 'some spaces or whatever' /etc/somefile
    then : do something
    fi
#END
SCRIPT

A solução requer um pouco de malabarismo fd porque você precisará passar da senha inicial lida de su , e su não transmitirá nenhum descritor de arquivo acima de 2. Mas uma vez que você autenticou su , ssh não vai estragar com i / o e assim você pode fazer a reconsignação imediatamente e deixar seu shell invocado na outra ponta ler stdin.

    
por 17.07.2015 / 18:38