【问题标题】:Code to count number of types of files on client in Unix用于计算 Unix 客户端上文件类型数量的代码
【发布时间】:2014-03-28 03:54:19
【问题描述】:

您好,我是 shell 脚本的新手。 我的要求是: 有一台服务器和 3 个客户端。在每个客户端上都会生成 4 种类型的错误日志文件。说类型 1 错误,类型 2 错误,如此类型 4 错误。 我想编写一个脚本,从服务器读取所有 3 个客户端,并为我提供在每个客户端上生成 4 种不同类型的错误日志的次数。 简而言之,它应该使用 ssh & grep 命令组合。 我已经编写了演示脚本,但它没有提供我在客户端上出现不同类型日志的次数。

#error[1]='Exception: An application error occurred during an address lookup request, please contact IT'
#error[2]='SocketTimeoutException: Read timed out'
#error[3]='Exception: The search has produced too many matches to be returned'
#error[4]='Exception: No matching address found'
error_1='exception 1'
error_2='exception 2'
function get_list_of_clients()
{
NUM_OF_CLIENTS=$(wc -l ${CLIENT_IP_LIST} | awk -F " " '{ print $1 }' )
echo $NUM_OF_CLIENTS
      if [ "${NUM_OF_CLIENTS}" -gt 0 ]
      then
            for ((row=2; row<=$NUM_OF_CLIENTS; row++))
            do
                  CLIENTS_IP=$(sed -n ${row}p ${CLIENT_IP_LIST}| awk -F " " '{print $3 }')
                  echo ${CLIENTS_IP}
 #                 get_number_of_errors
 #                 copy_count_errors
            echo ${$error_$row}
            done
      fi

}

function get_number_of_errors()
{
for((row_no=1; row_no<=4; row_no++))
do
{
/usr/bin/expect - <<- EndMark
spawn ssh root@${CLIENTS_IP} "grep $error[$row_no] var/error.log |wc -l" >> /tmp/${CLIENTS_IP}_error${row_no}.txt
match_max 50000
  expect {
  "*yes/no*" {
   send -- "yes\r"
   send -- "\r"
   exp_continue
}
  "*?assword:*" {
   send -- "${CLIENT_PASSWORD}\r"
   send -- "\r"
     }

}
expect eof
EndMark
}
done
}


function copy_count_errors()
{
/usr/bin/expect - <<- EndMark
spawn scp root@${CLIENTS_IP}:/tmp/${CLIENTS_IP}* /tmp/
match_max 50000
  expect {
  "*yes/no*" {
   send -- "yes\r"
   send -- "\r"
   exp_continue
}
  "*?assword:*" {
   send -- "${CLIENT_PASSWORD}\r"
   send -- "\r"
  }
}
expect eof
EndMark
}

get_list_of_clients

================================================ ================================== 请帮忙。

【问题讨论】:

    标签: bash unix ssh awk


    【解决方案1】:

    这并不是真正的答案,而是试图帮助您获得自己的答案。

    问题

    如果我理解正确:

    1. 您的脚本在服务器上运行
    2. 您有三个客户端,每个客户端都有日志文件
    3. 您的客户端列表位于一个名为 $CLIENT_IP_LIST 的文件中,其中 IP 是第三个字段,第一行是您想要排除的某种标头。

    建议

    • 您似乎需要对客户端进行 sshscp。如果可能,我建议在您的服务器和客户端之间设置SSH Public Key Authentication。这将大大简化您的脚本。
    • 通过 scpssh 命令使用 -C 标志进行压缩。
    • 您应该将日志文件从客户端复制到服务器并在服务器上进行处理。
    • 如果可以选择不同的脚本语言比如PythonTcl(你用的是Expect,真的是Tcl)。 Bash 可以解决您的问题,但您会发现其他语言效果更好。当然,这是我的看法。
    • 先解决一块拼图,然后再继续下一块。例如,目前,您的 get_list_of_clients() 功能还不能正常工作。

    话虽如此,这里是对get_list_of_clients 的重写,我对其进行了测试,它在我对您的$CLIENT_IP_LIST 文件的假设范围内有效:

    function get_list_of_clients() {
        let row=1
        while read line
        do
            if (( row > 1 ))
            then
                set $line # Breaks line into pieces
                CLIENT_IP="$3"
                echo "$CLIENT_IP"
            fi
            let row=row+1
        done < $CLIENT_IP_LIST
    }
    

    【讨论】:

    • 感谢 Hai Vu 的建议。我有另一个查询,我正在尝试将 $(spawn ssh root@${CLIENTS_IP} "grep ${error[$row_no]} /var/error.log |wc-l" ) 的值存储在一个变量 var var =$(spawn ssh root@${CLIENTS_IP} "grep ${error[$row_no]} /var/error.log |wc-l" ) & 然后尝试回显 var 但它发生了。您能否建议将 $(spawn ssh root@${CLIENTS_IP} "grep ${error[$row_no]} /var/error.log |wc-l" ) 的值存储在变量中的任何方法。如果发生这种情况,我想我可以通过它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2012-02-08
    相关资源
    最近更新 更多