- 论坛徽章:
- 1
|
这些程式要一个 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 有关的东西,所
以你只要?nbsp;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/dev/null
) | ( pty passwd "$1" >out.$$ )
上面的 'waitfor' 是简单的 C 程式,功用为等到 input 有与所等待的字串
相同时再往下做。
下面是一个更简单的做法,不过缺点是与 'passwd' 程式的互动可能无法同
步。
#!/bin/sh
( sleep 5; echo "$2"; sleep 5; echo "$2" | pty passwd "$1" |
|