Подтвердить что ты не робот

SSH heredoc: подсказка bash

Я пытаюсь написать оболочку script, которая SSHs на сервер, а затем предложит пользователю ввести файл/папку.

ssh $SERVER <<EOF
cd downloads/
read -e -p "Enter the path to the file: " FILEPATH
echo $FILEPATH
eval FILEPATH="$FILEPATH"

echo "Downloading $FILEPATH to $CLIENT"
EOF

Я использую heredoc вместо двойных кавычек после SSH для выполнения этих команд, потому что моя оболочка script довольно большая, и я не хочу избегать каждой двойной кавычки.

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

Что я могу сделать, чтобы получить подсказку для работы с heredoc? А если нет, то каким образом я компоную свой script так, чтобы подсказка работала без обертывания всего в двойные кавычки и экранирование, например:

ssh $SERVER "
cd downloads/
read -e -p \"Enter the path to the file: \" FILEPATH
echo $FILEPATH
eval FILEPATH=\"$FILEPATH\"

echo \"Downloading $FILEPATH to $CLIENT\"
exit
"
4b9b3361

Ответ 1

Если вам не нужны какие-либо переменные от клиента, почему бы не попробовать - и ssh -t может оказаться полезным.

export CLIENT=me 

CMDS=$(cat <<CMD 
cd downloads/ 
read -e -p "Enter the path to the file: " FILEPATH 
echo \$FILEPATH 
eval FILEPATH="\$FILEPATH" 

echo "Downloading \$FILEPATH to $CLIENT" 
CMD 
) 

ssh localhost -t "$CMDS" 

Обратите внимание, что если ваша единственная проблема с двойными кавычками ускользает, и вы не планируете используя ' одинарные кавычки в script, то вы можете это сделать:

ssh -t $SERVER '
# your script, unescaped.
# if you want access to a locally defined variable,
echo "CLIENT is '$CLIENT'."
'

Ответ 2

это работает, завершается закладка на хосте.

var=$(cat<<EOF
read -e -p Path pname;
echo \$pname;
hostname;
echo \$pname;
cd \$pname;
pwd;
touch THIS ;
exit;
EOF
)

ssh -t NODE $var  

my mine создает файл THIS в запрошенном каталоге.

Ответ 3

Кажется, что это работает:

T=$(tty) ; bash <<XXX
echo Hi "$T"
read p <$T
echo p: \$p
echo Bye
XXX

Ответ 4

Чтобы заставить его работать с heredoc, должно быть достаточно вызвать bash или любую оболочку, которую вы хотите использовать на удаленном сервере. Например:

ssh $SERVER bash <<EOF
cd downloads/
read -e -p "Enter the path to the file: " FILEPATH
echo $FILEPATH
eval FILEPATH="$FILEPATH"

echo "Downloading $FILEPATH to $CLIENT"
EOF

Обратите внимание, что вы, вероятно, хотите избежать $ on FILEPATH, так как в настоящее время это будет интерполировано локальной оболочкой, а не удаленной оболочкой.