Shell指令碼互動之:自動輸入密碼
Shell指令碼互動之:自動輸入密碼
2016年04月09日 19:41:26 zhangjikuan 閱讀數:58208 個人分類: ARM/linux平時在控制檯輸入指令如:sudo、ssh、ftp或者修改admin許可權的檔案時候都會要求輸入password,但是在she'll指令碼執行過程中該如何互動實現自動輸入密碼呢?
下面總結三種實現方法。
一、重定向:用重定向方法實現互動的前提是指令需要有引數來指定密碼輸入方式,如ftp就有-i引數來指定使用標準輸入來輸入密碼
shell用重定向作為標準輸入的用法是:cmd<<delimiter ,shell 會將分界符delimiter之後直到下一個同樣的分界符之前的內容作為輸入
實現ftp自動登入並執行ls指令的用法如下:其中zjk為使用者名稱,zjk123為密碼
-
ftp -i -n 192.168.21.46
<<EOF
- user zjk zjk123
- ls
- EOF
二:管道:跟重定向一樣,指令同樣要有引數來指定密碼輸入方式,如sudo的-S引數,passwd的-stdin引數
所以實現sudo自動輸入密碼的指令碼如下:其中zjk123為密碼
echo 'zjk123' | sudo -S cp file1 /etc/hosts
實現自動修改密碼的指令碼寫法如下:
echo 'password' | passwd -stdin username
三:expect:上面介紹的兩種方法前提條件是指令有引數來設定密碼輸入方式,像ssh指令就沒有這樣的引數,第三種互動方式就派上用場了
expect就是用來做互動用的,基本任何互動登入的場合都能使用,但是需要安裝expect包
語法如下:
- #!/bin/expect
- set timeout 30
- spawn ssh -l jikuan.zjk 10.125.25.189
- expect "password:"
- send "zjk123\r"
- interact
在執行指令碼時候要expect file,不能sh file了
上面語句第一句是設定超時時間為30s,spawn是expect的語句,執行命令前都要加這句
expect "password:"這句意思是互動獲取是否返回password:關鍵字,因為在執行ssh時會返回輸入password的提示:[email protected]'s password:
send就是將密碼zjk123傳送過去
interact代表執行完留在遠端控制檯,不加這句執行完後返回本地控制檯