要同時指定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埠和密碼。