SSH команды через скрипт bash - PullRequest
1 голос
/ 19 ноября 2010

Я пробовал несколько неудачных попыток выполнить следующее:

По сути, мне нужно выполнить несколько последовательных команд на удаленной оболочке Unix, таких как установка переменных среды с переменными, которые у меня есть наscript, перейдите в определенный каталог и запустите там скрипт и т. д.

Я попытался использовать printf с частью скрипта, а затем передал команду ssh, но она не работала достаточно хорошоКроме того, я читал о маркере "ssh ... >> END", который хорош, но так как я использую функции, он не работает хорошо.

У вас есть какие-нибудь мысли?

Вот выдержка из кода:

deployApp() {
inputLine=$1;
APP_SPECIFIC_DEPLOY_SCRIPT="$(echo $inputLine | cut -d ' ' -s -f1)";
BRANCH="$(echo $inputLine | cut -d ' ' -s -f2)";
JBOSS_HOME="$(echo $inputLine | cut -d ' ' -s -f3)";
BASE_PORT="$(echo $inputLine | cut -d ' ' -s -f4)";
JAVA_HOME_FOR_JBOSS="$(echo $inputLine | cut -d ' ' -s -f5)";
JAVA_HEAP="$(echo $inputLine | cut -d ' ' -s -f6)";

echo "DEPLOYING      $APP_SPECIFIC_DEPLOY_SCRIPT"
echo "FROM BRANCH    $BRANCH"
echo "IN JBOSS       $JBOSS_HOME"
echo "WITH BASE PORT $BASE_PORT"
echo "USING          $JAVA_HOME_FOR_JBOSS"
if [[ -n "$JAVA_HEAP" ]]; then
    echo "WITH           $JAVA_HEAP"
fi
echo

echo "Exporting jboss to $JBOSS_HOME"
ssh me@$SERVER <<END
cleanup() {
        rm -f $JBOSS_SERVER/log/*.log
        rm -Rf $JBOSS_SERVER/deploy/
        rm -Rf $JBOSS_SERVER/tmp/
        mkdir $JBOSS_SERVER/deploy
    }

    startJboss() {
        cd $JBOSS_SERVER/bin
        ./jbossctl.sh start
        return 0;
    }
export JBOSS_HOME
export JBOSS_SERVER=$JBOSS_HOME/server/default
END
return 0;
}

При таком подходе "ЗДЕСЬ" я получаю эту ошибку: "синтаксисошибка: неожиданный конец файла "

Заранее большое спасибо!

Ответы [ 2 ]

4 голосов
/ 19 ноября 2010

Просто добавьте функции в ваш документ здесь:

var="Hello World"
ssh user@host <<END
x() {
    print "x function with args=$*"
}

x "$var"
END

[РЕДАКТИРОВАТЬ] Некоторые комментарии:

  1. Вы говорите «export JBOSS_HOME», но никогда не определяете значение для переменной в документе здесь. Вы должны использовать export JBOSS_HOME="$JBOSS_HOME". BASH примет весь текст между двумя END, заменит все переменные и отправит результат в SSH для обработки.

    Это также означает, что другая сторона увидит rm -f /path/to/jboss/server/*.log; присвоение JBOSS_SERVER в последней строке данного документа не имеет никакого эффекта (по крайней мере, не в коде в cleanup()).

    Если вы хотите передать $ без изменений на удаленный сервер, вы должны экранировать его с помощью \: rm -f \$JBOSS_SERVER/log/*.log

  2. Вы никогда не звоните cleanup()

  3. После return 0 отсутствует }, чтобы завершить определение deployapp()

Могут быть и другие проблемы. Запустите скрипт с bash -x, чтобы увидеть, что на самом деле выполняет оболочка. Вы также можете добавить echo команды в этот документ, чтобы увидеть, каковы значения переменных, или вы можете добавить set -x перед cleanup(), чтобы получить тот же вывод, что и с bash -x, но с удаленной стороны.

0 голосов
/ 19 ноября 2010

Я не понимаю, почему вы используете cut для разделения аргументов вашей функции. Просто сделай

APP_SPECIFIC_DEPLOY_SCRIPT=$1
BRANCH=$2
JBOSS_HOME=$3
# etc.

Если вы не заключите в кавычки здесь свой документ, содержимое будет расширено до того, как оно будет отправлено на сервер. Это может быть то, что вы хотите. Если вы этого не сделаете и хотите, чтобы все развертывание выполнялось на стороне сервера, укажите это следующим образом:

ssh me@$SERVER <<'END'
# etc.
END

Если вы не хотите смешивать, не заключайте в кавычки разделитель, но избегайте тех вещей, для которых вы хотите отсроченное расширение:

ssh me@$SERVER <<END
echo $EXPAND_ME_NOW \$EXPAND_ME_LATER
END

Что должны делать операторы export? Я не вижу, чтобы они вообще имели какой-либо эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...