2014-12-11 2 views
1

Существует проблема с вызывается через SSH Баш, хотя я читал женихами об этом я до сих пор не могу объяснить следующее:Баш вызывается через SSH не хранит переменные

Вот скрипт, очень просто

#!/bin/bash 
theUser=$1 
theHost=$2 
ssh -tt [email protected]$theHost 'bash' << EOF 
a=1 
echo 'dat '$a 
exit 
EOF 

и вот результат:

[email protected]:~$ bash thelast.sh victor 10.0.0.8 
[email protected]'s password: 
a=1 
echo 'dat ' 
exit 
[email protected]:~$ a=1 
[email protected]:~$ echo 'dat ' 
dat 
[email protected]:~$ exit 
exit 
Connection to 10.0.0.8 closed. 

Как вы можете видеть, окружающая среда не сохраняет значение переменной «а», поэтому он не может эхо, но любые другие команды как ls или date возвращают resul т.

Итак, вопрос в том, что я делаю неправильно и как избежать такого поведения?

p.s. Я не могу заменить ssh -tt, но любая другая команда может быть свободно заменена.

Заранее спасибо

+2

Параметр '$ a' становится оценена, когда файл сценарий считывается и обрабатывается на локальном хосте - удаленная оболочка никогда не видит' $ а '. Вам нужно избежать этого, чтобы отложить оценку. –

ответ

2

Внутри документа здесь $a разворачивается локально перед подачей ввода в команду ssh. Вы можете предотвратить это, процитировав терминатор после оператора << как в

ssh -tt [email protected]$theHost 'bash' << 'EOF' 
1

$a расширяется в локальной оболочке, где она не определена. Для того чтобы избежать этого, вы должны избавиться от нее:

echo "dat \$a" 

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