Выполнять локальные сценарии 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

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

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

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

Ева

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 запрашивает данные аутентификации, такие как пароль пользователя или ключевая фраза;

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

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

Из справочных страниц по ssh:

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

ssh -t user@server 'bash -s' < $script_dir/script.sh
Другие вопросы по тегам