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?

SpruceTips
fonte

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
Mel
fonte
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

Gilles 'SO- parar de ser mau'
fonte