自動批次實現linux機器ssh免密shell指令碼

IT人生--MarkGuo發表於2024-04-30

要同時指定SSH埠和密碼來實現非互動式地使用ssh-copy-id,可以使用sshpass來實現。sshpass是一個用於透過非互動方式輸入密碼的工具。下面是一個示例指令碼,它使用sshpass、ssh-copy-id以及指定的埠號來實現這一目標:

 1 #!/bin/bash
 2 
 3 # 檢查是否提供了目標主機列表檔案
 4 if [ $# -eq 0 ]; then
 5     echo "用法: $0 <目標主機列表檔案> <SSH埠號> <密碼>"
 6     exit 1
 7 fi
 8 
 9 # 目標主機列表檔案
10 host_list_file="$1"
11 
12 # 檢查檔案是否存在
13 if [ ! -f "$host_list_file" ]; then
14     echo "錯誤: 檔案 '$host_list_file' 不存在"
15     exit 1
16 fi
17 
18 # SSH埠號
19 ssh_port="$2"
20 
21 # 密碼
22 password="$3"
23 
24 # 讀取目標主機列表檔案,一行一個主機
25 while IFS= read -r host; do
26     echo "正在處理 $host..."
27 
28     # 生成SSH金鑰對(如果不存在)
29     if [ ! -f ~/.ssh/id_rsa ]; then
30         ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
31     fi
32 
33     # 使用sshpass和ssh-copy-id將公鑰複製到目標主機上
34     sshpass -p "$password" ssh-copy-id -i ~/.ssh/id_rsa.pub "-p $ssh_port" "$host"
35 
36     # 檢查結果並輸出
37     if [ $? -eq 0 ]; then
38         echo "成功將公鑰複製到 $host"
39     else
40         echo "無法將公鑰複製到 $host,請手動處理"
41     fi
42 done < "$host_list_file"

請注意,此指令碼假定你已經生成了SSH金鑰對(如果沒有,請先使用ssh-keygen命令生成)。然後,你可以將指令碼儲存為一個檔案(比如ssh_setup.sh),給予執行許可權:

bash
chmod +x ssh_setup.sh

然後,執行指令碼並傳遞目標主機列表檔案的路徑、SSH埠號和密碼作為引數:

bash
./ssh_setup.sh host_list.txt 2222 YourPassword

這樣指令碼會將公鑰複製到每個目標主機上,並且在這個過程中使用指定的SSH埠和密碼。

相關文章