开发者

SSH commands via bash script

I've been trying several fails to perform the following:

Basically, what I need is to execute several sequenced commands on a remote unix shell, such as setting environment variables with variables that I have on the script, move to a particular directory and run a script there and so on.

I've tried using a printf with the portion of the script and then piped the ssh command, but it didn't work quite well, also, I've read about the "ssh ... >> END" marker, which is great but since I'm using functions, it doesn't work well.

Do you have any thoughts?

Here's an excerpt of the code:

deployApp() {
inputLine=$1;
APP_SPECIFIC_DEPLOY_SCRIPT="$(echo $inputLine | cut -d ' ' -s -f1)";
BRANCH="$(echo $inputLine | cut -d ' ' -s -f2)";
JBOSS_HOM开发者_开发知识库E="$(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;
}

With that "HERE" approach, I'm getting this error: "syntax error: unexpected end of file"

Thanks a lot in advance!


Just put the functions in your here document, too:

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

x "$var"
END

[EDIT] Some comments:

  1. You say "export JBOSS_HOME" but you never define a value for the variable in the here document. You should use export JBOSS_HOME="$JBOSS_HOME". BASH will take all text between the two END, replace all variables, and send the result to SSH for processing.

    That also means the other side will see rm -f /path/to/jboss/server/*.log; the assignment to JBOSS_SERVER in the last line of the here document has no effect (at least not to the code in cleanup()).

    If you want to pass $ unmodified to the remote server, you have to escape it with \: rm -f \$JBOSS_SERVER/log/*.log

  2. You never call cleanup()

  3. There is a } missing after return 0 to finish the definition of deployapp()

There may be other problems as well. Run the script with bash -x to see what the shell actually executes. You can also add echo commands in the here document to see what the values of the variables are or you can add set -x before cleanup() to get the same output as with bash -x but from the remote side.


I don't understand why you're using cut to split the arguments to your function. Just do

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

If you don't quote your here document delimiter, the contents are expanded before they're sent to the server. That may be what you want. If you don't and you want all expansion to be done on the server side, then quote it like this:

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

If you wan't a mixture, don't quote the delimiter, but do escape those things that you want delayed expansion for:

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

What are the export statements supposed to do? I can't see that they would have any effect at all.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