Digitando a senha do sudo para um script executado remotamente

Oct 18 2020

Estou tentando desenvolver um script que atualiza minhas VMs em uma rede local. O objetivo é que cada VM baixe o script e execute-o.

Consegui usar o curl para baixar o script e executá-lo, mas ainda recebo um prompt para inserir a senha do sudo.

Isso funciona:

sshpass -p 'password' ssh -t -t [email protected] 'curl -s 192.168.1.15/upgrade.sh | sudo sh'

Mas ainda preciso inserir uma senha novamente quando chegar ao comando sudo.

Eu tentei:

sshpass -p 'password' ssh -t -t [email protected] 'curl -s 192.168.1.15/upgrade.sh | echo 'password' | sudo sh'

O que leva ao seguinte:

[sudo] password for aaron: (23) Failed writing body

O que posso fazer para passar a senha para o prompt de senha do sudo?

Respostas

1 LjmDullaart Oct 19 2020 at 05:42

Basicamente, há uma série de opções, cada uma com seus prós e contras. Depende um pouco de quão "local" sua rede é e de quão durável sua solução deve ser.

  1. Sudo sem senha. Permitir o sudo sem senha do usuário na máquina de destino. Tanto para tudo ( put "nameofuser ALL=(ALL) NOPASSWD: ALLem /etc/sudoersuso visudonas máquinas de destino) ou permitir apenas comandos específicos. Observe que todos com acesso nameofuserna máquina alvo praticamente têm acesso root na máquina (nem todos na máquina como @terdon sugeriu nos comentários).

  2. Permita que o usuário na máquina de controle faça ssh como root na máquina de destino. Coloque a chave pública do usuário controlador no authorized_keysarquivo na máquina de destino. Isso significa que o usuário específico na máquina de controle tem acesso root em todas as VMs.

  3. Olhe para Ansible (ou Puppet, Chef, etc.). Eles já resolveram mais ou menos esse problema para você. O Ansible tem uma curva de aprendizado suave (em menos de um dia você poderá realmente usá-lo).

Se for algo sério por um longo período, escolha a opção 3. Se for apenas sua própria rede local onde você está experimentando, 1 ou 2 bastarão.