batch-file - GnuWin32 openssl s_client 连接到 WebSphere MQ 服务器未在 EOF 关闭,挂起

标签 batch-file openssl ibm-mq gnuwin32

我正在尝试使用 GnuWin32 版本的 OpenSSL 从多个 WebSphere MQ 队列管理器获取证书。所有尝试都会导致 OpenSSL 保持连接打开,直到我手动按下 ENTER。

我尝试将各种文本输入命令 as per this SO questionthis SO question , 但没有运气。

理想情况下,OpenSSL 会在输入文件或管道文本达到 EOF 时关闭连接。

例子:

echo QUIT | openssl s_client -connect qmgrhost:1414 -showcerts 

openssl s_client -connect qmgrhost:1414 -showcerts < responsefile.txt

使用 QUIT 命令的示例似乎在另一个 SO 问题中有效,因为它们正在访问 HTTP 服务器。因为在我的例子中这是 WMQ,连接握手是不同的,发送 QUIT(或我试过的任何其他东西)并不能关闭连接。我可能会向它提供一个巨大的文件,直到 QMgr 阻塞并终止连接,但我试图对服务器尽可能礼貌。当前从键盘提供 ENTER 的方法导致 FDC 原样在每个连接上转储,引发各种警报并让 Tivoli 人员生我的气。

所以最好的情况是 QMgr 将字符串或十六进制值解释为正常拒绝并关闭连接。第二好的情况是任何允许编写脚本的方法,我们将接受 FDC 文件作为自动化此功能的成本。

更新:2013 年 5 月 31 日
从那以后,我搬到了 AIX,它工作得很好。当在脚本中运行并通过管道将换行符输入其中时,s_client 在建立连接后立即挂断。但是,我仍然想要一个适用于 Windows 的解决方案。有谁知道 Cygwin 版本是否有效或有同样的问题?是 Windows 信号/POSIX 问题吗?代码错误?

最佳答案

这个问题似乎与批处理文件和 openssl.exe 程序之间的同步问题有关。我需要您的合作才能进行一些测试并报告结果。下面是用于第一次测试的 Batch-JScript 混合脚本。 JScript 部分有两个部分;第一个 WScript.Stdout.WriteLine("QUIT"); 完全等同于 echo QUIT 批处理命令。第二部分(两行)类似,但它使用“QUIT”和 Enter 键加载键盘缓冲区,而不是通过 STDOUT 发送字符串。

我需要您对 JScript 代码的两个部分进行测试并报告结果(双斜杠 // 将行的其余部分标记为注释)。如果幸运的话,openssl.exe 程序将以 Sendkeys 方法结束;如果没有,请尝试通过 STDOUT 发送“QUIT”字符串,然后使用 Sendkeys 键入回车键。如果 openssl.exe 程序在返回所需信息之前终止,那么问题几乎就解决了,因为在这种情况下,我们可以同步发送 Enter 键,直到从 收到所需信息为止openssl.exe.

将以下内容保存为 .bat 文件。尝试一下,然后注释掉 Wscript 行,取消注释 WshShell 行,然后再试一次。

@if (@CodeSection == @Batch) @then

:: The first line above is...
:: in Batch: a valid IF command that does nothing.
:: in JScript: a conditional compilation IF statemente that is false,
::             so this section is omitted until next "at-sign end".

@echo off
CScript //nologo //E:JScript "%~F0" | openssl s_client -connect qmgrhost:1414 -showcerts 
goto :EOF


@end


// JScript section

WScript.Stdout.WriteLine("QUIT");

// var WshShell = WScript.CreateObject("WScript.Shell");
// WshShell.SendKeys("QUIT{ENTER}");

您也可以尝试使用 String.fromCharCode(26)WriteLineSendkeys 中生成 Ctrl-Z (EOF) 字符> 方法;例如:

WshShell.SendKeys("QUIT{ENTER}" + String.fromCharCode(26));

关于batch-file - GnuWin32 openssl s_client 连接到 WebSphere MQ 服务器未在 EOF 关闭,挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16823068/

相关文章:

c++ - 将类方法设置为 OpenSSL 回调

使用 MQ 的 Java 存储过程

java - 在java程序中运行批处理文件

batch-file - 在FOR循环中设置变量并调用结果;批处理脚本窗口

batch-file - 批处理文件执行命令前加1

apache - SSL 应用于太多域

android - 缺少 .bat 文件

c# - 从 C# 执行多个命令提示符命令

c# - 在没有 MQ 客户端的情况下使用 XMS .Net 连接到 MQ

ibm-mq - 更改 channel 名称