0

我意识到查询很简单,互联网上有很多类似的主题,但由于某种原因,我无法完成这项工作,我已经走到了尽头。

这就是场景。批处理脚本将(使用 putty 链接)连接到主机。它将执行一个命令(如检查主机版本)。该脚本会将输出带到一个文件中。

到目前为止,我能够配置其中的大部分内容——我的脚本使用一个池——包含 IP 的源文件,以读取它需要连接到的主机;它连接到主机;执行检查版本命令并将结果保存到文件中。但是,结果格式错误,我无法在输出文件中显示我想看到的格式。

这是我的代码:

:Var
set out=E:\output.txt
set src=E:\servers.txt
set ver=cat /etc/*-release
set creds=-l root -pw root
set host=hostname
:Cond
for /f %%i in (%src%) do call :Cmd %%i
:Cmd
plink -ssh %1 %creds% %host%
plink -ssh %1 %creds% %ver%
echo %1 is %ver% >> %out%

结果是这样的:

server01Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)
server02Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)

所以我想让它的格式正确,例如:

server01 OS:Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)
server02 OS:Red Hat Enterprise Linux Server release 5.7 Beta (Tikanga)

甚至能够截断在主机上运行的命令的输出并仅显示它的一部分,例如“Red Hat”。

谢谢!

4

2 回答 2

0

在 linux 端解决您的问题更容易,即更改脚本,使其准确显示您想要的内容。例如,您可以执行以下命令:

(hostname;echo -e "\tOS:";cat /etc/issue)|sed '{:q;N;s/\n//g;t q}'

这将执行主机名,回显一个制表符和“OS:”,并显示 /etc/issue(您也可以使用 /etc/*-release)。最后,使用 sed 从结果中删除所有换行符。(你也可以使用tr "\n" ""

如果要使用 plink 执行此操作,则需要确保正确转义|批处理文件中的字符。我没有关闭 Windows 机器,但它可能看起来像这样:

plink -ssh %1 %creds% ^(hostname;echo -e "\tOS:";cat /etc/issue^)^|sed '{:q;N;s/\n//g;t q}'

我不确定我是否正确地逃脱了它。将命令存储在文件中然后执行它会更容易。您甚至可以使用 scp 上传脚本,执行并删除它。

于 2013-02-23T16:04:58.580 回答
0

您正在调用 :Cmd 一次并且没有返回。如果你确实从 :Cmd 返回,你就会陷入其中。你需要用 goto :eof 结束 :Cmd

然后你需要在 :Cmd 之前放置另一个 goto :eof (或一些 goto ),这样你就不会陷入其中。

你希望输出看起来如何?如果您总是想要前 2 个标记,请使用 FOR 语句。

于 2013-02-20T22:59:50.333 回答