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
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?
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