【问题标题】:run commands into openssl through batch通过批处理将命令运行到 openssl
【发布时间】:2014-12-12 11:21:35
【问题描述】:

我正在尝试在正常运行时间监控中设置自定义脚本,并让此命令运行 openssl 并让我传递给它的参数运行。

openssl s_client -CAfile C:\apcerts\certs\ -quiet -connect ${HOST}:${PORT} > ${TMPF} 2>&1 < EOF
<TF80DOC><XPLN/></TF80DOC>
EOF

if (Select-String "Update Level" ${TMPF} > /dev/null)
{
    exitstatus=$STATE_OK
    Select-String "Update Level" ${TMPF} | sort | uniq}
elseif (Select-String "Regulatory" ${TMPF} > /dev/null)
{
    exitstatus=$STATE_OK
    Select-String "Regulatory" ${TMPF} | sort | uniq}
else{
    echo `date` >> /tmp/caught_errs.out
    cat ${TMPF} >> /tmp/caught_errs.out
    echo " "    >> /tmp/caught_errs.out
    exitstatus=$STATE_CRITICAL
    }
rm -f ${TMPF} 2> /dev/null

exit ${exitstatus}

我希望将变量 ${host}:${port} 留空,并且我希望有一个参数,我可以手动将信息放入其中,并使用该信息填充字段。

例如,我需要连接到 blank-xml.myinfo.com:30011。

我遇到的问题是,当我在自定义监视器上进行设置时,我有一个打开 openssl 但无法打开 .txt 文件来运行给定命令的 .bat。

我需要做什么才能使它起作用。

更新:

我制作了一个批处理文件,将信息传递给 openssl,该文件要小得多。

@echo off
c:\OpenSSL-Win64\bin\openssl s_client -connect help-xml.helpme.com:443

此部分效果很好,可以在屏幕上显示所需的信息。我还需要向窗口发送另一个命令,但收到一条错误消息,指出

该命令是&lt;TF80DOC&gt;&lt;XPLN/&gt;&lt;/TF80DOC&gt; 我曾尝试使用 & 符号并在它之前使用过 echo,但仍然收到相同的错误,否则屏幕将立即弹出并关闭而没有任何信息。

if then 语句在我运行&lt;TF80DOC&gt;&lt;XPLN/&gt;&lt;/TF80DOC&gt; 后起作用,因为它包含语句正在查找的信息。但是,如果在 s_client -connect help-xml.helpme.com:443 运行后我无法将 &lt;TF80DOC&gt;&lt;XPLN/&gt;&lt;/TF80DOC&gt; 发送到 openssl,那么 if 语句将永远无法工作。

更新:

我已将powershell命令改为管道在s_client -connect help-xml.helpme.com:443之后的命令

新代码看起来像

@' 
<TF90DOC><XPLN/></TF90DOC>
'@ | C:\OpenSSL-Win64\bin\openssl s_client -quiet -connects_client -connect help-xml.helpme.com:443 > test1.txt 2>&1

if then 语句不是问题,因为我知道如何修复它。代码的 powershell 部分有效,但需要我按 Enter 键,这不是我需要的。我需要它在没有用户输入的情况下自动执行命令

对于批处理命令,我对其做了一些细微的改动,分别是

@echo off
setlocal enabledelayedexpansion 
set "var=<TF90DOC><XPLN/></TF90DOC>"

echo echo !var! | C:\OpenSSL-Win64\bin\openssl s_client -connect tf90-xml.bsi.com:443> test1.txt 2>&1 

这个命令仍然给我错误

