1. 程式人生 > >ssh expect 批量ssh和scp

ssh expect 批量ssh和scp

轉自:http://www.jb51.net/article/34005.htm

http://blog.51yip.com/linux/1462.html

部署一個任務時,其中有一項必須的過程就是將一些檔案,如安裝包傳送到大量的伺服器上去。雖然已有宇哥的指令碼可用:通過paramiko模組提供的ssh和scp功能編寫的python指令碼。但我到現在還在對python的恐懼之中(雖然已經在空閒時間努力去學習了),所以使用了shell和expect指令碼結合的方式,寫了這個批量scp的指令碼工具。 

expect用於自動化地執行linux環境下的命令列互動任務,例如scp、ssh之類需要使用者手動輸入密碼然後確認的任務。有了這個工具,定義在scp過程中可能遇到的情況,然後編寫相應的處理語句,就可以自動地完成scp操作了。 

需要expect工具的話可以在linux環境中使用apt-get或pacman這些包管理工具去獲取安裝,或是到expect開源專案的網站:

http://expect.sourceforge.net/ 來獲取。 

安裝expect之後,可以嘗試使用以下的程式碼來完成對單個伺服器的scp任務: 

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/usr/bin/expect settimeout10 sethost [lindex $argv 0] setusername [lindex $argv 1] setpassword [lindex $argv 2] setsrc_file [lindex $argv
3] setdest_file [lindex $argv 4] spawn scp $src_file [email protected]$host:$dest_file expect { "(yes/no)?" { send"yes\n" expect"*assword:"{ send "$password\n"} } "*assword:" { send"$password\n" } } expect"100%" expect eof

注意程式碼剛開始的第一行,指定了expect的路徑,與shell指令碼相同,這一句指定了程式在執行時到哪裡去尋找相應的啟動程式。程式碼剛開始還設定了timeout的時間為10秒,如果在執行scp任務時遇到了程式碼中沒有指定的異常,則在等待10秒後該指令碼的執行會自動終止。

從以上程式碼剛開始的幾行可以看出,我為這個指令碼設定了5個需要手動輸入的引數,分別為:目標主機的IP、使用者名稱、密碼、本地檔案路徑、目標主機中的檔案路徑。如果將以上指令碼儲存為expect_scp檔案,則在shell下執行時需要按以下的規範來輸入命令:
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file

以上的命令執行後,將把本地/root目錄下的src_file檔案拷貝到使用者名稱為root,密碼為123456的主機192.168.75.130中的/root下,同時還將這個原始檔重新命名為dest_file。

spawn代表在本地終端執行的語句,在該語句開始執行後,expect開始捕獲終端的輸出資訊,然後做出對應的操作。expect程式碼中的捕獲的(yes/no)內容用於完成第一次訪問目標主機時儲存金鑰的操作。有了這一句,scp的任務減少了中斷的情況。程式碼結尾的expect eof與spawn對應,表示捕獲終端輸出資訊的終止。

有了這段expect的程式碼,還只能完成對單個遠端主機的scp任務。如果需要實現批量scp的任務,則需要再寫一個shell指令碼來呼叫這個expect指令碼。

shell指令碼:

複製程式碼程式碼如下:
#!/bin/sh
list_file=$1
src_file=$2
dest_file=$3
cat $list_file | while read line
do
   host_ip=`echo $line | awk '{print $1}'`
   username=`echo $line | awk '{print $2}'`
   password=`echo $line | awk '{print $3}'`
   echo "$host_ip"
   ./expect_scp $host_ip $username $password $src_file $dest_file
done 

指定了3個引數:列表檔案的位置、本地原始檔路徑、遠端主機目標檔案路徑。需要說明的是其中的列表檔案指定了遠端主機ip、使用者名稱、密碼,這些資訊需要寫成以下的格式:
IP username password

中間用空格或tab鍵來分隔,多臺主機的資訊需要寫多行內容,如:
192.168.75.130 root 123456
192.168.75.131 knktc testpass

這樣就指定了兩臺遠端主機的資訊。注意,如果遠端主機密碼中有“$”、“#”這類特殊字元的話,在編寫列表檔案時就需要在這些特殊字元前加上轉義字元,否則expect在執行時會輸入錯誤的密碼。

對於這個shell指令碼,儲存為batch_scp.sh檔案,與剛才儲存的expect_scp檔案和列表檔案(就定義為hosts.list檔案吧)放到同一目錄下,執行時按照以下方式輸入命令就可以了:
./batch_scp.sh ./hosts.list /root/src_file /root/destfile
用這兩個指令碼檔案,就可以簡單地完成批量scp的任務了。
其實批量scp的任務並不難,但是批量ssh的任務可能就會遇到麻煩了。

相關推薦

ssh expect 批量sshscp

轉自:http://www.jb51.net/article/34005.htm http://blog.51yip.com/linux/1462.html 部署一個任務時,其中有一項必須的過程就是將一些檔案,如安裝包傳送到大量的伺服器上去。雖然已有宇哥的指令碼可用

使用expect 批量分發ssh公鑰

expect#!/usr/bin/expect if {$argc != 2} { #首先註意大話號,彼此之間需要空格 send_user "USAGE:expect_sshkey.exp file host" exit } #define var set file [lindex $argv 0

linux下expect命令實現批量ssh免密

