首页 > 解决方案 > 如何在远程服务器内设置变量值

问题描述

在远程服务器内部,我有一个条件语句。如果该条件通过,状态值应设置为成功。

但是在这里我总是在打印状态变量时收到失败响应

状态='成功';

status='Success';

# !/bin/bash

declare -a server_PP=('XXXXX' 'YYYYYYY' );
declare -A results_map;


function process(){
serverList=$1[@];
servers=("${!serverList}");
status='Failure';
for  serverName in "${servers[@]}"
do
    ssh  $serverName  <<  EOF
          if [ -f /app/Release/abc.war ]; then
            echo "available - success"
            status='Success';
          fi
echo "***********status-inside******$status"
        exit
EOF
echo "***********status-outside******$status"
results_map+=([$serverName]=$status);
done

}


process 'server_PP'

for i in "${!results_map[@]}"
do
  echo "key :" $i
  echo "value:" ${results_map[$i]}
done

当满足该条件时,状态变量应设置为成功。

标签: shellunix

解决方案


正如 pcarter 的评论中所写,两个系统上的变量彼此独立,不会通过ssh. 您可以使用由ssh.

以下脚本与原始脚本接近。有关进一步的改进,请参见下文。

# !/bin/bash

declare -a server_PP=('XXXXX' 'YYYYYYY' );
declare -A results_map;


function process(){
serverList=$1[@];
servers=("${!serverList}");
status='Failure';
for  serverName in "${servers[@]}"
do
    if ssh  $serverName  <<  EOF
        if [ -f /app/Release/abc.war ]; then
            echo "available - success"
            exit 0;
        fi
        echo "error"
        exit 1
EOF
    then
        status='Success'
    else
        status='Failure'
    fi
echo "***********status-outside******$status"
results_map+=([$serverName]=$status);
done
}


process 'server_PP'

for i in "${!results_map[@]}"
do
  echo "key :" $i
  echo "value:" ${results_map[$i]}
done

由于您不再需要变量分配,您甚至可以在远程命令中省略if ...and 。exit

    if ssh  $serverName  <<  EOF
        [ -f /app/Release/abc.war ]
EOF
    then
...

您使用heredoc的方法

ssh hostname <<EOF 
# commands ...
EOF

缺点是您在远程系统上运行交互式 shell,它可能会在执行命令之前打印一些系统信息或欢迎消息。您可以通过将命令或脚本指定为ssh.

    if ssh  $serverName  [ -f /app/Release/abc.war ]
    then
...

如果您的命令序列较长,您可以在远程系统上创建一个脚本并以与ssh hostname scriptname. ssh您还可以使用或在远程系统上创建脚本scp


推荐阅读