2013-02-20 69 views
0

我意識到查詢很簡單,互聯網上有很多類似的話題,但由於某種原因,我無法做到這一點,我我已經到了最後。批處理腳本通過SSH連接,執行一個命令,並將結果傳遞給一個OUTPUT文件

這是場景。批處理腳本將連接(使用膩子鏈接)到主機。它會執行一個命令(如檢查主機版本)。該腳本將輸出到一個文件。

到目前爲止,我可以配置其中的大部分 - 我的腳本使用一個包含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) 

甚至可以截斷在主機上運行的命令的輸出並僅顯示其一部分,如「紅帽「只是例如。

謝謝!

回答

0

您正在調用:Cmd一次而不返回。 如果你確實從以下地方回來:Cmd,你會直接進入它。 你需要結束:Cmd的與 轉到:EOF

然後,你需要把另一個 轉到:之前EOF(或GOTO) :Cmd的,這樣你就不會落入它。

你想如何看待輸出?如果您始終希望前兩個令牌使用FOR語句。

+0

嗨RGuggisberg 感謝您的提示。我會做出改變。 至於結果,我想實現以下的輸出: SERVER01 \t紅帽企業Linux服務器版本5.7 Beta版 Server02上\t Ubuntu的 server03 \t紅帽企業Linux服務器版本6 因此,這意味着。我還發現自己在試圖在腳本中嵌入時遇到了相當大的問題,所以如果這不可行,我至少要確保之間有空格。 乾杯! – stan 2013-02-21 05:57:34

0

在linux上解決你的問題比較容易,也就是說,改變腳本以便正確顯示你想要的內容。例如,您可以執行以下命令:

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

此執行主機名,呼應一個製表符和「OS」,並顯示在/ etc /問題(你可以使用/ etc/* - 發行過)。最後使用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上傳腳本,執行並刪除它。

相關問題