輸入 left 防止 輸出 one 時間 line jdb eof 有時候我們需要批量發送ssh命令給服務器,但是有可能有些服務器是新加入的,還沒有配置ssh免密,這個時候就會提示我們輸入yes/no 或者password等,expect腳本命令就是用於在提示這些的時候

使用Shell腳本+expect批量部署ssh

Linux 自動化 shell expect Shell腳本+expect批量部署ssh一、準備工作及思路1,三臺機器做實驗(centos6.5、IP:192.168.0.22 (主控制)、192.168.0.156、192.168.0.157)2,IP:22這一臺做主控機器,另外2臺做客戶機

sshpass結合sshscp可以自動完成密碼登錄,無需手動輸入密碼

結合 1.2 HP 遠程 UC 本地文件 touch 機器 使用方法   使用方法:   1、sshpass -p 123456 ssh [email protected] "touch file" 遠程創建文件file   2、sshpass -p 123456 scp fil

Linux常用服務器搭建sshscp

ssh scp 1.ssh 1.1ssh介紹 SSH(Secure Shell),由IETF的網絡工作小組Network Working Group制定,ssh是建立在應用層和傳輸層基礎上的安全協議。 SSH是專為遠程登錄會話和其他網絡服務提供安全性的協議,常用於遠程登錄以及用戶之間的資料拷貝。 SS

Ubuntu ssh登陸方式scp命令上傳下載檔案

ssh登陸方式: 在本地命令列終端輸入:ssh [email protected] , 其中username為需要登陸的伺服器的使用者名稱,address為伺服器ip,然後根據提示輸入密碼即可。 scp是一個遠端檔案拷貝程式,用於上傳下載檔案非常的方便。 上傳檔案: 在本地命令

SSH客戶端實現Linux(Centos)共享檔案以及批量管理》

①lrzsz 在linux裡可代替ftp上傳和下載。 a.安裝lrzsz: b.在SecureCRT中設定上傳下載路徑: ②rz命令:  rz命令本地上傳檔案到伺服器: -y:覆蓋已有檔案

【轉載】使用Ant進行sshscp操作

一、簡介:   現在我們安裝Linux的時候通常考慮到安全因素(預設情況下)是不開啟telnet服務的,而ssh服務是有的,ant很早就支援telnet,但要求我們在Linux下要安裝telnet-server,並要啟用該服務。還好自Ant1.60開始支援了SSH 及SCP

expect 批量自動部署ssh 免密登陸 之 二

ket secret continue host parameter gen serve pass tip #!/usr/bin/expect -f ########################################## hutu #Push the

expect 批量自動部署ssh 免密登陸 之 三

server each user keygen known pass targe ash loss #!/bin/bash ########################################## zhichao.hu #Push the id.pas.

sshscp詳解

ssh服務器 非對稱加密 詳解 秘鑰登陸 ftp serve color remote windows系統 一、SSH客戶端使用   使用ssh客戶端遠程登陸到指定的計算機: $ ssh {user}@{remote} -o IdentityFile=/home/i

shell 腳本交互模式expect批量上傳ssh密鑰

end copy 密鑰 地址 usr shell 獲取IP地址 rsa 腳本交互 #!/usr/bin/bash###批量上傳密鑰 V.1.0 by chenght 2019-03-29 password=12345qwertfor i in {2..254} ###

SSH框架整體理解總結

程序員 mapper 集成 開發效率 beans 緩沖 -h 服務器端 邏輯 首先,SSH不是一個框架,而是多個框架(struts+spring+hibernate)的集成,是目前較流行的一種Web應用程序開源集成框架,用於構建靈活、易於擴展的多層Web應用程序。 集成

SSH框架的搭建測試(Spring + Struts2 + Hibernate)

conf work fault 項目 -i extends struts2 scrip map SSH框架實現了視圖、控制器、和模型的徹底分離,同時還實現了業務邏輯層與持久層的分離。 Spring實現了MVC中的 Controller的功能,Struts實現Web視圖的功能

SSH整合的xml註解

area dao AC chang -h gin cati rac fin DAO: 1 public interface IDeptDAO { 2 public int addDept(Dept dept); 3 } 1 @Repository("dept

Expect實現ssh非交互登錄

linux shell expect 交互在腳本中是個很痛苦的事情.一旦實現了公鑰認證,就沒有交互了//如何把公鑰推到遠程主機? 連接遠程主機時提示本次指紋與上次不一樣刪除曾經那個人(上次那臺主機)的信息expect有他自己說話的風格(語言)expect的位置正確嗎?最後定稿//一定要用spawn

expect 執行ssh-copy-id

-c dex nbsp display PE pri audio splay res vi deploy_ssh_key.exp #!/usr/bin/expect -f set timeout 2 set ipaddress [lindex $argv 0] set

expect腳本同步文件、expect指定host要同步的文件、構建文件分發系統、批量遠程執行命令

expect 一、expect腳本同步文件自動同步文件 ,把遠程的文件同步到本機cd /usr/local/sbin1.腳本內容:#!/usr/bin/expectset passwd "123456"spawn rsync -av root

Linux SSH端口更改SSH遠程連接服務慢原因排查

linux 7 dom 端口更改 ecdsa sta rmi ppi 導致 .... Linux SSH端口更改和優化 為什麽需要更改SSH默認連接端口 Windows服務器的默認遠程管理端口是3389,Linux服務器的默認端口是22。如果在公網上,經常會被工具掃,這是不