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

Shell script to parse Names Ip port and priority

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

数据可能有多个服务器或只有一个或none并且每个服务器将有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 成功,我会 "break",否则我会尝试第二个连接,依此类推...

我目前在脚本中定义了一个循环,它有 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

然而,阅读一个长度可能不同的文件是我感到困惑的地方。

我怎样才能做到这一点? 我应该构建数组和索引吗? 我应该做一个 while read 循环吗?

无论哪种方式,请提供示例。

"how do I read an indeterminate number of lines" 的简单答案是 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 设置为逗号。