shell結合expect寫的批量scp腳本工具

轉載鏈接:http://www.jb51.net/article/34005.htm


expect用于自動化地執行linux環境下的命令行交互任務,例如scp、ssh之類需要用戶手動輸入密碼然后確認的任務。有了這個工具,定義在scp過程中可能遇到的情況,然后編寫相應的處理語句,就可以自動地完成scp操作了
在部署一個任務時,其中有一項必須的過程就是將一些文件,如安裝包發送到大量的服務器上去。雖然已有宇哥的腳本可用:通過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任務:
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_fileexpect {"(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
dohost_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的任務可能就會遇到麻煩了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276554.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ASP記數器

這兩天有好幾個老的ASP網站要改,其中有要求加記數器,為圖簡單,就用文本文件的形式存儲記數。以前用ifream的形式嵌入,不能很好的控制記數器顯示的風格,現在改進了一下,可以很好的與嵌入板塊風格結合了。把做…

php利用openssl實現RSA非對稱加密簽名

轉載鏈接:http://liuxufei.com/weblog/jishu/376.html 1. 先用php生成一對公鑰和私鑰 $res openssl_pkey_new(); openssl_pkey_export($res,$pri); $d openssl_pkey_get_details($res); $pub $d[key]; var_dump($pri,$pub); 2. 保存好自己的私鑰,把公…

[轉] DevExpress 第三方控件漢化的全部代碼和使用方法

DevExpress.XtraEditors.Controls 此控件包中包含的控件最多,包括文本框,下拉列表,按鈕,等等 DevExpress.XtraGrid 網格 DevExpress.XtraBars 菜單欄 和 工具欄 DevExpress.XtraNavBar 導航條 DevExpress.XtraPr…

QPM 性能監控組件總篇

QPM (Quality Performance Monitor) 是一個質量性能監控組件,可以很方便的查看當前 App 的性能和常用數據。目前主要運行在 Android 平臺上,通過集成 QPM 組件,可以在 App 中通過懸浮窗可視化相關實時數據。意在幫助廣…

福音!微信個人公眾號可以改名了!

微信個人公眾號可以改名了!!!今年,我們學校從景德鎮陶瓷學院更名為景德鎮陶瓷大學,但苦于微信限制,很多微信公眾號無法更名。很多組織社團就放棄了原先的關注量,重新申請注冊賬號。當前我們的訂…

js list刪除指定元素_刪除js數組中的指定元素,有這兩步就夠了

js數組是js部分非常重要的知識,有時我們有這么個需求js數組刪除指定元素,先定義一個函數來獲取刪除指定元素索引值,然后用js數組刪除的方法,來刪除指定元素即可,就兩步不難,很簡單。1、JS的數組對象定義一個…

sudo 安裝 常見錯誤

運行環境Linux: 1、sudo:安裝 apt-get install sudo 2、sudo: must be setuid root錯誤解決方法. ls -l /usr/bin/sudo chown root:root /usr/bin/sudo chmod 4755 /usr/bin/sudo reboot 3、sudo:提示用戶無權限之類 在 /etc/…

慕課網高并發實戰(一)-并發與高并發基本概念

課程網址 并發: 同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程交替得換入或者換出內存,這些線程是同時“存在”的,每個線程都處于執行過程中的某個狀態,如果運行在多核處理器上&#xff…

2009最經典名句

一:我的優點是:我很帥;但是我的缺點是:我帥的不明顯. 二:談錢不傷感情,談感情最他媽傷錢。 三:我詛咒你一輩子買方便面沒有調料包。 四:會計說:“你晚點來領工資吧&#…

計算機協會丨讓技能得到提升,讓思維受到啟迪

“ 各位2016級新生,新的學期馬上就要開始了,學校的各個組織和社團你真的了解了嗎?在眼花繚亂的社團里如何找到自己真正喜歡的呢?或許看完計算機協會的納新微信你就都明白啦!關鍵詞:計算機協會景德鎮陶瓷大學…

ondestroy什么時候調用_尾調用和尾遞歸

尾調用1. 定義尾調用是函數式編程中一個很重要的概念,當一個函數執行時的最后一個步驟是返回另一個函數的調用,這就叫做尾調用。注意這里函數的調用方式是無所謂的,以下方式均可:函數調用: func()方法調用: obj.method()call調用:…

查看/修改Linux時區和時間

轉載鏈接:http://blog.csdn.net/colincjl/article/details/6133036 查看/修改Linux時區和時間 一、時區 1. 查看當前時區 date -R 2. 修改設置時區 方法(1) tzselect 方法(2) 僅限于RedHat Linux 和 CentOS timeconfig 方法(3) 適用于Debian dpkg-reconfigure tzdat…

dhl:使用return RedirectToAction()和 return view()

一個Action&#xff1a; Code/// <summary> /// Friend好友的地 /// </summary> /// <returns></returns> public ActionResult FriendFarm(string pid) {BLL.DTOFarm farm new AppleGrange.BLL.DTOFarm(pid); …

【更名通知】將以個人名義繼續更新維護

這是我&#xff08;2013年任職計算機協會會長&#xff09;在2013年申請的公眾號。由于2016年學校陶院更名為陶大&#xff0c;在當時公眾號無法修改名稱。后來計協的的學弟學妹申請了新的公眾號"陶大計算機Association"&#xff0c;大家可以前往關注&#xff0c;所以該…

CentOS7.6 MySQL8環境搭建 配置遠程登錄 字符集UTF8 簡單密碼

一、環境準備 1、清理環境中系統自帶的MySQL &#xff08;1&#xff09;刪除系統自帶的MySQL或Mariadb yum remove mysql-libs &#xff08;2&#xff09;查詢系統中是否還有殘余的依賴包 rpm -qa | grep mariadb &#xff08;3&#xff09;刪除rpm依賴包 rpm -e --nodeps mar…

radio切換控制div顯示_JavaScript連載31圖片動態切換以及關閉圖片案例

一、圖標切換31.1點擊那兩個按鈕可以做到輪番顯示圖片二、關閉圖片案例31.2點擊右上角的叉&#xff0c;圖片會消失。三、源碼&#xff1a;D31_iconSwitch.htmlD31_2_CloseImage.html地址:https://github.com/ruigege66/JavaScript/blob/master/D31_iconSwitch.htmlhttps://gith…

jQuery 1.9+ 移除$.browser方法

轉載鏈接&#xff1a;http://blog.csdn.net/czplplp_900725/article/details/8704438 jQuery 從 1.9 版開始&#xff0c;移除了 $.browser 和 $.browser.version &#xff0c;取而代之的是 $.support。 在更新的 2.0 版本中&#xff0c;將不再支持 IE 6/7/8。 以后&#xff0c;…

ASP.NET跨頁傳值方法匯總

方法一&#xff1a;問號傳值&#xff08;Response.Redirect方法&#xff09;1&#xff1a;源頁&#xff1a;在按鈕的點擊事件程序中寫入Response.Redirect方法&#xff0c;在其中使用問號傳值。如&#xff1a;Response.Redirect("Default2.aspx?id"txtId.Text.Trim(…

工作一年后,我有些感悟(寫于2017年)

時間拉回到2016年5月23日&#xff0c;當天拍畢業照&#xff0c;晚上是大學畢業酒會&#xff0c;那一晚整個酒店都彌漫著傷感的氣息。那一晚大家為了找KTV拖延到很晚&#xff0c;最后一群人選擇來到了操場&#xff0c;凌晨兩點多一群人還在操場上玩著游戲。5月25日離校&#xff…

PHP基礎學習之數組使用要點

一、什么是PHP數組&#xff1f;數組 array 是一組有序的變量&#xff0c;其中每個變量都被稱為一個元素。每個元素由一個特殊的標識符來區分&#xff0c;這個標識符稱之為鍵&#xff08;也可以稱之為下標&#xff09;。數組中的每個元素都包含兩項&#xff1a;鍵和值。可以通過…