2017-02-22 93 views
0

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

./my_script.ksh $HOME

#! /usr/bin/ksh 
my_var=${1} 
echo "You sent: ${my_var}" 

Я хочу, чтобы мой выход будет You sent: $HOME, но вместо этого он оценивает его и производит You Sent: /home/blah/usr

Смысл этого в том, что я планирую делать команду SSH, что мне нужно pass $ my_var тоже не оценивается (aka be $ HOME), потому что $ HOME на каждом сервере является другим значением, а для SSH-команды я хочу, чтобы он использовал значение с сервера, это SSH'ing тоже. так что надеялся просто передать его, поэтому во время SSH он будет правильно оцениваться

Вот пример того, что я хочу иметь. Давайте предположим, $ HOME уже установлен на Server1 и Server2 как:

Server1 $HOME: /home/blah/usr 
Server2 $HOME: /home/superblah/newusr 

От Server1 выполнить my_script.ksh $HOME

Сценарий такой же, как указано выше, с одной дополнительной линии:

ssh [email protected] "echo Server got: $my_var" 

, что мои в настоящее время составляет:

You sent: /home/blah/usr 
Server got: /home/blah/usr 

Что я хочу, так это то, что ssh com подлежит производству:

Server got: /home/superblah/newusr 

Спасибо.

+0

Чтобы было ясно, [ваш ** ** реальный вопрос] (http://stackoverflow.com/questions/42400222/use -remote-environment-variables-value-in-scp-path) с SCP вместо SSH - очень важная разница. –

+0

Кроме того, использование '$ HOME' несколько вводит в заблуждение - оно поддается ответам, которые полагаются на удаленный каталог по умолчанию, когда соединение SCP или SSH выполняется как $ HOME, тогда как ваш реальный прецедент требует чего-то более активного. –

+0

BTW, я пишу код здесь для ksh93 - если вы переключались на bash, вы бы хотели заменить 'foo = $ (printf '% q' ...)' '' printf -v foo '% q' ... ', но многое другое не изменится. С другой стороны, если вы используете какой-то сторонний клон ksh, а не реальный, мой первый совет - переключиться на реальный ksh (если вы хотите что-то быстрое, функциональное и стабильное) или bash (для что-то не так быстро, но активно поддерживается - и в текущем 4.x, довольно чертовски близки к особенностям, даже если синтаксис отличается). –

ответ

0

Вы можете предотвратить разрешения переменного, завернуть его в одинарных кавычках

./my_script.ksh '$HOME' 

Я пробовал так:

[host1]$ echo $HOME 
/home/user1 
[host1]$ ssh [email protected] echo '$HOME' 
/home/user2 
[host1]$ 
+0

ОП отредактировал свой вопрос, запросив дистанционную оценку, а не просто буквенную передачу. (Я считаю, что их * реальный вопрос: http://stackoverflow.com/questions/42400222/use-remote-environment-variables-value-in-scp-path, о котором они также попросили чуть раньше). –

+0

... конечно, удаленная оценка * безопасно * - без рисков безопасности, связанных с 'eval', означает выполнение некоторой работы. –

0

envsubst может быть использован для замены строк вида $HOME или $foo с значение переменных среды, называемых одинаковыми именами. Таким образом:

#!/usr/bin/env ksh 
my_var=$1 
my_var_subst=$(envsubst <<<"$my_var") 
echo "You sent: ${my_var}" 
echo "Interpreted as: ${my_var_subst}" 

... испустит:

You sent: $HOME 
Interpreted as: /home/superblah/newusr 

при вызове с ./myscript '$HOME'.


Обратите внимание, что нужно быть осторожными при передаче значений через SSH, так как SSH неявно работает sh -c "$*" с аргументами, переданными - конкатенации их вместе с пробелами и оценки, что одну строку в качестве команды оболочки. Таким образом, запуск вашей команды через SSH может выглядеть следующим образом:

ssh somehost $'./myscript \'$HOME\'' 

... или ...

ssh somehost "./myscript \$HOME" 

...или, чтобы сделать его проще, пусть оболочка сделать убегающую работу за вас:

remote_command=$(printf '%q ' ./myscript '$HOME') 
ssh somehost "$remote_command"