Проблема не имеет ничего общего с ssh, но связана только с здесь документы в bash или любой другой оболочке Posix.
Man страница для Баш говорит в документ здесь пункте:
Формат здесь-документов:
< < [-] слово
документ-здесь
разделителем
Расширение параметров, подстановка команд, арифметическое расширение или расширение пути не выполняются по слову. Если какие-либо символы в слове указаны, разделитель является результатом удаления цитаты в слове, а строки в этом документе не разворачиваются. Если слово без кавычек, все строки этого документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \<newline>
игнорируется, и \
следует использовать для цитирования символов \
, $
и `.
Как вы цитируете EOF
, вы явно попросим оболочку не заменить $1
и $2
переменные.
Самый надежный способ - не указывать EOF и постоянно цитировать все другие специальные символы в документе здесь.
Например, если ваш здесь документ содержал что-то вроде:
ssh -T [email protected] << 'EOF'
for f in /var/log/messages*
do echo "Filename: " $f
done
EOF
вы могли бы переписать его без кавычек вокруг EOF но один внутри $
:
ssh -T [email protected] << EOF
for f in /var/log/messages*
do echo "Filename: " \$f
done
EOF
Таким образом, все без кавычек varibles будут интерполированы.
В качестве альтернативы, если сервер разрешает его, вы можете попробовать передать 2 параметра в качестве переменных окружения.
Скажите, что вы хотите использовать имена PARAM1
и PARAM2
. Файл sshd_config
на сервере должен содержать строку AcceptEnv PARAM1 PARAM2
, потому что по умолчанию и по соображениям безопасности переменная среды не принимается.
Вы можете использовать:
export PARAM1=$1
export PARAM2=$2
ssh -T -o SendEnv=PARAM1 -o SenEnv=PARAM2 [email protected] << 'EOF'
...
Using variables $PARAM1 and $PARAM2
...
EOF
Я не могу воспроизвести на коробке FreeBSD. Вывод этого простого Баша скрипт: 'Эхо $ 1 эха $ 2 SSH -T Localhost << EOF эхо Foo эхо $ 1 эхо $ 2 эхо бар EOF' когда называют ./tst.sh а защиту является таким, как ожидался: 'а защиту Foo а защиту bar' (переводы строк удалены комментариями форматирования, но, безусловно, не ответ) –
Трудно сказать, почему вы не можете воспроизвести эту проблему. Я использую окно Centos OS. Попробуйте использовать настоящий удаленный сервер, а не локальный. – Steeve007
Что произойдет, если вы используете мой собственный скрипт с localhost и с вашим удаленным сервером? –