Ssh

在伺服器列表上執行 ping 命令並輸出到文件

  • June 26, 2016

servers.txt在另一台伺服器上有一個文件,其中包含伺服器列表:

server1.mydomain.com
server2.mydomain.com
server3.mydomain.com

我想先下載這個 txt 文件,ping 這些伺服器並將 ping 結果輸出到一個文件中。我想每隔 x 秒在一個無限循環上執行此操作。

我有一個 VPS 登錄名,到目前為止,我已經想出使用一個名為putty.exe.

我應該如何處理這個?我想我應該編寫一個腳本並將伺服器設置為每 x 秒執行一次或使用 while 循環。

好的,我相信我現在明白你的問題了。

在主機 1 上

讓我們假設您必須通過host1您連接的主機,在此主機上安裝或(從包管理器,它們應該在那裡)。我建議,因為它對初學者來說更容易一些。ssh``putty``screen``tmux``screen

此外,您需要能夠登錄host2from,host1因此您需要設置一個ssh key允許無需密碼登錄。要執行此操作,您需要執行:

ssh-keygen -f ~/.ssh/host1tohost2

它將要求輸入密碼,要自動執行腳本(無需手動輸入密碼),您應將其設置為空密碼。 保持 host1 的安全!多虧了這個關鍵,任何人都host1可以控制host2(在使用者權限允許的範圍內)。

該命令將生成以下文件:

~/.ssh/host1tohost2
~/.ssh/host1tohost2.pub

您應複製~/.ssh/host1tohost2.pubhost2

scp ~/.ssh/host1tohost2.pub me@host2:~

在主機 2 上

~/.ssh在 host2 中創建並移動host1tohost2.pub到那裡,然後在該目錄中創建一個名為的文件authorized_keys

mkdir -f ~/.ssh
mv ~/host1tohost2.pub ~/.ssh
cd ~/.ssh
cat host1tohost2.pub >> authorized_keys

這允許在host1沒有host2互動式密碼提示的情況下登錄。

下一個,

讓我們假設文件servers.txt位於/home/me/myservers/servers.txton host2。這個假設是必要的,因為我們將path在腳本中使用它host1

返回主機1

您需要的無限循環腳本是:

#!/bin/sh

X_SECONDS=6
LOGFILE=~/mypings.log

while ((1)); do
   # >$LOGFILE  # clear log file (see comments)
   ssh -i ~/.ssh/host1tohost2 me@host2 'cat /home/me/myservers/servers.txt' |
   while read x; do
       echo "ping to $x"
       ping -c1 $x >> $LOGFILE
   done
   sleep $X_SECONDS
done

讓我們假設這個腳本被保存到一個名為pingservers.sh. 但是不要執行它,因為一旦你關閉它就會停止putty。現在screen進入現場(您安裝了它,對嗎?)。跑:

screen

顯然沒有任何變化。您現在處於shell通過 a 訪問的 asocket中,如果您從它然後關閉/var/run,此 shell 將不會關閉一次(實際上,如果您只是關閉作業系統會解決問題並且不會關閉 shell,但讓我們做一個適合教育原因)。在分離之前是時候執行了:detach``putty``putty``detach

./pingservers.sh

它將永遠執行,並echo在寫入日誌文件時保留幾條消息。

要與您分離,screen您需要輸入Ctrl+A D(按住Ctrl、按下A、釋放Ctrl和按下D)。你又回到了原來的shell登錄狀態putty,你現在可以關門putty喝杯咖啡了。

一旦您重新登錄到host1文件~/mypings.log,將使用越來越多的 ping 進行更新(無需screen再次執行)。要實時檢查正在更新的文件,您可以使用:

tail -f ~/mypings.log

arch linux wiki通常有更多關於 ssh-keygen 和 ssh 密鑰的有用資訊,關於gnu screen也是如此。這兩篇文章是這兩個程序的極好資訊來源。

引用自:https://unix.stackexchange.com/questions/286287