Executa comandos remotos usando variáveis em um loop for

1

Eu tenho uma lista de cerca de 100 servidores aos quais preciso adicionar um usuário. Eu tenho uma chave ssh-rsa Eu também preciso adicionar ao arquivo de chaves autorizadas. Estou tentando realizar isso usando um loop for, mas não estou chegando a lugar nenhum.

Eu uso um alias para SSH para bastion (conectar), e posso conectar-me ao servidor, mas ele pára no prompt, então ele não continuará até que eu digite exit no prompt. Mesmo assim, acho que na verdade está apenas executando os comandos localmente, em vez de remotamente.

Não consigo usar ferramentas de terceiros, por isso preciso usar o que está disponível em uma instalação padrão.

#!/bin/bash

connect='ssh user@bastionserver -t --'
adduser='adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q'
mkdir='mkdir /home/foobar/.ssh'
chmod='chmod -R 700 /home/foobar/.ssh/'
chown='chown -R soc /home/foobar/'

for server in $(cat server_list.txt)
do
    $connect root@"$server"
    echo "$adduser"
    echo "$mkdir"
    echo "$chmod"
    echo "$chown"
done

Eu não consigo entender isso! Qualquer ajuda apreciada.

    
por Moif Murphy 05.06.2018 / 16:16

1 resposta

2

O comando ssh pode receber um comando para ser executado no servidor remoto. Quando não é dado nenhum comando para executar, ele inicia um shell interativo. Use ssh para executar os comandos que você gostaria de executar. Por exemplo:

#!/bin/sh

while read server; do
    ssh "user@$server" sh -c '
        adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q
        mkdir /home/foobar/.ssh
        chmod -R 700 /home/foobar/.ssh/
        chown -R soc /home/foobar/'
done <server_list.txt

Este é obviamente um código não testado. Para poder executar mais de um comando, iniciamos um shell filho usando sh -c e fornecemos a esse shell uma lista de comandos para execução.

Seu comando "pára" porque ele se conecta ao servidor (na verdade, para user@bastionserver , mas não sei como esse servidor está relacionado aos servidores listados no arquivo de entrada) e inicia um shell interativo. Seu script não continuará até que este shell interativo seja encerrado.

O resto do seu código apenas gera strings para o terminal. Não os executa.

Não tente colocar comandos em variáveis. Muito raramente funciona como esperado. Veja por exemplo " Como podemos executar um comando armazenado em uma variável? ".

Se isso fosse uma tarefa real para mim, provavelmente tentaria fazê-lo usando algo como Ansible . Infelizmente, eu não conheço a Ansible o suficiente para dar uma solução completa com segurança aqui.

    
por 05.06.2018 / 16:45