2017-01-03 5 views
0

У меня есть некорректное поведение в моем сценарии bash. Существуют переменные, и все они имеют назначенные им значения, я подтверждаю их, повторяя значения в начале сценария.Переменные в удаленной сессии SSH

Однако при передаче их на удаленный сеанс SSH одна переменная имеет значение, а другая - пустая. Я уверен, что не переписываю значение переменной.

# Script input arguments 
USER=$1 
SERVER=$2 
# Other vars 
PFX=$8 
# 
[email protected]$SERVER 

function run { 
    ssh $ADDRESS /bin/bash [email protected] 
} 

# Script body, some stuff happens here 
run << "SSHCONNECTION2" 
    sudo mv "/home/$USER/$PFX" "/home/$USER/certs/" 
SSHCONNECTION2 

Таким образом, выход mv является

ошибка 03-Jan-2017 17:20:39 мв: не может двигаться '/ дом/админ /' в подкаталог само по себе, «/ home/admin/certs/admin '

Может ли кто-нибудь дать мне подсказку, что я делаю неправильно? Спасибо.

+1

Когда вы цитируете сингл heredoc, вы говорите локальному интерпретатору, чтобы не расширять какие-либо переменные в heredoc. –

+0

... таким образом, используется только * удаленное * значение 'USER', а не локальное. - –

+1

Это на самом деле часть того, почему использование имен всех шапок для ваших собственных переменных - это плохая практика: это означает, что вы используя одно и то же пространство имен, разделяемое операционной системой и инструментами оболочки, поэтому вы можете неосознанно переписывать (или неосознанно * использовать *) переменные со значением для других частей системы. –

ответ

1

USER имел удаленное значение, потому что USERвсегда имеет значение: По умолчанию это учетная запись текущего пользователя на all POSIX systems. Чтобы избежать противоречий с именами переменных, определяемыми системой, вы должны использовать имена нижнего регистра для собственных переменных оболочки и среды (первый из них, поскольку установка переменной оболочки с именем, которое перекрывает переменную среды, будет неявно переписывать последнюю).

#!/bin/bash 
#  ^^^^ - not /bin/sh; printf %q (thus, eval-safe quoting) is a bash extension 

user=$1 
pfx=$8 

# Tell the shell to quote your variables to be eval-safe! 
printf -v user_q '%q' "$user" 
printf -v pfx_q '%q' "$pfx" 

# ...then you can use those eval-safe version in your heredoc 
run << SSHCONNECTION2 
    # because the values are self-quoted, don't put their expansions inside quotes 
    sudo mv /home/$user_q/$pfx_q /home/$user_q/certs/ 
SSHCONNECTION2 

Примечания:

  • Сигила (SSHCONNECTION2) преднамеренно в кавычки, чтобы позволить произойти разложения.
  • Использование имен переменных нижнего регистра позволяет избежать непреднамеренного противоречия с именами, значимыми для оболочки или системы.

выше немного неудачно, потому что буквальное содержание SSHCONNECTION2 Heredoc не код, который может быть безопасно работать непосредственно в оболочке. Рассмотрим this answer instead.

+0

Спасибо, я дам ему попробовать и принять ваш ответ, я довольно новичок в bash, и теперь это имеет смысл. – Alex

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