Execute o script local no servidor remoto com privilégios sudo

Execute o script local no servidor remoto com privilégios sudo

No Ubuntu 16.04, usando o VS Code, quero executar um script local em um servidor remoto com sudoprivilégios.

Aqui está local.sh:

#!/usr/bin/env bash
echo $(ifconfig | grep -Eo "inet addr:([0-9]\.?)*")
echo $(whoami)
echo "$1"

Aqui está uma versão do test.shscript que uso para executar local.shremotamente:

#!/usr/bin/env bash
remote="example.com"
user="username"
password="remote_password"
ssh "$user@$remote" "bash -s" < ./local.sh "'argument 1'"

Isso funciona bem. Aqui está a saída, conforme esperado:

$ ./test.sh 
inet addr:123.45.67.89 inet addr:127.0.0.1
username
argument 1

O primeiro endereço IP é de fato o endereço IP do servidor.

No entanto, quero executar local.shno sudoservidor remoto. Se eu substituir a última linha pela seguinte linha, o acesso será bloqueado:

ssh -tt "$user@$remote" "echo $password | sudo bash -s" < ./local.sh "'argument 1'"

Saída:

$ ./test.sh 
[sudo] password for username: 
Sorry, try again.
[sudo] password for username: 

Se eu digitar uma senha após o segundo prompt, os caracteres aparecem no Terminal e, quando pressiono Enter, nada acontece, então uso ^C para cancelar.

Se eu usar apenas -tcomo sinalizador para ssh, obtenho a saída:

Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified

Se eu não usar nenhum sinalizador, recebo:

sudo: no tty present and no askpass program specified

Outras soluções que vi propostas não tiveram mais sucesso. Qualquer informação sobre o que devo fazer será muito bem-vinda.

Responder1

Para conseguir o que deseja fazer, tente expect
e para mantê-lo seguro, tente criptografar seus arquivos

http://manpages.ubuntu.com/manpages/bionic/man1/expect.1.html

Responder2

Instale expecte use o seguinte script (não testado, pode haver bugs):

#!/usr/bin/expect
set remote "example.com"
set user "username"
set password "remote_password"
spawn ssh -l $user $remote
expect "$ "
send "sudo bash -s < ./local.sh 'argument 1'\r"
expect "password for $user:"
send "$password\r"
expect "$ "
send "exit\r"

expectsimula uma sessão interativa. O spawncomando é executado ssh -l $user $remotee os comandos a seguir interagem com ele. O expectcomando espera até que o texto especificado apareça na saída e então sendenvia o texto para o host remoto. Você pode encontrar mais no link especificado na outra resposta.

informação relacionada