用于解析名称Ip端口和优先级的Shell脚本

时间:2015-08-09 17:35:18

标签: bash file loops line

我有一个bash脚本,在其中我创建并执行一个python脚本,该脚本使用lxml etree来解析一个巨大的xml文件以提取以下数据:

数据可能有多个服务器,或只有一个或没有,每个服务器将有4个数据名称,IP,端口和优先级值:

name1
1.1.1.1
port#
priority 
name2
1.1.1.2
port#
priority 
name3
1.1.1.3
port#
priority 

我需要读取此文件并与文件中指定的ip和端口建立ssh连接。如果连接成功到第一个IP,我会“破解”,否则我会尝试第二个连接,依此类推......

我目前在脚本中定义了一个循环,该循环有2个特定的IP,这些IP很难设置为变量,如下所示:

echo -e "\n${YELLOW}Checking HOST SSH Connectivity.$NOCOLOR"
for HOST in $HOST1 $HOST2; do
  ERRno=0
  echo -e "${YELLOW}Attempting to connect to $HOST From $IP${NOCOLOR}"
  if cat < /dev/tcp/$HOST/22 </dev/null; then
   echo -e "\n${CYAN}Connection To $HOST Over Port 22 From ${YELLOW}$IP ${CYAN}Seem's Good. Starting SSH Session. ${YELLOW}To End SSH Session Hit CTRL-C.$NOCOLOR"
    if ! /usr/bin/ssh -c aes256-ctr -F "$SSHCONF" -p 22 "$HOST" "$CMD" ; then
     echo -e "${RED}Please Check Connectivity, SSH Session Ended.$NOCOLOR"
    fi
  else
    echo -e "${RED}Unable to connect to $HOST, Customer should make sure Port 22 Outbound is Allowed Through Firewall from $IP to $HOST.$NOCOLOR"
    ERRno=3
  fi
# If we had a good session (on the 1st server), break out, we are done
  [[ $ERRno -eq 0 ]] && break
  if [[ $HOST != $HOST1 ]]; then
    echo -e "${RED}No More Servers To Try. Unable To Establish Any SSH Session.$NOCOLOR"
    exit $ERRno
  else
    echo -e "${YELLOW}Trying Next Server...${NOCOLOR}"
  fi
done

然而,读取长度不同的文件是我感到困惑的地方。

我怎样才能做到这一点? 我应该构建和数组和索引? 我应该做一段时间读取循环吗?

请提供示例。

1 个答案:

答案 0 :(得分:0)

简单回答&#34;我如何读取不确定数量的行&#34;是一个while循环。

while read -r name && read -r address && read -r port && read -r priority; do
    : stuff
done <file

对于可用性和可读性,更常见的安排是将数据布局为每行一个记录,每个字段在单独的标记中(或者如果您有具有多个标记的字段值,则使用专用的分隔符,例如作为逗号,使您的输入成为CSV文件。)

while read -r name address port priority; do
    : stuff
done <<'__HERE'
  name1 1.1.1.1  80 25
  name2 1.1.1.2 119  3
  name3 1.1.1.3 443 50
__HERE

要使用逗号作为分隔符,(本地)将shell变量IFS设置为逗号。