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
设置为逗号。
我有一个 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
设置为逗号。