next up previous
Next: 在 shell script 或 C 程式當中,要怎樣才能找到某個程式的 process Up: 中級的問題 Previous: 為什麼在 Bourne shell 當中,對迴圈的輸出入轉向無法達到預期的效果?

我要怎麼在一個 shell script 中或在背景執行  'ftp' 'telnet' 'tip' 等  interactive 的程式呢?

這些程式需要一個 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"



Tan Koan-Sin
1999-03-02