%20em%20um%20servidor%20remoto.png)
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 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 sudo
de 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/
diretamenteem um terminal do sistema remotofunciona e copia file1
sem /etc/sub/folder/
pedir a sudo
senha.
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 sudo
pelo 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
echo
comando; o arquivo é chamadopassword.txt
e contém apenas a senha ("mypassword"
) do usuáriomyuser
. - o arquivo
password.txt
é direto como entrada para osudo
comando pelo operador<
. - execução do comando
sudo -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 -S
que é enviado do ssh para o sistema local.
Basta utilizar a operadora &>
e o /dev/null
dispositivo 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