shell腳本在處理自動(dòng)循環(huán)或大的任務(wù)方面可節(jié)省大量的時(shí)間,通過創(chuàng)建一個(gè)處理任務(wù)的命令清單,使用變量、條件、算術(shù)和循環(huán)等方法快速創(chuàng)建腳本以完成相應(yīng)工作,這比在命令行下一個(gè)個(gè)敲入命令要省時(shí)省力得多。
但是有時(shí)候我們可能會(huì)需要實(shí)現(xiàn)和交互程序如ftp,telnet服務(wù)器等進(jìn)行交互的功能,這時(shí)候我們需要用到shell的自動(dòng)交互功能.
最簡單的例子就是創(chuàng)建用戶,我創(chuàng)建100個(gè)用戶,初始密碼為123,那么要是挨著passwd username ,交互性輸入密碼,那不得瘋掉,但是腳本里應(yīng)該怎么寫呢?將密碼123,輸入到passwd命令?
本文收集了較常用交互方法,并進(jìn)行了比較和總結(jié)。
自動(dòng)交互方法一:利用命令的自帶參數(shù),將標(biāo)準(zhǔn)輸入作為手動(dòng)輸入的內(nèi)容
自動(dòng)交互最關(guān)鍵的就是交互信息的自動(dòng)輸入,首先聯(lián)想到文件重定向,在shell編程中有這樣一種用法(參考Linux與UNIX SHELL編程指南 chapt 5.7):"command <
重定向操作符command <
對于需求1 要求的自動(dòng)登陸ftp,并作系列操作,則可以用這種方法進(jìn)行自動(dòng)交互。代碼如下:
[yjwan@test ~]$ ftp -i -n 192.168.21.46 <
user dbftp dbftp101
ls
EOF
下面是得到的結(jié)果:
Connected to 192.168.21.46.
220 developerjail FTP server (Version 6.00LS) ready.
331 Password required for dbftp.
230 User dbftp logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
229 Entering Extended Passive Mode (|||54281|)
150 Opening ASCII mode data connection for '/bin/ls'.
total 8847424
-rw-r--r-- 1 dbftp www 9055318991 Aug 28 14:28 ewiz90.sql_2010-08-29
226 Transfer complete.
221 Goodbye.
測試可以發(fā)現(xiàn),如上代碼使用賬號名dbftp,密碼dbftp101成功登陸了ftp服務(wù)器,并進(jìn)入目錄,ls出當(dāng)前目錄的文件。
注意事項(xiàng):
1 這里一定要加-i ,否則必定失敗!!
這里ftp用的-I 參數(shù) 結(jié)束了交互式輸入,因此可以用文本的方式自動(dòng)地輸入用戶密碼以及操作方式
如果不用-I 參數(shù),那么必定要求你手動(dòng)輸入密碼的!!那么就達(dá)不到自動(dòng)登陸的要求了
你可以man ftp找到這個(gè)參數(shù)
-i 關(guān)閉多文件傳送中的交互式提示。請參考 prompt、mget、mput 和 mdelete 子命令,以取得多文件傳送中的提示的描述。
-n 防止在起始連接中的自動(dòng)登錄。否則, ftp 命令會(huì)搜索 $HOME/.netrc 登錄項(xiàng),該登錄項(xiàng)描述了遠(yuǎn)程主機(jī)的登錄和初始化過程。請參考 user 子命令。
2 舉一反三:只要是要求輸入密碼的命令,一般都帶有一個(gè)參數(shù),允許你從標(biāo)準(zhǔn)輸入,輸入用戶密碼,以及操作。
其他常用的自動(dòng)登陸命令的參數(shù)
1) Passwd命令
Linux下 Passwd有參數(shù)
--stdin
This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
所以linux下自動(dòng)改變用戶密碼的辦法就是
Echo 密碼 |passwd –stdin 用戶名
Freebsd沒有以上參數(shù) 注意
他的方法是echo passwd |pw mod user username -h 0
2)smbpasswd
-s
This option causes smbpasswd to be silent (i.e. not issue prompts)
and to read its old and new passwords from standard input, rather
than from /dev/tty (like the passwd(1) program does). This option
is to aid people writing scripts to drive smbpasswd
3)sudo
在shell腳本中需要用root用的來執(zhí)行指令:
sudo 自動(dòng)輸入密碼
echo "password" | sudo -S netstat -tlnp
-S
The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
3 標(biāo)準(zhǔn)輸入還可以用以下兩種寫法:
可以將下面的內(nèi)容寫入到一個(gè)文本
然后ftp -I –n ip <文本
或者echo “..” |ftp –I –n ip
都是可以的!
因?yàn)樗麄兌紳M足“有一個(gè)標(biāo)準(zhǔn)的輸入”這個(gè)條件
4 ssh的自動(dòng)登陸沒有這樣的自動(dòng)輸入密碼的參數(shù)
一般都是使用公鑰/私鑰的方式自動(dòng)登錄
這種文章滿街都是,網(wǎng)上google一下ssh自動(dòng)登陸就可以找到答案。
或者用下面的辦法。
自動(dòng)交互方法2:利用expect腳本自動(dòng)登陸
這個(gè) expect基本屬于一種編程了
基本任何需要交互式登陸的場合,他都可以解決,是相當(dāng)?shù)呐1啤?/P>
只要是第一種辦法解決不了的,基本都可以用這種辦法。
這里不介紹。因?yàn)榱韺懥艘槐殛P(guān)于expect 的。