2016-10-06 5 views
3

Я пишу скрипт bash, который должен выполнять некоторые команды на удаленном сервере через ssh. Сценарий состоит из двух основных частей:Как передать локальные переменные в область ssh в сценарии bash?

Часть 1: Использование локальных переменных $ A и $ B

Часть 2: Выполнение команды на удаленном сервере следующим образом:

ssh -T [email protected] << 'EOF' ... Using local variables $A and $B ... EOF

Проблема что локальные переменные $ A и $ B недоступны в рамках команд ssh на удаленном сервере. Насколько я понимаю, переменные $ A и $ B снаружи и внутри области ssh не совпадают.

Итак, мой вопрос заключается в том, как передавать локальные переменные из сценария bash в область ssh? Еще одно замечание: часть 2 довольно большая, поэтому я не могу использовать «один лайнер» после ssh.

Благодаря

+0

Я не могу воспроизвести на коробке FreeBSD. Вывод этого простого Баша скрипт: 'Эхо $ 1 эха $ 2 SSH -T Localhost << EOF эхо Foo эхо $ 1 эхо $ 2 эхо бар EOF' когда называют ./tst.sh а защиту является таким, как ожидался: 'а защиту Foo а защиту bar' (переводы строк удалены комментариями форматирования, но, безусловно, не ответ) –

+0

Трудно сказать, почему вы не можете воспроизвести эту проблему. Я использую окно Centos OS. Попробуйте использовать настоящий удаленный сервер, а не локальный. – Steeve007

+0

Что произойдет, если вы используете мой собственный скрипт с localhost и с вашим удаленным сервером? –

ответ

0

Проблема не имеет ничего общего с 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 
+0

Я вижу вашу точку зрения. Спасибо за объяснение. Причина я использую кавычки EOF, что внутри «документ здесь» среди других вещей, у меня есть код: ' SSH -T пользователь @ имясервера <<«EOF» для F в/вар/Журнал/сообщений *; сделать эхо «Имя файла:» $ F сделано EOF ' Этот код печатает пустые строки с неупомянута EOF и работает, как ожидалось (печатает имена файлов) с ссылкой EOF – Steeve007

+0

@ Steeve007: см мой выбор ... –

0

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

Смежные вопросы