0

クエリは単純で、インターネット上には同様のトピックがたくさんあることに気付きましたが、何らかの理由でこれを機能させることができず、私は最後にいます。

これがシナリオです。バッチ スクリプトは (パテ リンクを使用して) ホストに接続します。コマンドを実行します(ホストバージョンの確認など)。スクリプトは出力をファイルに取り込みます。

これまでのところ、ほとんどの構成を行うことができました - 私のスクリプトはプールを使用します - IP を保持するソースファイルで、接続する必要があるホストを読み取ります。ホストに接続します。check version コマンドを実行し、結果をファイルに保存します。ただし、結果の形式が正しくなく、出力ファイルで見たい形式にすることができません。

これは私のコードです:

: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

あなたは :Cmd を一度呼び出しており、戻っていません。もしあなたが :Cmd から戻ってきたら、あなたはそれに陥るでしょう。:Cmd を goto :eof で終了する必要があります

次に、別の goto :eof (またはいくつかの goto) を :Cmd の前に配置して、それに陥らないようにする必要があります。

出力をどのように表示しますか? 最初の 2 つのトークンが常に必要な場合は、FOR ステートメントを使用します。

于 2013-02-20T22:59:50.333 に答える
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 に答える