Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过bash脚本执行SSH命令_Bash_Shell_Unix - Fatal编程技术网

通过bash脚本执行SSH命令

通过bash脚本执行SSH命令,bash,shell,unix,Bash,Shell,Unix,我已经尝试了几次,但未能执行以下操作: 基本上,我需要的是在远程unixshell上执行几个顺序命令,例如使用脚本中的变量设置环境变量、移动到特定目录并在那里运行脚本等等 我尝试在脚本的部分使用printf,然后通过管道传输ssh命令,但效果不太好,而且,我也读过关于“ssh…>>END”标记的文章,这很好,但因为我使用了函数,所以效果不太好 你有什么想法吗 下面是代码的摘录: deployApp() { inputLine=$1; APP_SPECIFIC_DEPLOY_SCRIPT="$(e

我已经尝试了几次,但未能执行以下操作:

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

我尝试在脚本的部分使用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;
}
deployApp(){
输入线=$1;
应用程序特定的部署脚本=“$(echo$inputLine | cut-d'-s-f1)”;
BRANCH=“$(echo$inputLine | cut-d'-s-f2)”;
JBOSS_HOME=“$(echo$inputLine | cut-d'-s-f3)”;
基本_端口=“$(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“部署$APP\u特定的\u部署\u脚本”
回显“来自分支机构$BRANCH”
echo“在JBOSS$JBOSS_主页中”
echo“带基本端口$BASE_端口”
echo“为JBOSS使用$JAVA\u HOME\u”
如果[[-n“$JAVA_HEAP”];则
echo“使用$JAVA\u堆”
fi
回声
echo“将jboss导出到$jboss_HOME”

ssh me@$SERVER只需将函数也放在您的here文档中:

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

x "$var"
END
var=“你好,世界”

sshuser@host只需将函数也放在您的here文档中:

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

x "$var"
END
var=“你好,世界”

sshuser@host我不明白您为什么要使用
cut
将参数拆分到函数中。请这样做

APP_SPECIFIC_DEPLOY_SCRIPT=$1
BRANCH=$2
JBOSS_HOME=$3
# etc.
如果不引用here文档分隔符,则内容在发送到服务器之前会展开。这可能是您想要的。如果您不这样做,并且希望所有展开都在服务器端完成,请按如下方式引用:

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

ssh me@$SERVER我不明白您为什么要使用
cut
将参数拆分到函数中。只需这样做

APP_SPECIFIC_DEPLOY_SCRIPT=$1
BRANCH=$2
JBOSS_HOME=$3
# etc.
如果不引用here文档分隔符,则内容在发送到服务器之前会展开。这可能是您想要的。如果您不这样做,并且希望所有展开都在服务器端完成,请按如下方式引用:

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


ssh me@$SERVER运行远程ssh命令是的,我尝试过这种方法,但我有几行代码。:(运行远程ssh命令是的,我尝试过这种方法,但我有几行代码。:)(嗨,Aaron,非常感谢你的回答!不过,有一个问题,如果它在另一个函数中呢?我刚刚尝试过,但仍然遇到“意外的文件结尾”错误。对不起,我无法调试我看不到的代码。当你发布一个示例时,不要忘记错误消息,因为我的内置bash解释器非常糟糕。:-)抱歉!刚刚发布了代码和错误消息,我在原始帖子中看到了。我正在使用脚本底部提到的函数以及其他一些函数。感谢您的更新,缺少的}在代码部分的正下方。这里有一些函数,因为我正在修改原始代码以远程执行…许多事情还没有意义。非常感谢您的提示,我将继续查找。:)让事情变得更简单:你写一个脚本,用
scp
将它复制到远程服务器,然后执行它。这样,你就可以避免这里的文档中所有奇怪的事情,直到你把脚本做好。然后,你可以试着将脚本转换成这里的文档。一次打一场仗。你好,亚伦,非常感谢你的帮助您的答案!有一个问题,但是,如果它在另一个函数中呢?我刚刚尝试过,但仍然收到“意外的文件结尾”错误。对不起,我无法调试我看不到的代码。当您发布示例时,不要忘了错误消息,因为我的内置bash解释器非常糟糕。:-)对不起!刚刚发布了代码和错误消息,我在原来的帖子上看到了。我正在使用脚本底部提到的函数以及其他一些函数。感谢您的更新,缺少的}就在代码部分的正下方。这里有一些函数,因为我正在修改原始代码以远程执行。。。这么多事情还没有意义。非常感谢你的建议,我会继续找的。:)让事情变得更简单:编写一个脚本,用
scp
将它复制到远程服务器,然后执行它怎么样?这样,您就可以避免此处文档的所有奇怪之处,直到您正确地编写脚本为止。之后,您可以尝试将脚本转换为here文档。一次打一场仗。我使用cut是因为参数是从文件中获取的。导出正在远程计算机上设置环境变量,因为将在那里执行编译。另一方面,我刚刚尝试了你提到的在这里使用引号的方法,但是我仍然得到了错误。当你传递一个带引号的字符串时,如果你想拆分它,你可以执行
设置--$1
,然后使用位置参数,正如我在回答开头所示。ssh会话结束时,您正在导出的变量将丢失。感谢导出提示,我将不得不尝试另一种方法。。。我现在以以下方式发送命令:(sleep3;echo“cd$tmpDir”;sleep1;echo“echo>pwd”)| ssh me@$服务器,这基本上是我一直在寻找的,但我仍然发现一些问题,
sleep
应该没有必要。我使用cut,因为参数是从文件中获取的。导出正在远程计算机上设置环境变量,因为将在那里执行编译。另一方面,我刚刚尝试了你提到的在这里使用引号的方法,但是我仍然得到了错误。当你传递一个带引号的字符串时,如果你想拆分它,你可以执行
设置--$1
,然后使用位置参数,正如我在回答开头所示。变量哟