2016-08-16 2 views
0

Я пытаюсь до ssh к другому серверу в сценарии оболочки и запускать некоторые скрипты.Как вы экспортируете локальные переменные оболочки в мультикоманду ssh?

В настоящее время моя линия выглядит что-то вроде:

ssh [email protected]$SERVER '$(typeset -a >> /dev/null); PROFILE_LOCATION=`locate db2profile| grep -i $INST_NAME| grep -v bak`; . $PROFILE_LOCATION; function1; function2;' 

Я попытался как ' и ", а также с использованием комбинации из тех, с \; или ';'

Как использовать переменные I иметь в моем текущем сценарии оболочки в моем ssh на другой сервер и запустить несколько команд? Благодаря!!

+1

Об этом уже спрашивали и отвечали - возможно, стоит посмотреть на существующую базу знаний. –

+0

... сказал, что я не согласен с тем, кто помечает этот переход от перенаправления к суперуслугам, - возможность запускать функции на удаленном сервере - это очень ориентированная на сценарии проблема. –

+0

BTW, подумайте над тем, чтобы использовать привычные имена переменных оболочки в нижнем регистре; см. соглашения POSIX для имен переменных среды в четвертом абзаце http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html (указав, что имена верхнего регистра используются операционной системой и оболочкой, и что приложения гарантированно смогут использовать имена нижнего регистра без конфликтов). Переменные среды и переменные оболочки совместно используют пространство имен (установка переменной оболочки с именем, которое перекрывает переменную среды, переписывает ее), поэтому эти соглашения применяются и к этим. –

ответ

1

Если вы хотите объявления функций, а ваша оболочка - bash, используйте typeset -p, а не typeset -a (что даст текстовый дамп переменных, но не функций). Кроме того, вам нужно фактически запустить это в контексте, где он будет локально оценен (и убедитесь, что ваша удаленная оболочка - это то, что его понимает, а не /bin/sh).

следующие хиты все эти пункты:

evaluate_db2profile() { 
    local db2profile 
    db2profile=$(locate db2profile | grep -i "$INST_NAME" | grep -v bak | head -n 1) 
    [ -n "$db2profile" ] && . "$db2profile" 
} 

ssh "[email protected]$SERVER" bash -s <<EOF 
$(typeset -p) 
evaluate_db2profile 
function1 
function2 
EOF 
  • Поскольку <<EOF используется вместо <<'EOF', команда typeset -p выполняется локально и подставляется в Heredoc. (Вы также можете выполнить это, используя двойные, а не одинарные кавычки в однострочной формулировке, но см. Ниже).
  • Определение evaluate_db2profile локально как функция гарантирует, что typeset -p будет излучать его в формате, который удаленная оболочка может оценивать, без необходимости беспокоиться об экранировании.
  • Использование bash -s в удаленной командной строке гарантирует, что оболочка интерпретирует ваши функции bash, а не /bin/sh. Если ваш код написан для ksh, запустите ksh -s для достижения такого же эффекта.
Смежные вопросы