Выбросьте стандартный вывод и ошибку

Передача переменных (переменных среды) через 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

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

2
28.05.2015, 01:18
0 ответов

Теги

Похожие вопросы