Передача переменных (переменных среды) через ssh
возможна, но обычно ограничена.
Вы должны сказать клиенту, чтобы он отправил их. Например, с OpenSSH это с:
ssh -o SendEnv=parameter host cmd...
Но вам также нужен сервер, принимающий его ( AcceptEnv
конфигурационная директива с OpenSSH). Принятие любой переменной представляет собой большой риск для безопасности, поэтому обычно не выполняется по умолчанию, хотя некоторые развертывания ssh допускают использование некоторых переменных в некотором пространстве имен (например, LC _ *
в некоторых развертываниях OpenSSH).
Вам также необходимо экспортировать переменную перед вызовом ssh
, например:
LC_parameter="$parameter" ssh -o SendEnv=LC_parameter host csh << 'END'
echo $LC_parameter:q
END
Выше мы передаем содержимое переменной оболочки $ parameter
bash
как переменную среды LC_parameter
в ssh
. ssh
отправляет это в sshd
, который, если принимает его, передает его как переменную среды в оболочку входа пользователя, которая затем передает ее этому csh
] (которая затем может ее развернуть).
Но, как упоминалось ранее, это не сработает, если администратор хоста хоста
не добавит AcceptEnv LC_parameter
или AcceptEnv LC _ *
(тот иногда выполняется по умолчанию) в конфигурацию sshd
.
Сообщение об ошибке Undefined variable
в вашем примере предполагает, что оболочка входа удаленного пользователя - csh
или tcsh
. Лучше явно вызывать оболочку, чтобы избежать сюрпризов ( ssh host csh
также означает, что tty не запрашивается, поэтому вам не нужно -T
). Обратите внимание на синтаксис $ LC_parameter: q
, который является способом csh
передать содержимое переменной дословно, а не «$ LC_parameter»
, который не работает если переменная содержит символы новой строки.
Если использование переменных LC _ *
не является вариантом, то в качестве альтернативы вы можете использовать клиентскую оболочку (в вашем случае bash
) расширить переменную. Наивно было бы с
ssh host csh << END
echo "$variable"
END
, но это было бы опасно, поскольку содержимое переменной интерпретировалось бы удаленной оболочкой. Если, например, $ variable
содержит `reboot`
или "; reboot;: "
, это будет иметь плохие последствия.
Итак, вам нужно сначала убедиться, что переменная правильно заключена в кавычки в синтаксисе удаленной оболочки. Здесь я бы избегал csh
, где это сложно сделать надежно, и вместо этого использовал бы sh
/ bash
/ ksh
.
Используйте вспомогательную функцию для цитирования sh:
shquote() {
awk -v q=\' -v b='\\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q b q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
exit
}' "$@"
}
И вызовите ssh
как:
ssh host sh << END
parameter=$(shquote "$parameter")
echo "\$parameter"
END
Посмотрите, как мы избегаем третьего $
, поэтому расширение Параметр $
выполняется удаленной оболочкой, а не локальной.