[英]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.