今年來公司配了mac,全部的開發環境都從新部署了一遍,因爲都是在開發機上運行項目的,免不了在開發機上操做各類,ssh固然是必須的,可是mac下不熟悉,每次ssh命令行,再輸入密碼太討厭了,因此想了使用shell腳本自動登陸到開發機,而後進行各類操做,搜索了下,代碼以下:mysql
#!/usr/bin/expect -f // 指定shebang set timeout 10 set pass "password" spawn ssh root@xx.xx.xx.xx expect "password" send "$pass\r" interact
咱們寫一個shell腳本時,老是習慣在最前面加上一行 #!/binbash
,它就是腳本的shebang
,至於爲何叫這麼個奇怪的名字,C語言和Unix的開發者丹尼斯·裏奇稱它爲多是相似於"hash-bang"的英國風描述性文字
;sql
貼一段wiki上的解釋:shell
在計算機科學中,Shebang是一個由井號和歎號構成的字符串行,其出如今文本文件的第一行的前兩個字符。 在文件中存在Shebang的狀況下,類Unix操做系統的程序載入器會分析Shebang後的內容,將這些內容做爲解釋器指令,並調用該指令,並將載有 Shebang的文件路徑做爲該解釋器的參數。數據庫
簡單的說,它指示了此腳本運行時的解釋器,因此,使用文件名直接執行shell腳本時,必須帶上shebang; 此外,咱們還能夠在shebang後面直接附加選項,執行時咱們默認使用選項執行;bash
如 test.sh
的shebang
爲 #!/bin/sh -x
,那咱們執行腳本時:ssh
./test.sh hello
學習
至關於:spa
bin/sh -x ./test.sh hello
;操作系統
而編寫一個ssh自動登錄腳本,須要用到的shebang(解釋器)爲 /usr/bin/expect
;命令行
須要注意的是:在指定腳本解釋器來執行腳本時,shebang會被指定的腳本解釋器覆蓋,即優先使用指定的腳本解釋器來執行腳本(習慣性地用sh ./test.sh卻提示command not found)。
解釋下命令:
expect解釋器
expect是一個能實現自動和交互式任務的解釋器,它也能解釋常見的shell語法命令,其特點在如下幾個命令:
spawn command
命令會fork一個子進程去執行command命令,而後在此子進程中執行後面的命令;
在ssh自動登錄腳本中,咱們使用 spawn ssh user_name@ip_str
,fork一個子進程執行ssh登錄命令;
expect命令是expect解釋器的關鍵命令,它的通常用法爲 expect "string"
,即指望獲取到string字符串,可在在string字符串裏使用 * 等通配符;
string與命令行返回的信息匹配後,expect會馬上向下執行腳本;
set timeout n
命令將expect命令的等待超時時間設置爲n秒,在n秒內尚未獲取到其期待的命令,expect 爲false,腳本會繼續向下執行;
send命令的通常用法爲 send "string"
,它們會咱們日常輸入命令同樣向命令行輸入一條信息,固然不要忘了在string
後面添加上 \r
表示輸入回車;
interact命令很簡單,執行到此命令時,腳本fork的子進程會將操做權交給用戶,容許用戶與當前shell進行交互。
寫好腳本保存以後,再經過chmod賦予執行權限,就能夠執行了./xxx.sh
經過以上的學習能夠依樣畫葫蘆,寫幾個其它的自動腳本,
數據庫執行的(導入,導出):
#!/usr/bin/expect -f set timeout 10 set pass "serverpass" set dbpass "dbpassword" spawn ssh root@xx.xx.xx.xx expect "password" send "$pass\r" expect "~]#" send "mysqldump -h xx.xx.xx -P3306 -u user -p databases table1 table2> /home/chaos/topic.sql \r" expect "Enter password:" send "$dbpass\r" interact
scp傳遞文件的腳本:
#!/usr/bin/expect -f set timeout 10 set pass "serverpass" spawn scp -r /Users/chaos/work/data/hotuser.sql root@xx.xx.xx.xx:/home/chaos expect "root@xx.xx.xx.xx's password:" send "$pass\r" interact
主要就是spawn 命令不一樣,看返回須要輸入什麼,send什麼過去就能夠了。
ps:這個腳本都用大半年了,最近纔有空記錄下,真是變懶了好多,罪過罪過😓