我有一个简单的预期脚本,它提供 4 次密码。我使用以下方法将输出记录到日志文件中:
log_file -a /home/applusr/e291505/logs/ADD.log spawn /home/root/admin/add.mims.user $username "$firstname $lastname"
#!/usr/local/bin/expect
set username [lindex $argv 0]
set firstname [lindex $argv 1]
set lastname [lindex $argv 2]
set mypassword [lindex $argv 3]
set userpassword [lindex $argv 4]
set LOG_FILE [open /home/applusr/e291505/logs/ADD.log a]
set today [ exec /bin/date +%Y-%m-%d-%T]
puts $LOG_FILE "\n------------------ADD_SCRIPT - $today----$username--$firstname--$lastname---"
set timeout 10
log_user 1
log_file -a /home/applusr/e291505/logs/ADD.log
spawn /home/root/admin/add.mims.user $username "$firstname $lastname"
expect "e291505's Password:*" { send "$mypassword\n" }
expect "$username's New password:*" { send "$userpassword\n" }
expect "Enter the new password again:*" { send "$userpassword\n" }
expect "Password:*" { send "$mypassword\n" }
如果我运行脚本:
有时输出在日志文件中。没有问题。有时,除了 puts 语句输出外,日志文件中没有任何内容。
放入 $LOG_FILE "\n------------------ADD_SCRIPT - $today----$username--$firstname--$lastname---"
我如何保证日志文件始终有输出?
答案1
(为完整性而编辑,包括 glenn jackman 的评论,以及我后来的评论)。
您需要
close $LOG_FILE
在使用之前log_file
或对同一个文件有 2 个独立的文件描述符,并且写入的顺序似乎不确定。要记录所有输出:
expect
只会将其读取的输入复制到日志中。最后一行将expect
读取并查找密码提示。然后程序停止。您需要添加更多内容以使其读取任何进一步的输出,以便也可以记录它。通常,您等待生成的命令完成并通过添加关闭文件描述符expect eof
日志仅显示收到的内容,因此正常情况下发送的密码不会被看到,因为此时回显将被关闭。如果您确实看到了第 4 个密码,那么您可能需要在匹配提示后添加一个小延迟以让远程开关关闭回显。例如:
{ sleep 1; send "$mypassword\n" }