用于计算Unix上客户端上文件类型数的代码

时间:2014-03-27 17:42:26

标签: bash unix ssh awk

您好我是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

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

1 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,是一种帮助你获得自己的答案。

问题

如果我理解正确的话:

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

    • 您似乎需要 ssh scp 到客户端。如果可能,我建议您在服务器和客户端之间设置SSH Public Key Authentication。这将大大简化您的脚本。
    • 使用 scp ssh 命令对-C标志进行压缩。
    • 您应该将日志文件从客户端复制到服务器并在服务器上进行处理。
    • 如果您可以选择其他脚本语言,例如 Python Tcl (您使用期望,这实际上是 Tcl < / em>的)。 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
    }