簡體   English   中英

bash腳本在循環中ssh多個服務器並發出命令

[英]bash script to ssh multiple servers in a Loop and issue commands

我有一個文本文件,其中有一個服務器列表。 我正在嘗試從文件中逐個讀取服務器,在服務器中使用SSH並執行ls以查看目錄內容。 當我運行SSH命令時,我的循環只運行一次,但是,對於SCP它運行文本文件中的所有服務器並退出,我希望循環運行直到SSH文本文件的末尾。 以下是我的bash腳本,如何在進行SSH為文本文件中的所有服務器運行?

#!/bin/bash
while read line
do
    name=$line
    ssh abc_def@$line "hostname; ls;"
#   scp /home/zahaib/nodes/fpl_* abc_def@$line:/home/abc_def/
done < $1

我將腳本運行為$ ./script.sh hostnames.txt

這段代碼的問題是ssh開始從stdin讀取數據,這是你想要的read line 您可以告訴ssh從其他東西讀取,比如/dev/null ,以避免吃掉所有其他主機名。

#!/bin/bash
while read line
do
    ssh abc_def@"$line" "hostname; ls;" < /dev/null
done < "$1"

更直接的是使用-n標志,它告訴ssh不要從標准輸入讀取。

將循環更改為for循環:

for server in $(cat hostnames.txt); do
    # do your stuff here
done

它不是並行ssh但它有效。

我開源了一個名為Overcast的命令行工具,使這種事情變得更容易。

首先導入服務器:

overcast import server.01 --ip=1.1.1.1 --ssh-key=/path/to/key
overcast import server.02 --ip=1.1.1.2 --ssh-key=/path/to/key

完成后,您可以使用通配符在它們之間運行命令,如下所示:

overcast run server.* hostname "ls -Al" ./scriptfile
overcast push server.* /home/zahaib/nodes/fpl_* /home/abc_def/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM