Eu tenho duas perguntas:
- Existem várias máquinas Linux remotas, e preciso escrever um script de shell que executará o mesmo conjunto de comandos em cada máquina. (Incluindo algumas operações de sudo). Como isso pode ser feito usando script de shell?
- Ao enviar por ssh para a máquina remota, como lidar com quando ele solicitar autenticação de impressão digital RSA.
As máquinas remotas são VMs criadas em execução e eu apenas tenho seus IPs. Portanto, não posso colocar um arquivo de script de antemão nessas máquinas e executá-los em minha máquina.
expect
como `esperar" ? assword: "`Respostas:
Você pode fazer isso com ssh, por exemplo:
Você pode adicionar a
StrictHostKeyChecking=no
opção de ssh:Isso desabilitará a verificação da chave do host e adicionará automaticamente a chave do host à lista de hosts conhecidos. Se você não quiser que o host seja adicionado ao arquivo de hosts conhecidos, adicione a opção
-o UserKnownHostsFile=/dev/null
.Observe que isso desativa certas verificações de segurança , por exemplo, proteção contra ataques man-in-the-middle. Portanto, não deve ser aplicado em um ambiente sensível à segurança.
fonte
ssh
de qualquer script de shellExistem várias maneiras de lidar com isso.
Minha maneira favorita é instalar http://pamsshagentauth.sourceforge.net/ nos sistemas remotos e também sua própria chave pública. (Descubra uma maneira de instalá-los na VM, de alguma forma, você tem um sistema Unix inteiro instalado, o que são mais alguns arquivos?)
Com o seu agente ssh encaminhado, agora você pode fazer login em todos os sistemas sem uma senha.
E ainda melhor, esse módulo pam autenticará para sudo com seu par de chaves ssh para que você possa executar com direitos de root (ou de qualquer outro usuário) conforme necessário.
Você não precisa se preocupar com a interação da chave do host. Se a entrada não for um terminal, o ssh apenas limitará sua capacidade de encaminhar agentes e autenticar com senhas.
Você também deve procurar pacotes como o Capistrano.Definitivamente, dê uma olhada nesse site; ele contém uma introdução ao script remoto.
As linhas de script individuais podem ter a seguinte aparência:
fonte
Instale o sshpass usando,
apt-get install sshpass
então edite o script e coloque os IPs, nomes de usuário e senha de suas máquinas Linux na respectiva ordem. Depois disso, execute o script. É isso aí ! Este script instalará o VLC em todos os sistemas.fonte
Se você é capaz de escrever código Perl, deve considerar o uso de Net :: OpenSSH :: Parallel .
Você seria capaz de descrever as ações que devem ser executadas em cada host de maneira declarativa e o módulo cuidará de todos os detalhes assustadores.
sudo
Também há suporte para a execução de comandos .fonte
Este trabalho para mim.
Sintaxe: ssh -i pemfile.pem user_name @ ip_address 'command_1; comando 2; comando 3 '
fonte
Para este tipo de tarefas, eu uso repetidamente Ansible, que permite duplicar scripts bash coerentemente em vários contêineres ou VM. Ansible (mais precisamente Red Hat ) agora tem uma interface da web adicional AWX que é a edição de código aberto de sua Torre comercial.
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: produto comercial, você provavelmente irá explorar o AWX de código aberto gratuito, em vez da trilha gratuita de 15 dias da torre
fonte
Existem várias maneiras de executar os comandos ou script nas várias máquinas Linux remotas. Uma maneira simples e fácil é via pssh (programa ssh paralelo)
pssh : é um programa para executar ssh em paralelo em vários hosts. Ele fornece recursos como o envio de entrada para todos os processos, passagem de uma senha para ssh, salvamento da saída em arquivos e tempo limite.
Exemplo e uso:
conecte-se ao host1 e host2 e imprima "hello, world" de cada um:
Execute comandos por meio de um script em vários servidores:
Use e execute um comando sem verificar ou salvar as chaves do host:
Se o arquivo hosts.txt tiver um grande número de entradas, digamos 100, a opção de paralelismo também pode ser definida como 100 para garantir que os comandos sejam executados simultaneamente:
Opções :
-I: Lê a entrada e envia para cada processo ssh.
-P: Diz ao pssh para exibir a saída assim que ela chegar.
-h: Lê o arquivo do host.
-H: [usuário @] host [: porta] para host único.
-i: Exibe a saída padrão e o erro padrão conforme cada host conclui
-x args: Passa argumentos de linha de comando SSH extras
-o opção: Pode ser usado para fornecer opções no formato usado no arquivo de configuração. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p paralelismo: Use o número fornecido como o número máximo de conexões simultâneas
-q Modo silencioso: Faz com que a maioria das mensagens de aviso e diagnóstico sejam suprimidas.
-t: Estabelece o tempo limite das conexões após um determinado número de segundos. 0 significa que o pssh não irá desligar nenhuma conexão
Desative o StrictHostKeyChecking para lidar com o prompt de autenticação RSA.
-o StrictHostKeyChecking = não
Fonte : man pssh
fonte
Isso funcionou para mim. Eu fiz uma função. Coloque isso em seu script de shell:
Se você tiver várias máquinas nas quais deseja executar o mesmo comando, deverá repetir essa linha com um ponto e vírgula. Por exemplo, se você tiver duas máquinas, faria isso:
Substitua USER pelo usuário do computador. Substitua HOST pelo nome do computador. Substitua COMMAND pelo comando que você deseja executar no computador.
Espero que isto ajude!
fonte
Você pode seguir esta abordagem:
fonte