Выполнение локальных bash скриптов на удаленном сервере, но требуется ввод пользователя

Я использую команду SSH для удаленного выполнения скриптов bash:

ssh user@server 'bash -s' < $script_dir/script.sh

И внутри script.sh, у меня будет команда, как показано ниже, чтобы добавить ключи ssh:

ssh-keygen -t rsa
ssh-copy-id postgres@$sqlserver
ssh postgres@$sqlserver -C true

А также создать пользователя на удаленном sql-сервере

printf "Creating user in postgresql server...\n"
createuser -s -P username

Который требует ввода пользователя, но я обнаружил, что когда я выполняю команду с удаленного сервера, она пропускает получение ввода пользователя и не работает.

Еще одна:

printf "Please enter your barman server name: \n" ; read -s barmanserver

Которая не может прочитать ввод пользователя

Я знаю, что скрипт не может прочитать ввод другого терминала, но может ли кто-нибудь помочь мне найти решение, если мне нужен ввод пользователя, чтобы продолжить?

Спасибо большое!!!

Eva

0
задан 11 May 2018 в 04:37
3 ответа

Метод, который вы используете для удаленного выполнения сценария, создает конфликт между кодом и потоками данных. Я имею в виду ... Во время выполнения ssh user @ server 'bash -s' <$ script_dir / script.sh вы выделяете стандартный ввод (STDIN) для кода, который будет выполняться удаленно. Но если исполняемому коду требуется ввод данных, он будет передан в следующей строке кода (поскольку STDIN передает строки кода удаленному процессу bash ).

Если вы хотите использовать STDIN чтобы предоставить входные данные для сценария, который выполняется удаленно, вам может потребоваться использовать другой поток для кода. OpenSSH, похоже, еще не имеет встроенной функции пересылки файловых дескрипторов, то есть STDIN (файловый дескриптор номер 0) кажется единственным файловым дескриптором, который можно использовать для пересылки данных с локального терминала в удаленный сеанс. В качестве обходного пути вы можете заранее скопировать файл сценария, например:

scp $script_dir/script.sh user@server:/home/user/$script_dir/script.sh && \
ssh user@server /home/user/$script_dir/script.sh

Или вы можете использовать взлом Bash, чтобы не записывать локальный код в удаленную файловую систему. Например:

cat $script_dir/script.sh - | ssh user@server \
bash \<\( head -c `wc -c < $script_dir/script.sh` \)

PS: Взлом, описанный выше, не оптимален, потому что:

  • Он не работает, если SSH запрашивает данные аутентификации, такие как пароль пользователя или ключевую парольную фразу;

  • Локальный сеанс требует дополнительной строки ввода после конца удаленного выполнения.

2
ответ дан 4 December 2019 в 13:26

Из страниц руководства ssh :

-t 'Принудительное выделение псевдо-tty. Это можно использовать для выполнения произвольных экранных программ на удаленном компьютере, что может быть очень полезно, например при реализации услуг меню. Несколько параметров -t принудительно выделяют tty, даже если ssh не имеет локального tty.

ssh -t user@server 'bash -s' < $script_dir/script.sh
0
ответ дан 4 December 2019 в 13:26

Ожидаемый сценарий используется для автоматической подачи ввода, вы можете использовать этот сценарий для своего сценария, упомянута ссылка для более подробной информации: https://www.thegeekstuff.com/2010/10/expect-examples/

0
ответ дан 4 December 2019 в 13:26

Теги

Похожие вопросы