Por um script bash executado em um computador local, execute um comando (com privilégios sudo) em um servidor remoto

Por um script bash executado em um computador local, execute um comando (com privilégios sudo) em um servidor remoto

Execute um comando em um sistema remoto a partir de um computador local

Preciso executar um comando em um sistema lubuntu 22.04 remoto por uma conexão ssh, mas sem abrir um shell.Esta instrução será executada dentro de um script.O script é executado no meu sistema local (que possui outra distribuição Ubuntu instalada). Descobri que posso fazer isso, com sucesso, executando no sistema local o seguinte script:

# define a variable which stored the password
MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

No comando que utilizei sshpass(que está instalado no meu sistema local) para evitar a inserção da senha do usuário myusernecessária para autenticar a sessão ssh.

Minhas necessidades

Também tenho que executar um cpcomando como o anterior, mas o destino do arquivo é uma subpasta /etce isso precisa sudode privilégios. Então o script se torna:

MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"

Se eu executar o script, o último comando do script gerará a seguinte solicitação:

[sudo] password for myuser:

Assim o script interrompe sua execução e aguarda a sudosenha.
Eu não quero isso!

Uma tentativa minha

Se eu executar o comando:

> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/

diretamenteem um terminal do sistema remotofunciona e copia file1sem /etc/sub/folder/pedir a sudosenha.

Mas se eu executar o seguinte comandono meu sistema local:

sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"

não funciona!

Minha pergunta

Existe uma maneira de evitar a entrada da senha sudopelo teclado? É possível enviar a senha automaticamente?

Responder1

Eu encontrei uma solução alternativa.

Usando um arquivo que armazena temporariamente a senha parasudo

Modifiquei o script executado no sistema local adicionando alguns comandos mostrados abaixo:

  • criação de um arquivo texto na pasta do sistema remoto pelo echocomando; o arquivo é chamado password.txte contém apenas a senha ( "mypassword") do usuário myuser.
  • o arquivo password.txté direto como entrada para o sudocomando pelo operador <.
  • execução do comandosudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
  • exclusão do arquivo /home/myuser/password.txt do sistema remoto

Esta solução é usada em um ambiente de desenvolvimento seguro para não quebrar nenhuma restrição de segurança.

O novo roteiro

Com estas instruções o script executado no sistema local torna-se:

MYPASSWORD='mypassword'

# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"

# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo   ===========================

# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt

Suprimir a saída desudo -S

Encontrei outra melhoria que permite suprimir a saída ( [sudo] password for myuser:) do comando sudo -Sque é enviado do ssh para o sistema local.
Basta utilizar a operadora &>e o /dev/nulldispositivo conforme mostrado abaixo:

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
  < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null

ObservaçãoNo meu sistema local, a supressão da saída [sudo] password for myuser:funciona seguindo os redirecionamentos:

  • &>/dev/null
  • >&/dev/null

e isso é normal porque os operadores anteriores são equivalentes (vejaesta postagemno Superusuário).

A supressãonão funcionapelo seguinte redirecionamento:

  • >/dev/null

informação relacionada