comando ssh com aspas


11

Tenho um erro estranho que não consegui encontrar nada sobre isso. Eu queria alterar 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, sou capaz de usar uma lista e fazer um loop nos servidores e executar um comando, mas, neste caso, 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 lança um erro como se estivesse usando o comando incorretamente, mas ele funcionará perfeitamente em um único servidor.

Olhando através das páginas man ssh eu tentei -te -t -tbandeiras mas aqueles não funcionou.

Eu usei com sucesso perl -p -i -edentro de um loop semelhante para editar arquivos.

Alguém sabe um motivo pelo qual não consigo fazer um loop?

Respostas:


6
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

14

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 sshcomandos são concatenados com espaços no meio. Os argumentos para sshsão sudo, usermod, -c, New Commente user, assim que o shell remoto vê o comando

sudo usermod -c New Comment user

usermodanalisa Commentcomo o nome do usuário e usercomo um parâmetro extra falso.

Você precisa passar as aspas para o shell remoto para que o comentário seja tratado como uma sequência. A maneira mais simples é colocar todo o comando remoto entre aspas simples. Se você precisar de uma aspas simples nesse comando, use '\''.

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.