我有一个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
然而,读取长度不同的文件是我感到困惑的地方。
我怎样才能做到这一点? 我应该构建和数组和索引? 我应该做一段时间读取循环吗?
请提供示例。
答案 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
设置为逗号。