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 myus[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 myuser
necessária para autenticar a sessão ssh.
Minhas necessidades
Também tenho que executar um cp
comando como o anterior, mas o destino do arquivo é uma subpasta /etc
e isso precisa de sudo
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 sudo
senha.
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/
diretamente em um terminal do sistema remoto ele funciona e copia file1
sem /etc/sub/folder/
pedir a sudo
senha.
Mas se eu executar o seguinte comando no 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 pelo sudo
teclado? É possível enviar a senha automaticamente?
Eu encontrei uma solução alternativa.
Usando um arquivo que armazena temporariamente a senha para
sudo
Modifiquei o script executado no sistema local adicionando alguns comandos mostrados abaixo:
echo
comando; o arquivo é chamadopassword.txt
e contém apenas a senha ("mypassword"
) do usuáriomyuser
.password.txt
é direto como entrada para osudo
comando pelo operador<
.sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
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:
Suprimir a saída de
sudo -S
Encontrei outra melhoria que permite suprimir a saída (
[sudo] password for myuser:
) do comandosudo -S
que é enviado do ssh para o sistema local.Basta utilizar a operadora
&>
e o/dev/null
dispositivo conforme mostrado abaixo:Nota No 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 (veja esta postagem no SuperUser).
A supressão não funciona pelo seguinte redirecionamento:
>/dev/null