Day: July 20, 2018

Shell: expect – 自动交互脚本, linux 自动化, shell自动化, expect教程中文版:expect实例

启用选项 -c:执行脚本前先执行的命令,可多次使用。 -d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。 -D:启用交换调式器,可设一整数参数。 -f:从文件读取命令,仅用于使用#!时。如果文件名为”-“,则从stdin读取(使用”./-“从文件名为-的文件读取)。 -i:交互式输入命令,使用”exit”或”EOF”退出输入状态。 --:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。 -v:显示expect版本信息。 常用命令 # 命令行参数 # $argv,参数数组,使用[lindex $argv n]获取,$argv 0为脚本名字 # $argc,参数个数 set username [lindex $argv 1] # 获取第1个参数 set passwd [lindex $argv 2] # 获取第2个参数 set timeout 30 # 设置超时 #… Read More

Shell: expect – 自动交互脚本, linux 自动化, shell自动化, expect教程中文版:expect说明

样式匹配 *号 expect "hi*" send "$expect_out(0,string) $expect_out(buffer)" 输入philosophic,输出为hilosophic philosophic,hi*匹配的是hilosophic 如果是hi*hi,则匹配的是hilosophi 如果是*hi*,则匹配的是philosop hi c\n ,而不是p hi losophic\n,因为匹配是从左到右进行,且*尽可能匹配更多的字符,但是要符合样式,所以第一个*匹配的字符多一些 以*开头的样式并不经常用到,像*hi*,它能把前面不匹配的数据保存在expect_out(0,string),但是expect_out(buffer)中也会保存,所以这点也没什么意义 以*结尾的样式经常需要认真考虑,因为程序的输出不像人的标准输入一样是一行一行而是一堆一堆进行,这样可能匹配的最多数据还没发送完,程序已经返回了。因为*可以匹配任何东西,包括空字符串,可以用它做结尾匹配人的一些输入,并清理输入缓存。 例子: expect "220*" ;#在ftp的例子中会出错,可能程序没准备好,即已经返回了 expect "220*ready" ;#可以在整个的输入完成后才返回 expect "220*re" ;#可以作为一个简写,但是"220*r"就太简单了,它的r就可能匹配的server 更多Glob样式 ?:匹配一个字符,a?d匹配abd但不匹配abcd :匹配它范围内的任意字符 [abcdef0123456789]能匹配任意十六进制数,也可以写成[a-f0-9]。 如果要匹配短横杠-,要将其写在最前或者最后,例如[-a-c]匹配-,a,b,c 因为中括号也是特殊的expect的字符,它里面的式子要立刻求值,所以样式必须写成下面两种方式: expect "\[a-f0-9]",推荐使用 expect {[a-f0-9]},会出现预想不到的情况,因为里面所有的值都不会进行运算 也可以括号的第二部分加\,但这不是必须的 斜杠:太复杂,举例:… Read More

Shell: expect – 自动交互脚本, linux 自动化, shell自动化, expect教程中文版

