Запустить локальный скрипт на удаленном сервере с привилегиями sudo

Запустить локальный скрипт на удаленном сервере с привилегиями sudo

В Ubuntu 16.04 с помощью VS Code я хочу запустить локальный скрипт на удаленном сервере с sudoпривилегиями.

Вот local.sh:

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

Вот одна из версий скрипта test.sh, которую я использую для local.shудаленного запуска:

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

Это работает отлично. Вот вывод, как и ожидалось:

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

Первый IP-адрес действительно является IP-адресом сервера.

Однако я хочу запустить local.shна sudoудаленном сервере. Если я заменю последнюю строку на следующую, доступ будет заблокирован:

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

Выход:

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

Если я ввожу пароль после второго запроса, символы появляются в Терминале, а когда я нажимаю Enter, ничего не происходит, поэтому я использую ^C для отмены.

Если я использую только -tкак флаг ssh, я получаю вывод:

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

Если я вообще не использую флаги, то получаю:

sudo: no tty present and no askpass program specified

Другие решения, которые я видел, не были более успешными. Любые идеи о том, что мне следует делать, будут весьма приветствоваться.

решение1

Чтобы добиться желаемого, попробуйте. expect
А чтобы сохранить безопасность, попробуйте зашифровать свои файлы.

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

решение2

Установите expectи используйте следующий скрипт (не тестировался, могут быть ошибки):

#!/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имитирует интерактивный сеанс. spawnКоманда запускается, ssh -l $user $remoteи с ней взаимодействуют следующие команды. expectКоманда ждет, пока указанный текст не появится в выводе, а затем sendкоманда отправляет текст на удаленный хост. Вы можете найти больше по ссылке, указанной в другом ответе.

Связанный контент