You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:34:56