centos bash -使用命令行参数(主机名)运行外部命令

g9icjywg  于 2022-11-07  发布在  其他
关注(0)|答案(3)|浏览(132)

第一次张贴,请原谅任何遗漏的信息。
我有一个脚本,应该与icinga工作。我需要icinga登录到我的Linux盒子,并运行一个命令,如“脚本“。脚本将运行一个命令,如sudo /etc/init.d/apache 2状态,然后报告回“正在运行或未使用”和退出状态0或2。我'我想知道如何添加另一个命令,并根据给定的主机名运行其中一个命令,其中一半需要运行apache 2,另一半需要运行一个名为dss的进程。我不希望有两个单独的脚本。这是工作脚本,对不起,它是草率的,但我还没有做任何清理,我还不太擅长bash。
以便用户运行脚本。/chkdss 2或


# !/bin/bash

ec=0
ec1=2
var3=run
var4=unused

for host in "$@"
do
  var1=`ssh $host sudo /etc/init.d/dss status|awk '{print $6}'`
  var2="$( echo $var1 | cut -c 3-5 )"
if [[ "$var2" == "$var3" ]]; then
    echo "$host is running"
    echo $ec
  else
    echo "$host is not running"
    echo $ec1
fi
done
q3qa4bjr

q3qa4bjr1#

有几种方法可以测试一个特定的主机名是apache的还是dss的,你只需要有一个主机名列表,然后检查接收到的主机名是否包含在列表中。

方法1:使用数组


# !/bin/bash

# Method 1, using array lists of hosts

apachehosts=('ap1' 'ap2' 'ap3')
dsshosts=('dss1' 'dss2' 'dss3')

for host in "$@"
do
    if printf '%s\n' "${apachehosts[@]}" | grep -Fxq "$host"
    then
        echo "$host: APACHE HOST"
    elif printf '%s\n' "${dsshosts[@]}" | grep -Fxq "$host"
    then
        echo "$host: DSS HOST"
    else
        echo "ERROR, $host: unknown host"
    fi
done

要修改主机列表,只需在数组apachehostsdsshosts的声明中添加或删除值。

方法2:使用case


# !/bin/bash

# Method 2, using case

for host in "$@"
do
    case "$host" in
        'ap1'|'ap2'|'ap3')
            echo "CASE, $host: APACHE HOST"
            ;;
        'dss1'|'dss2'|'dss3')
            echo "CASE, $host: DSS HOST"
            ;;
        *)
            echo "ERROR CASE, $host: unknown host"
            ;;
    esac
done

在此,您可以编辑每种情况下的样式。

**方法3:**使用if


# !/bin/bash

# Method 3, using if

for host in "$@"
do
    if [[ "$host" == 'ap1' || "$host" == 'ap2' || "$host" == 'ap3' ]]
    then
        echo "IF, $host: APACHE HOST"
    elif [[ "$host" == 'dss1' || "$host" == 'dss2' || "$host" == 'dss3' ]]
    then
        echo "IF, $host: DSS HOST"
    else
        echo "IF, $host: unknown host"
    fi
done

这里你修改了if条件。我更喜欢其他的方法,因为这个方法编辑起来更复杂,不太清楚,特别是当你的主机列表很长的时候。

方法4:主机名的条件

如果你幸运的话,你的主机名会有一些模式。例如,所有的Apache服务器都以字母ap开头,所有的dss服务器都在名称中包含dss,...
然后,您可以简单地使用2个if语句来确定哪个是哪个。


# !/bin/bash

# Method 4, patterns

for host in "$@"
do
    if [[ $(echo "$host" | grep -c -e "^ap") -ne 0 ]]
    then
        echo "PATTERNS, $host: APACHE HOST"
    elif [[ $(echo "$host" | grep -c -e "dss") -ne 0 ]]
    then
        echo "PATTERNS, $host: DSS host"
    else
        echo "PATTERNS, $host: unknown host"
    fi
done

注意:hostname apdss1在这里会显示为Apache服务器。以前的方法会响应“unknown host”。您的模式必须足够严格以避免不匹配。

