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
"
Ответы
Ответ 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
, так как в настоящее время это будет интерполировано локальной оболочкой, а не удаленной оболочкой.