2014-01-06 181 views
6

我想寫一個shell腳本來做到以下四件事情:shell腳本SSH遠程計算機並打印top命令的輸出

  1. SSH遠程機器(說hosti)
  2. 打印機名稱到一個文件(top_out)
  3. 打印的「頂部」命令的輸出到同一文件的前幾行按照在步驟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)輸出文件,但它是空白的,爭取早日machinessay像host1-4。如果我嘗試不使用「echo」主機$ i「>>〜/ mysh/top_out」這一行,我可以得到所有host1-8的最高輸出。

+0

最好的,包括在你的腳本的頂部爲「零」出該文件每次運行(至少在測試),也就是'回聲> 〜/ mysh/top_out'。祝你好運。 – shellter

+0

你需要改變這個:'ssh host $ i「top -n1 -b | head -n 15 >>〜/ mysh/top_out」'to this:'ssh host $ i「top -n1 -b | head - 「〜〜/ mysh/top_out」,即'〜〜/ mysh/top_out'需要在引號之外。 – bluesmoon

+0

文件〜/ mysh/top_out需要駐留在host1-htos8中,還是應該駐留在執行ssh的本地主機中? – alvits

回答

6

當你

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 
+0

這個工程!謝謝。 – user3154564

0

檢查主機你沒有得到的輸出顯示以下錯誤,其中:

TERM environment variable not set.

如果某些主機出現此錯誤,您可以嘗試以下命令:

ssh [email protected] "screen -r; top" >> file_where_you_want_to_save_output

2

您可以嘗試一個expect腳本來保存每個主機連接到它後的輸出,您也可以爲它添加更多的命令,p.s. :這裏假設你有所有主機的相同用戶名和密碼:

#/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 
} 
相關問題