2ic8powd

2ic8powd2#

我有一个类似的任务,使用一个ssh请求获得几个报告项。
我不得不在singel ssh中检索命令:
1.完整主机名(FQDN)

  1. Linux版本
    1.其Docker主机的IP地址(如果存在),或“无”
    我剧本分三个阶段完成
1.从远程主机获取多行信息
ssh -q dudi-HP-Compaq-Elite-8300-MT  <<< '
date +%F:%T   # line 1: time stamp
hostname -f     # line 2: hostname 
awk  "/DESCR/{print \$3}" /etc/lsb-release # line 3 : host linux distribution version
ip a | awk "/inet / && !/127.0.0.1/{sub(\"/.*\",\"\",\$2);printf(\"%s \", \$2)}"      # line 4: list IP address to the host
'
结果:
2022-03-05:22:22:21
dudi-HP-Compaq-Elite-8300-MT
20
192.168.2.111 192.168.122.1 172.17.0.1

2.处理来自远程主机的多行信息

从远程主机读取各行信息,放入数组sshResultsArr中。

readarray -t sshResultsArr < <(ssh -q dudi-HP-Compaq-Elite-8300-MT  <<< '
date +%F:%T   # line 1: time stamp
hostname -f     # line 2: hostname 
awk  "/DESCR/{print \$3}" /etc/lsb-release # line 3 : host linux distribution version
ip a | awk "/inet / && !/127.0.0.1/{sub(\"/.*\",\"\",\$2);printf(\"%s \", \$2)}"      # line 4: list IP address to the host
')
hostname=${sshResultsArr[1]}
osVersion=${sshResultsArr[2]}
hasDockerIp=$(grep -Eo "172(.[[:digit:]]{1,3}){3}" <<< "${sshResultsArr[3]}") # find IP starting with 172
hasDockerIp=${hasDockerIp:="none"} # if not found IP set to "NONE"

printf "%s \t OS version: %s \t has Docker IP: %s\n" "$hostname" "$osVersion" "$hasDockerIp"
结果:
dudi-HP-Compaq-Elite-8300-MT     OS version: 20          has Docker IP: 172.17.0.1

3.循环处理每个远程主机


# !/bin/bash

for host in "$@"; do
  readarray -t sshResultsArr < <(ssh -q $host  <<< '
  date +%F:%T   # line 1: time stamp
  hostname -f     # line 2: hostname 
  awk  "/DESCR/{print \$3}" /etc/lsb-release # line 3 : host linux distribution version
  ip a | awk "/inet / && !/127.0.0.1/{sub(\"/.*\",\"\",\$2);printf(\"%s \", \$2)}"      # line 4: list IP address to the host
  ')
  hostname=${sshResultsArr[1]}
  osVersion=${sshResultsArr[2]}
  hasDockerIp=$(grep -Eo "172(.[[:digit:]]{1,3}){3}" <<< "${sshResultsArr[3]}") # find IP starting with 172
  hasDockerIp=${hasDockerIp:="none"} # if not found IP set to "NONE"

  printf "%s \t OS version: %s \t has Docker IP: %s\n" "$hostname" "$osVersion" "$hasDockerIp"
done
5t7ly7z5

5t7ly7z53#

我能够从我收到的答案中提取一点,并整理出一些效果很好的东西。谢谢你们所有人的答案。

for host in "$@"
do
    case "$host" in
       ('vho1uc1-primary'|'vho1uc2-backup'|'vho2uc1-primary'|'vho2uc2-backup'|'vho3uc1-primary'|'vho3uc2-backup'|'vho10uc1-primary')
          var1=`ssh "$host" sudo /etc/init.d/apache2 status|awk '{print $4}'`
          var2="$( echo $var1 | cut -c 3-5 )"
            if [[ "$var2" == "$var3" ]]; then
          echo "Apache2 on $host is running"
          echo "0"
            else
          echo "Apache2 on $host is not running"
          echo "2"
          fi
          ;;
       *)
    esac
done

相关问题