這些程式需要一個 terminal interface。這是shell 所無法提供的。所以這些 無法在 shell script 裡自動執行這些程式。
有一隻叫做 'expect' 的程式,可以用來做這件事,因為它提供了 programmable terminal interface。底下的例子是用 'expect' 來幫你 login:
# username is passed as 1st arg, password as 2nd set password [index $argv 2] spawn passwd [index $argv 1] expect "*password:" send "$password\r" expect "*password:" send "$password\r" expect eof
expect 為 telnet, rlogin,debugger 和一些沒有內建 command language 的 程式提供了一個近乎自動化的方法。Expect 裡面的有一用以在玩 rogue (一個 Unix 中的古老遊戲)時取得較佳初始情況,然後將控制權還回給使用者 的例子。用這個 script 你就能得到『成功的一半』。
再者,有一些已經寫好的程式可以幫你這類與 pseudo-tty 有關的東西,所 以你只要在 script 中執行這些程式就可以幫你處理這些東西。
有兩個方法可以取得 'expect': 1.送一封 email 給 library@cme.nist.gov 內容就寫 "send pub/expect/expect.shar.Z" 2. ftp://ftp.cme.nist.gov/pub/expect/expect.shar.Z
另一個做法是用一隻叫 pty 4.0 曾貼在 comp.sources.unix volume25 的東 西。這個程式會提供一個 pseudo-tty session 給需要 tty 的程式用。若使 用 named pipe 配合 pty 4.0 來做上例,則看起來可能如下:
#!/bin/sh /etc/mknod out.$$ p; exec 2>&1 ( exec 4<out.$$; rm -f out.$$ <&4 waitfor 'password:' echo "$2" <&4 waitfor 'password:' echo "$2" <&4 cat >/dev/null ) | ( pty passwd "$1" >out.$$ )
上面的 'waitfor' 是簡單的 C 程式,功用為等到 input 有與所等待的字串 相同時再往下做。
下面是一個更簡單的做法,不過缺點是與 'passwd' 程式的互動可能無法同 步。
#!/bin/sh ( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1"