LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1289|回复: 3

请问expect如何在后台执行

[复制链接]
发表于 2004-4-15 20:27:58 | 显示全部楼层 |阅读模式
比如最简单的telnet的expect脚本

#!/usr/local/expect -f

spawn telent xxx
expect "login name:"
send "myname\r"
expect "password:"
send "mypass\r"

放在后台执行会报错。简单的重定向并不管用。

不错expect的FAQ里的确有提到,不过作者只是推销自己的书罢了,
没有明说如何做。谁有exploring expect的电子书就好了。
发表于 2004-4-15 20:32:49 | 显示全部楼层
没有接触过expect,看看这篇贴子是否可以找到答案:
expect中文手册
 楼主| 发表于 2004-4-15 20:49:28 | 显示全部楼层
GOOGLE抓得到的都看过了,这个也包含在内。还是谢谢你。

我希望能把代码贴出来,如果含糊的指点管用,恐怕我已经
解决了。

FAQ里面原文:
Yes, read Exploring Expect, Chapter 17 (Background Processing). In the section "Expect as a Daemon", there's a very thorough discussion of this problem and how to solve it.

In short, there's no tty when you run a process from inetd. Echoing is controlled by the telnet protocol, so you must send and expect telnet protocol packets to solve the problem. Even knowing this, the actual implementation is very non-obvious which is why the book goes into it in such detail.
发表于 2004-4-15 21:32:01 | 显示全部楼层
这个例子不知道是否..........:sorry  
8.[ftp]

  我们使用expect写第一个脚本并没有打印出"Hello,World"。实际上,它
实现了一些更有用的功能。它能通过非交互的方式来运行ftp。ftp是用来在支
持TCP/IP的网络上进行文件传输的程序。除了一些简单的功能,一般的实现都
要求用户的参与。

  下面这个脚本从一个主机上使用匿名ftp取下一个文件来。其中,主机名
是第一个参数。文件名是第二个参数。

        spawn    ftp    [index $argv 1]
        expect "*Name*"
        send     "anonymous "
        expect "*Password:*"
        send [exec whoami]
        expect "*ok*ftp>*"
        send "get [index $argv 2] "
        expect "*ftp>*"

  上面这个程序被设计成在后台进行ftp。虽然他们在底层使用和expect类
似的机制,但他们的可编程能力留待改进。因为expect提供了高级语言,你可
以对它进行修改来满足你的特定需求。比如说,你可以加上以下功能:

    :坚持--如果连接或者传输失败,你就可以每分钟或者每小时,甚
        至可以根据其他因素,比如说用户的负载,来进行不定期的
        重试。
    :通知--传输时可以通过mail,write或者其他程序来通知你,甚至
        可以通知失败。
    :初始化-每一个用户都可以有自己的用高级语言编写的初始化文件
        (比如说,.ftprc)。这和C shell对.cshrc的使用很类似。

  expect还可以执行其他的更复杂的任务。比如说,他可以使用McGill大学
的Archie系统。Archie是一个匿名的Telnet服务,它提供对描述Internet上可
通过匿名ftp获取的文件的数据库的访问。通过使用这个服务,脚本可以询问
Archie某个特定的文件的位置,并把它从ftp服务器上取下来。这个功能的实
现只要求在上面那个脚本中加上几行就可以。

  现在还没有什么已知的后台-ftp能够实现上面的几项功能,能不要说所有
的功能了。在expect里面,它的实现却是非常的简单。"坚持"的实现只要求
在expect脚本里面加上一个循环。"通知"的实现只要执行mail和write就可以
了。"初始化文件"的实现可以使用一个命令,source .ftprc,就可以了,
在.ftprc里面可以有任何的expect命令。

  虽然这些特征可以通过在已有的程序里面加上钩子函数就可以,但这也不
能保证每一个人的要求都能得到满足。唯一能够提供保证的方法就是提供一种
通用的语言。一个很好的解决方法就是把Tcl自身融入到ftp和其他的程序中间
去。实际上,这本来就是Tcl的初衷。在还没有这样做之前,expect提供了一
个能实现大部分功能但又不需要任何重写的方案。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表