web-dev-qa-db-ja.com

リモートマシンをsshし、topコマンドの出力を出力するシェルスクリプト

次の4つのことを行うシェルスクリプトを書きたいと思います。

  1. リモートマシンをssh(たとえばhosti)
  2. マシン名をファイルに出力します(top_out)
  3. 'top'コマンドの出力の最初の数行をステップ2と同じファイルに出力します
  4. 他のマシンに対して1〜3を繰り返します

私はこれを試しました:

#! /bin/bash

for i in 1 2 3 4 5 6 7 8

do
    echo "Host$i" >> ~/mysh/top_out
    ssh Host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"
    echo "done"
done

私が入手した出力ファイルは、一部のマシン(たとえば、Host5-8)の最上位の出力を保存していましたが、Host1-4のような初期のマシンでは空白でした。 「echo "Host $ i" >>〜/ mysh/top_out」という行なしで試してみると、すべてのHost1-8のトップ出力を取得できます。

6
user3154564

あなたがするとき

ssh Host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"

ローカルマシンではなく、リモートホストの~/mysh/top_outに出力を書き込んでいます。リモートホストは、ローカルマシンと同じ物理ホームディレクトリを使用していない可能性があります。一部のマシンでホームディレクトリを共有しているNFSなどがある場合は、説明した症状が表示されます。

やってみてください

ssh Host$i "top -n1 -b | head -n 15" >> ~/mysh/top_out

代わりに、または物事を少しきれいにするために、多分

#!/bin/bash

for i in $(seq 1 8); do
    (echo "Host$i"
     ssh Host$i "top -n1 -b | head -n 15") >> ~/mysh/top_out
    echo "done Host$i"
done
7
andrewdotn

期待スクリプトを試して、接続後に各ホストの出力を保存することができます。さらにコマンドを追加することもできます。 :これは、すべてのホストで同じユーザー名とパスワードを使用していることを前提としています。

#/usr/bin/expect -f

#write your hosts on a new line inside a file and save it in your workging directory as:

#Host 1
#Host 2
#Host 3

#user '' for password if it contains special chars
#pass arguments to the script as ./script $username '$password' $hosttxt
set user [lindex $argv 0]
set pass [lindex $argv 1]
#pass path to txt file with line separated hosts
set fhost [lindex $argv 2]
#set this to the  path where you need to save the output e.g /home/user/output.txt
set wd "/home/$user/log.txt"
#open hosts file for parsing
set fhosts [open $fhost r]
exec clear
#set loguser 1

proc get_top {filename line user pass} {
     spawn ssh -l $user $line
      expect {
          "$ " {}
      "(yes/no)? " {
            send "yes\r"
            expect -re "assword:|assword: "
            send "$pass\r"
      }
     -re "assword:|assword: " {
            send "$pass\r"
      }
     default {
        send_user "Login failed\n"
     exit 1
    }
  }
  expect "$ " {}
  send "top -n1 -b | head -n 15\r"
  expect -re "\r\n(.*)\r(.*)(\\\$ |# )"  {
       set outcome "$expect_out(1,string)\r"
       send "\r"
  }

  puts $filename "$outcome\n\n-------\n"
}


 while {[gets $fhosts line] !=-1} {
       set filename [open $wd "a+"]
       get_top $filename $line $user $pass
       close $filename
 }
2
Victor Palade

出力を取得していないホストに次のエラーが表示されているかどうかを確認します。

TERM環境変数が設定されていません。

一部のホストでこのエラーが発生する場合は、次のコマンドを試すことができます。

ssh user @ Host "screen -r; top" >> file_where_you_want_to_save_output

0
Chinmay Inamdar