shell腳本的應用

今年來公司配了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

shebang

咱們寫一個shell腳本時,老是習慣在最前面加上一行 #!/binbash,它就是腳本的shebang,至於爲何叫這麼個奇怪的名字,C語言和Unix的開發者丹尼斯·裏奇稱它爲多是相似於"hash-bang"的英國風描述性文字sql

貼一段wiki上的解釋:shell

在計算機科學中,Shebang是一個由井號和歎號構成的字符串行,其出如今文本文件的第一行的前兩個字符。 在文件中存在Shebang的狀況下,類Unix操做系統的程序載入器會分析Shebang後的內容,將這些內容做爲解釋器指令,並調用該指令,並將載有 Shebang的文件路徑做爲該解釋器的參數。數據庫

簡單的說,它指示了此腳本運行時的解釋器,因此,使用文件名直接執行shell腳本時,必須帶上shebang; 此外,咱們還能夠在shebang後面直接附加選項,執行時咱們默認使用選項執行;bash

test.shshebang#!/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命令:

spawn command命令會fork一個子進程去執行command命令,而後在此子進程中執行後面的命令;

在ssh自動登錄腳本中,咱們使用 spawn ssh user_name@ip_str,fork一個子進程執行ssh登錄命令;

expect命令:

expect命令是expect解釋器的關鍵命令,它的通常用法爲 expect "string",即指望獲取到string字符串,可在在string字符串裏使用 * 等通配符;

string與命令行返回的信息匹配後,expect會馬上向下執行腳本;

set timeout命令:

set timeout n命令將expect命令的等待超時時間設置爲n秒,在n秒內尚未獲取到其期待的命令,expect 爲false,腳本會繼續向下執行;

send命令:

send命令的通常用法爲 send "string",它們會咱們日常輸入命令同樣向命令行輸入一條信息,固然不要忘了在string後面添加上 \r 表示輸入回車;

interact命令:

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:這個腳本都用大半年了,最近纔有空記錄下,真是變懶了好多,罪過罪過😓

相關文章
相關標籤/搜索