进程管理与通信的实用技巧
1. 密码验证与终端参数保存
在进行密码验证时,可使用如下代码:
expect_user -re "(.*)\n" send_user "\n" if {0 !=[string compare $passwd $expect_out(1,string)]} { send_user "mistyped password?" exit }此代码会将用户输入的密码与预设密码进行对比,若不匹配则提示可能输错密码并退出。同时,还可以选择向用户展示刚刚输入的密码,只要用户能够拒绝该展示请求或者能在私密环境下查看,就不会存在安全风险。
使用disconnect命令相较于 shell 异步进程特性(&)有一个优势,即 Expect 能在断开连接前保存终端参数。当在前台启动时,Expect 会自动保存控制终端的参数,这些参数后续会在spawn创建新进程及其控制终端时被使用。而当异步启动(使用&)时,由于在 Expect 获得控制权时终端已断开连接,它便没有机会读取终端参数,此时终端只能通过stty sane进行初始化,这会丢失诸如行和列数量等信息。
2. 断开进程的调试
调试断开的进程颇具挑战,因为 Expect 的调试器在断开的程序中无法工作,原因是调试器从标准输入读取信息,而在断开的进程中标准输入是关闭的。对于简单问题,可将日志或诊