【问题讨论】:

  • 我如何将&lt;TF80DOC&gt;&lt;XPLN/&gt;&lt;/TF80DOC&gt; 写为变量。
  • 好的,我得试试。我会让你知道会发生什么
  • 我遇到了和以前一样的问题。这是
  • 顶部的脚本是什么语言?那是PowerShell吗?重击?如果是 Powershell,请尝试使用反引号(带有 ` 字符,通常位于 [Tab] 上方)转义 &lt;&gt;。所以$xml = "&lt;TF80DOC&gt;&lt;XPLN/&gt;&lt;/TF80DOC&gt;" 不行,试试`&lt;TF80DOC`&gt;`&lt;XPLN/`&gt;`&lt;/TF80DOC`&gt;More info on escaping in PowerShell。如果您不使用 PowerShell,请忽略所有这些。这令人困惑。 Select-String 看起来像 PowerShell cmdlet,但 /dev/null 是 Linux 的东西。
  • 您似乎对基于 cmets 的代码进行了几处更改 - 您能否发布最新的代码,以便我们了解它当前 [不] 的工作情况?

标签: powershell batch-file openssl


【解决方案1】:

一开始我完全误解了你的问题,没有意识到你需要将命令发送到新打开的 openssl 实例。为了做到这一点,你需要将你想要的命令通过管道传递给 openssl。

@echo off
echo ^<TF80DOC^>^<XPLN/^>^</TF80DOC^>|c:\OpenSSL-Win64\bin\openssl s_client -connect help-xml.helpme.com:443

请注意,这是未经测试的,您可能还需要转义转义字符:

echo ^^^<TF80DOC^^^>^^^<XPLN/^^^>^^^</TF80DOC^^^>|c:\OpenSSL-Win64\bin\openssl s_client -connect help-xml.helpme.com:443

如果您需要发送多个命令,请将它们放在单独的批处理文件中,每个命令前面都有一个 echo 并将其通过管道传递给 openssl 命令,如下所示:

commands.bat

@echo off
echo echo This is one command.
echo echo This is another command.

ma​​in.bat

@echo off
commands.bat|C:\OpenSSL-Win64\bin\openssl s-client -connect help-xml.helpme.com:443

【讨论】:

  • 给出的错误是
  • @bgrif - 两天后我遇到了this answer,这似乎基本上是您正在寻找的东西,但是在 bash 中。我已编辑我的答案以更好地满足您的需求。
  • echo ^^^&lt;TF80DOC^^^&gt;^^^&lt;XPLN/^^^&gt;^^^&lt;/TF80DOC^^^&gt;|c:\OpenSSL-Win64\bin\openssl s_client -connect help-xml.helpme.com:443 命令暂停并等待用户按 Enter。这更接近我试图对命令的批处理部分执行的操作。我仍然需要没有用户输入才能完全运行。
【解决方案2】:

试试这个:(参见下面的编辑。)

@echo off
(
    echo(^^^<TF90DOC^^^>^^^<XPLN/^^^>^^^</TF90DOC^^^>
    echo;
) | C:\OpenSSL-Win64\bin\openssl s_client -connect tf90-xml.bsi.com:443 > test1.txt 2>&1

编辑:

根据您的描述,听起来 openssl 在输入该 XML 后还没有准备好立即输入,并且正在黑洞化通过管道传输到标准输入的换行符。因此,与其一次将所有内容都转储到标准输入,您需要引入某种睡眠,并听取该程序的标准输出以获得适当的提示。

这是 JScript 中的概念证明,我认为只要我知道 openssl 使用什么文本来提示 XML,然后是 Enter 按键,就可以应用它。这与WSHScriptExec StdOut Property 文档页面中描述的方法类似,并且比迄今为止尝试的任何解决方案都更加灵活。

test.bat

@if (@a==@b) @end   /*  begin multiline JScript comment

:: batch portion

@echo off
setlocal

cscript /nologo /e:JScript "%~f0"

goto :EOF
    
:: end batch portion / begin JScript */
var osh = new ActiveXObject('wscript.shell'),
    fso = new ActiveXObject('scripting.filesystemobject'),
    log = fso.CreateTextFile('output.txt', true),
    read;

var exe = osh.Exec('cmd /c test2.bat');

while (1) {
    if (!exe.StdOut.AtEndOfStream) {
        read += exe.StdOut.Read(1); // read 1 char at a time
        if (/Arg 1:/.test(read)) {
            WSH.Sleep(50);
            exe.StdIn.Write('<TF80DOC><XPLN/></TF80DOC>\n');
            WSH.Sleep(100);

            // This is the output we wish to capture.
            read = exe.StdOut.ReadLine();
            WSH.Echo(read);
            log.WriteLine(read);

            read = '';
        } else if (/Press any key/.test(read)) {
            WSH.Sleep(100);
            exe.StdIn.Write('\n');
            break;
        }
    }
    else WSH.Sleep(100);
}
log.Close();

while (!exe.Status) WSH.Sleep(100);
WSH.Echo('Done.');

test2.bat

@echo off
setlocal enabledelayedexpansion

set /P "input=Arg 1: "

echo(Input: !input!

pause

【讨论】:

  • test.bat 和 test2.bat 就像你展示的那样工作。这真的很好。我已经尝试了您建议的所有内容,但当我尝试执行所有 openssl 操作时它仍然暂停。
  • 我将继续尝试不同的方法来让它发挥作用
  • @bgrif 我有不同的想法。请参阅我的编辑。如果您需要根据您的情况定制它的帮助,请告诉我您的 XML 字符串提示的文本,无论您想要记录所有内容还是只记录特定的行,以及“按 Enter”交易的文本。
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多