我正在尝试在正常运行时间监视中设置一个自定义脚本,并让此命令运行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
新代码看起来像
@'
<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;这时出人意料。
答案 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