ssh command com aspas

7

Eu tenho um erro estranho que não consegui encontrar nada sobre isso. Eu queria mudar o comentário do usuário com o seguinte comando.

$ sudo usermod -c "New Comment" user

Isso funcionará enquanto estiver conectado a um servidor, mas eu quero automatizá-lo em mais de 20 servidores. Normalmente eu sou capaz de usar uma lista e fazer um loop através dos servidores e executar um comando, mas neste caso eu recebo um erro.

$ for i in 'cat servlist' ; do echo $i ; ssh $i sudo usermod -c "New Comment" user ; done 
serv1
Usage: usermod [options] LOGIN

Options:
lists usermod options

serv2
Usage: usermod [options] LOGIN

Options:
lists usermod options
.
.
.

Quando executo esse loop, ele gera um erro, como se eu estivesse usando o comando incorretamente, mas ele funcionará bem em um único servidor.

Olhando pelas páginas de manual do ssh, tentei -t e -t -t flags, mas essas não funcionaram.

Eu usei com sucesso o perl -p -i -e em um loop semelhante para editar arquivos.

Alguém sabe uma razão pela qual não consigo fazer o loop?

    
por SpruceTips 25.06.2015 / 19:54

2 respostas

5
for i in 'cat servlist';do echo $i;ssh $i 'sudo usermod -c "New Comment" user';done

ou

for i in 'cat servlist';do echo $i;ssh $i "sudo usermod -c \"New Comment\" user";done
    
por 25.06.2015 / 20:31
9

O SSH executa o comando remoto em um shell. Ele passa uma string para o shell remoto, não uma lista de argumentos. Os argumentos que você passa para os comandos ssh são concatenados com espaços entre eles. Os argumentos para ssh são sudo , usermod , -c , New Comment e user , portanto, o shell remoto vê o comando

sudo usermod -c New Comment user

usermod parses Comment como o nome do usuário e user como um parâmetro extra espúrio.

Você precisa passar as aspas ao shell remoto para que o comentário seja tratado como uma string. A maneira mais simples é colocar o comando remoto inteiro entre aspas simples. Se você precisar de uma única citação nesse comando, use '\'' .

ssh "$i" 'sudo usermod -c "Jack O'\''Brian" user'

Em vez de chamar ssh em um loop e ignorar erros, use uma ferramenta projetada para executar comandos em vários servidores, como pssh, mussh, clusterssh, etc. Consulte Executa automaticamente comandos via SSH em muitos servidores

    
por 26.06.2015 / 03:25