如何在Bash中检测FreeRDP连接成功?批量RDP文件连接场景优化
解决FreeRDP遍历连接.rdp文件的退出码判断问题
方案一:连接建立时实时检测(推荐)
直接监控FreeRDP的输出日志,当出现连接成功的关键词时立即标记并停止后续尝试,无需依赖退出码,从根源避免退出码混乱的问题。
示例脚本
#!/bin/bash # 遍历当前目录下所有.rdp文件 for rdp_file in *.rdp; do [ -f "$rdp_file" ] || continue # 跳过非文件类型(如目录) echo "正在尝试连接: $rdp_file" # 启动FreeRDP并捕获日志输出,后台运行 xfreerdp /f /load:"$rdp_file" /log-level:INFO 2>&1 | while read -r log_line; do # 根据你的FreeRDP版本调整成功关键词,先手动运行一次确认日志内容 if echo "$log_line" | grep -qi "connected to server\|session established"; then echo "✅ 成功连接到 $rdp_file" # 创建临时标记文件,通知外层循环停止 touch /tmp/rdp_connected_success # 可选:如果仅需验证连接而非持续使用,取消下一行注释以终止进程 # pkill -P $$ xfreerdp break fi done & # 等待几秒给FreeRDP尝试连接的时间,可根据网络情况调整 sleep 6 # 检查是否连接成功 if [ -f /tmp/rdp_connected_success ]; then rm /tmp/rdp_connected_success break fi # 连接失败,清理当前脚本启动的FreeRDP进程 pkill -P $$ xfreerdp echo "❌ $rdp_file 连接失败,尝试下一个" done
关键说明
- 先手动运行
xfreerdp /load:xxx.rdp /log-level:INFO,确认连接成功时的日志关键词,替换脚本中的匹配内容 - 使用
-P $$确保只杀掉当前脚本启动的FreeRDP进程,避免误杀其他无关进程
方案二:精准匹配退出码
收集实际场景中FreeRDP「成功连接后断开」的退出码,仅在匹配到这些码时停止遍历,比模糊的-le 15更可靠。
示例脚本
#!/bin/bash # 手动收集的「成功连接后断开」的退出码(可根据实际测试补充) SUCCESS_EXIT_CODES=(0 12 13) for rdp_file in *.rdp; do [ -f "$rdp_file" ] || continue echo "尝试连接: $rdp_file" xfreerdp /f /load:"$rdp_file" exit_code=$? # 检查退出码是否在成功列表中 for code in "${SUCCESS_EXIT_CODES[@]}"; do if [ "$exit_code" -eq "$code" ]; then echo "$rdp_file 连接成功后断开,停止后续尝试" exit 0 fi done echo "$rdp_file 连接失败,退出码: $exit_code" done
关键说明
- 可自行测试不同断开场景(主动关闭窗口、登出、远程端主动断开),将对应的退出码添加到
SUCCESS_EXIT_CODES数组中 - 该方式无需监控日志,适合对退出码有明确收集的场景
内容的提问来源于stack exchange,提问作者lvl2wizard
相关产品推荐
相关产品推荐

