SSH命令通过bash脚本

时间:2010-11-19 13:58:17

标签: bash shell unix

我一直在尝试多次未能执行以下操作:

基本上,我需要的是在远程unix shell上执行几个有序命令,例如使用我在脚本上的变量设置环境变量,移动到特定目录并在那里运行脚本等等。

我尝试过将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;
}

使用“HERE”方法,我收到此错误:“语法错误:意外的文件结束”

提前多多感谢!

2 个答案:

答案 0 :(得分:4)

只需将功能放在此处的文档中:

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

x "$var"
END

[编辑] 一些评论:

  1. 您说“导出JBOSS_HOME”,但您从未在here文档中定义变量的值。您应该使用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

  4. 的定义后,deployapp()缺少bash -x

    也可能存在其他问题。使用echo运行脚本以查看shell实际执行的内容。您还可以在此处的文档中添加set -x命令以查看变量的值,或者您可以在cleanup()之前添加bash -x以获得与{{1}}相同的输出但是从偏远的一边。

答案 1 :(得分:0)

我不明白为什么你使用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语句应该做什么?我看不出它们会产生任何影响。