Bash脚本执行openssl命令后循环提前退出的问题求助
解决Bash脚本中openssl命令导致循环提前退出的问题
问题原因
你的脚本里,openssl s_client默认会读取标准输入(stdin),而while read循环正是从服务器列表文件中获取stdin。当openssl s_client执行时,它会把列表文件中剩余的所有行当作输入消耗掉,导致后续的read命令没有数据可读,循环直接提前终止。
解决方法
方法1:给openssl重定向输入到/dev/null
直接修改openssl s_client命令,将其输入重定向到/dev/null,让它不再占用脚本的stdin:
openssl s_client -connect "$server_name:$server_port" -servername "$server_name" 2> /dev/null < /dev/null | openssl x509 -noout -dates
方法2:优化服务器地址分割(可选)
原脚本用两次cut分割server:port的操作可以简化,直接用read命令结合IFS完成分割:
while IFS=: read -r server_name server_port; do echo "Checking server: $server_name, port: $server_port" # 这里放修改后的openssl命令 echo "------------------------" done < "$server_list_file"
修改后的完整脚本
#!/bin/bash # Check if at least one argument (server list file) is provided if [ $# -lt 1 ]; then echo "Usage: $0 server_list_file" exit 1 fi # Input file containing server names and port numbers (server:port) server_list_file="$1" # Check if the input file exists if [ ! -f "$server_list_file" ]; then echo "Error: Server list file '$server_list_file' not found." exit 1 fi # Loop through each line in the server list file while IFS=: read -r server_name server_port; do echo "Checking server: $server_name, port: $server_port" # 重定向输入到/dev/null,避免占用stdin openssl s_client -connect "$server_name:$server_port" -servername "$server_name" 2> /dev/null < /dev/null | openssl x509 -noout -dates # Add a separator line between server checks echo "------------------------" done < "$server_list_file"
验证效果
运行修改后的脚本,就能正常遍历所有服务器条目,输出符合预期的证书有效期信息。
内容的提问来源于stack exchange,提问作者Geekzy
相关产品推荐
相关产品推荐

