No Ubuntu 16.04, usando o VS Code, quero executar um script local em um servidor remoto com sudo
privilé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.sh
script que uso para executar local.sh
remotamente:
#!/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.sh
no sudo
servidor 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 -t
como 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 expect
e 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"
expect
simula uma sessão interativa. O spawn
comando é executado ssh -l $user $remote
e os comandos a seguir interagem com ele. O expect
comando espera até que o texto especificado apareça na saída e então send
envia o texto para o host remoto. Você pode encontrar mais no link especificado na outra resposta.