摘要 现代的Shell对程序提供了最小限度的控制(开始,停止,等等),而把交互的特性留给了用户。这意味着有些程序,你不能非交互的运行,比如说 passwd。有一些程序可以非交互的运行,但在很大程度上丧失了灵活性,比如说fsck。这表明Unix的工具构造逻辑开始出现问题。Expect恰恰 填补了其中的一些裂痕,解决了在Unix环境中长期存在着的一些问题。 Expect使用Tcl作为语言核心。不仅如此,不管程序是交互和还是非交互的,Expect都能运用。这是一个小语言和Unix的其他工具配合起来产生强大功能的经典例子。 本部分教程并不是有关Expect的实现,而是关于Expect语言本身的使用,这主要也是通过不同的脚本描述例子来体现。其中的几个例子还例证了Expect的几个新特征。 关键字 Expect,交互,POSIX,程序化的对话,Shell,Tcl,Unix; 简介 一个叫做fsck的Unix文件系统检查程序,可以从Shell里面用-y或者-n选项来执行。在手册[1]里面,-y选项的定义是象这样的: 对于fsck的所有问题都假定一个“yes”响应;在这样使用的时候,必须特别的小心,因为它实际上允许程序无条件的继续运行,即使是遇到了一些非常严重的错误。 相比之下,-n选项就安全的多,但它实际上几乎一点用都没有。这种接口非常的糟糕,但是却有许多的程序都是这种风格。文件传输程序ftp有一个选项可以禁止交互式的提问,以便能从一个脚本里面运行。但一旦发生了错误,它没有提供的处理措施。 Expect是一个控制交互式程序的工具。他解决了fsck的问题,用非交互的方式实现了所有交互式的功能。Expect不是特别为fsck设计的,它也能进行类似ftp的出错处理。 fsck和ftp的问题向我们展示了象sh,csh和别的一些shell提供的用户接口的局限性。Shell没有提供从一个程序读和象一个程序写的功 能。这意味着shell可以运行fsck但只能以牺牲一部分fsck的灵活性做代价。有一些程序根本就不能被执行。比如说,如果没有一个用户接口交互式的提供输入,就没法运行下去。其他还有象Telnet,crypt,su,rlogin等程序无法在shell脚本里面自动执行。还有很多其他的应用程序在 设计是也是要求用户输入的。 Expect被设计成专门针和交互式程序的交互。一个Expect程序员可以写一个脚本来描述程序和用户的对话。接着Expect程序可以非交互的运行“交互式”的程序。写交互式程序的脚本和写非交互式程序的脚本一样简单。Expect还可以用于对对话的一 部分进行自动化,因为程序的控制可以在键盘和脚本之间进行切换。 bes[2]里面有详细的描述。简单的说,脚本是用一种解释性语言写的。(也有C和C++的Expect库可供使用,但这超出了本文的范围).Expect提供了创建交互式进程和读写它们的输入和输出的命令。Expect是由于它的一个同名的命令而命名的。 Expect综述 Expect语言是基于Tcl的。Tcl实际上是一个子程序库,这些子程序库可以嵌入到程序里从而提供语言服务。 最终的语言有点象一个典型的 Shell语言。里面有给变量赋值的set命令,控制程序执行的if,for,continue等命令,还能进行普通的数学和字符串操作。当然了,还可以 用exec来调用Unix程序。所有这些功能,Tcl都有。Tcl在参考书籍 Outerhour[3][4]里有详细的描述。 Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令: spawn命令激活一个Unix程序来进行交互式的运行。 send命令向进程发送字符串。 expect命令等待进程的某些字符串。expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。 expect命令和Tcl的case命令的风格很相似。都是用一个字符串去匹配多个字符串。(只要有可能,新的命令总是和已有的Tcl命令相似,以使得该语言保持工具族的继承性)。下面关于expect的定义是从手册[5]上摘录下来的。 expect patlist1 action1 patlist2 action2..... 该命令一直等到当前进程的输出和以上的某一个模式相匹配,或者等到时间超过一个特定的时间长度,或者等到遇到了文件的结束为止。 如果最后一个action是空的,就可以省略它。 每一个patlist都由一个模式或者模式的表(lists)组成。如果有一个模式匹配成功,相应的action就被执行。执行的结果从expect返回。 被精确匹配的字符串(或者当超时发生时,已经读取但未进行匹配的字符串)被存贮在变量expect_match里面。如果patlist是eof或者timeout,则发生文件结束或者超时时才执行相应的action。一般超时的时值是10秒,但可以用类似”set timeout… Read More

php:最好的日志管理 monolog, php写日志monolog, php日志类monolog

主页:https://seldaek.github.io/monolog/ 项目:https://github.com/Seldaek/monolog 安装:(什么是composer?) $ composer require monolog/monolog 简单使用: <?php use Monolog\Logger; use Monolog\Handler\StreamHandler; // create a log channel $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); // add records to the log $log->warning('Foo'); $log->error('Bar');   实例:外套类: <?php /** * @filesource :… Read More