在Linux中,如何利用Shell把10臺主機的當前時間寫到一個檔案裡邊?

黄嘉波發表於2024-03-12

在Linux中,使用Shell指令碼收集多臺主機的當前時間並將其寫入一個檔案是一個常見的任務。下面是一個詳細的步驟說明,包括如何設定SSH金鑰認證(以避免手動輸入密碼)以及編寫和執行Shell指令碼。

1. 設定SSH金鑰認證

為了避免在指令碼執行過程中需要手動輸入密碼,你可以使用SSH金鑰認證。這意味著你需要在本地機器上生成一個SSH金鑰對,並將公鑰分發到每臺遠端主機上。

  1. 生成SSH金鑰對

在本地機器上執行以下命令生成SSH金鑰對:

ssh-keygen -t rsa

按照提示操作,通常你可以選擇不設定密碼短語(passphrase)以簡化自動化過程。

  1. 分發公鑰到遠端主機

對於每臺遠端主機,你需要將公鑰(通常位於~/.ssh/id_rsa.pub)新增到其~/.ssh/authorized_keys檔案中。你可以使用ssh-copy-id命令來自動完成這個過程:

ssh-copy-id user@remote_host

user替換為遠端主機的使用者名稱,remote_host替換為遠端主機的IP地址或主機名。對每臺主機重複此操作。

2. 編寫Shell指令碼

接下來,你需要編寫一個Shell指令碼來收集時間並寫入檔案。

  1. 建立指令碼檔案

使用文字編輯器建立一個新的Shell指令碼檔案,例如collect_times.sh

nano collect_times.sh
  1. 編寫指令碼內容

在指令碼檔案中,輸入以下內容:

#!/bin/bash  
  
# 定義主機列表  
HOSTS=("host1" "host2" "host3" "host4" "host5" "host6" "host7" "host8" "host9" "host10")  
  
# 定義輸出檔案路徑  
OUTPUT_FILE="times.txt"  
  
# 清空或建立輸出檔案  
> "$OUTPUT_FILE"  
  
# 遍歷主機列表並收集時間  
for HOST in "${HOSTS[@]}"; do  
    # 使用ssh獲取主機的當前時間,並追加到輸出檔案  
    echo "Time from $HOST: $(ssh $HOST date)" >> "$OUTPUT_FILE"  
done  
  
echo "Times collected and saved to $OUTPUT_FILE"

在這個指令碼中,HOSTS陣列包含了你要收集時間的主機列表。OUTPUT_FILE變數指定了輸出檔案的路徑。指令碼會遍歷每臺主機,使用ssh命令獲取當前時間,並將結果追加到輸出檔案中。

  1. 儲存並退出編輯器

nano中,按Ctrl + O儲存檔案,然後按Ctrl + X退出。

  1. 給指令碼執行許可權

在終端中,為指令碼檔案新增執行許可權:

chmod +x collect_times.sh
3. 執行Shell指令碼

現在你可以執行指令碼以收集時間並將其寫入檔案。

./collect_times.sh

指令碼會依次連線到每臺主機,獲取當前時間,並將結果追加到times.txt檔案中。每個主機的時間前面都會加上對應的主機名。

4. 檢視結果

執行完指令碼後,你可以使用cat命令檢視times.txt檔案的內容,以驗證時間是否已成功收集並寫入檔案。

cat times.txt

這個檔案現在應該包含了從每臺主機收集的當前時間資訊。

綜上所述,這個指令碼假設你已經正確設定了SSH金鑰認證,並且每臺主機都允許你從執行指令碼的機器進行無密碼登入。如果某些主機不可用或SSH連線失敗,指令碼可能會顯示錯誤資訊。你可以根據需要新增額外的錯誤處理邏輯來增強指令碼的健壯性。

相關文章