通过批处理将命令运行到openssl中

时间:2014-12-04 15:57:34

标签: powershell batch-file openssl

我正在尝试在正常运行时间监视中设置一个自定义脚本,并让此命令运行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的.bat但无法打开.txt文件来运行给定的命令。

我需要做些什么才能使其发挥作用。

更新

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

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

此部分可在屏幕上显示所需的大量信息。我还需要向窗口发送另一个命令但是得到一个错误,说明&lt;命令不是可执行文件或批处理过程。

该命令是<TF80DOC><XPLN/></TF80DOC>我试过使用&amp;符号并且在它之前使用过回声但仍然出现相同的错误,或者屏幕会立即弹出并关闭而没有任何信息。

if then语句在我运行<TF80DOC><XPLN/></TF80DOC>之后起作用,因为它具有语句正在查找的信息。但是如果在<TF80DOC><XPLN/></TF80DOC>运行后我无法将s_client -connect help-xml.helpme.com:443发送到openssl,则if语句将永远不会起作用。

更新

我在s_client -connect help-xml.helpme.com:443

之后将powershell命令更改为管道中的管道

新代码看起来像

@' 
<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部分有效,但要求我按下输入,这不是我需要它做的。我需要它在没有用户输入的情况下自动执行命令

对于批处理命令,我对它进行了一些细微的修改,即

@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;这时出人意料。

2 个答案:

答案 0 :(得分:1)

我一开始完全误解了你的问题,并没有意识到你需要将命令发送到新打开的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.

<强> main.bat

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

答案 1 :(得分:1)

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

@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之后还没有准备好立即输入,并且将换行符输入到stdin。因此,不是一次性将所有内容都转储到stdin,而是需要引入某种类型的睡眠,并听取该程序的标准输入以获得适当的提示。

这里是JScript中的概念证明,我认为只要我知道openssl用于提示XML的文本,然后用于 Enter keypress,就可以应用它。这与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