我一直在尝试多次未能执行以下操作:
基本上,我需要的是在远程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”方法,我收到此错误:“语法错误:意外的文件结束”
提前多多感谢!
答案 0 :(得分:4)
只需将功能放在此处的文档中:
var="Hello World"
ssh user@host <<END
x() {
print "x function with args=$*"
}
x "$var"
END
[编辑] 一些评论:
您说“导出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
您永远不会致电cleanup()
}
完成return 0
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
语句应该做什么?我看不出它们会产生任何影响。