В 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
команда отправляет текст на удаленный хост. Вы можете найти больше по ссылке, указанной в другом ответе.