交互式shell编程利器expect

手里有几台Linux服务器需要经常添加用户,每次都要登录到相应的机器上去添加,特别麻烦。于是想,可不可以在一台机器上写一个脚本来远程管理其它服务器呢?

目标首先瞄准了我熟悉的PHP-CLI,它有一个开发中的模块ssh2,可以完成相应的功能。这个不想说了,因为用了半天都不行,Bug还太多,建议大家如非必要还是不要用这个模块的好。

没了PHP,很迷茫,然后很幸运地发现了expect。expect是交互式shell编程的利器,可以根据返回值来确定下面发送什么命令,特别好用。我把自己编写的远程增加用户的shell跟大家分享下(需要机器装有expect,没有的自己装吧),脚本如下:

#!/usr/bin/expect
#脚本第一个参数是远程服务器IP
set IP     [lindex $argv 0]
#远程服务器用户名(通常用root)
set USER [lindex $argv 1]
#远程服务器用户名的密码
set PASSWD [lindex $argv 2]
#添加的新用户
set Nuser [lindex $argv 3]
#新用户的密码
set Npasswd [lindex $argv 4]
#用spawn启动一个ssh客户端
spawn ssh -l $USER $IP
#如果是第一次连接,要保存密钥再输入密码,如果不是第一次连接则输入密码
expect {
 "yes/no" { send "yes\r"; exp_continue }
 "password:" { send "$PASSWD\r" }
}
#如果不是root,要expect "$",下面不讲了,很简单
expect "*#"
send "useradd -s /bin/sh -d /home/$Nuser $Nuser\r"
expect "*#"
send "passwd $Nuser\r"
expect "*password:"
send "$Npasswd\r"
expect "*password:"
send "$Npasswd\r"
expect "*#"
send "exit\r"

© 2009, kangzj. 版权所有.

Tags: , , , , ,
| 十二月 21st, 2009 | Posted in 服务器OS |

50 Responses to “交互式shell编程利器expect”

  1. ShuaiGe.Me Says:

    沙发

    [回复]

    kangzj 回复:

    @ShuaiGe.Me, 欢迎~~

    [回复]

  2. houkai Says:

    板凳

    [回复]

    kangzj 回复:

    @houkai, 够简洁~Houkai,最近尽快啥呢?

    [回复]

  3. 蓝冰 Says:

    为什么我又来晚了……

    [回复]

    kangzj 回复:

    @蓝冰, 呵呵,你那边我也基本没有抢到过沙发

    [回复]

    蓝冰 回复:

    @kangzj, 无所谓了,抢到喽就行,上午还来来着……

    [回复]

  4. fatkun Says:

    额。。看不懂。。。就不看了。。

    [回复]

    kangzj 回复:

    @fatkun, 来水下也是欢迎的啊,呵呵

    [回复]

  5. zhukun Says:

    有服务器的玩的都是高级的东东

    [回复]

    kangzj 回复:

    @zhukun, 没事瞎折腾

    [回复]

  6. 久酷 Says:

    这个我不懂,哈哈

    [回复]

    kangzj 回复:

    @久酷, 就是添加用户而已

    [回复]

  7. Duia Says:

    一点都看不懂。 :?:

    [回复]

    kangzj 回复:

    @Duia, 呵呵~

    [回复]

  8. reus Says:

    好东东 :-P

    [回复]

    kangzj 回复:

    @reus, 嗯,交互非常方便

    [回复]

  9. 漠天 Says:

    我也正在学习Linux,O(∩_∩)O哈哈~

    [回复]

    kangzj 回复:

    @漠天, Linux非常爽,哈哈

    [回复]

  10. zwwooooo Says:

    啊,看不懂,我来坐坐地板——太冷了

    [回复]

    kangzj 回复:

    @zwwooooo, 呵呵~

    [回复]

  11. 我买糕的。 Says:

    每个月总有那么几天…………要过来打酱油的。。。

    [回复]

    kangzj 回复:

    @我买糕的。, 日用百货都有

    [回复]

  12. nilei helo Says:

    heloo my name is nilei

    [回复]

    kangzj 回复:

    @nilei helo, 原来是。。。

    [回复]

  13. 精辟微博 Says:

    学习了。linux 不敢碰。

    [回复]

    kangzj 回复:

    @精辟微博, 不敢碰怎么学习啊,呵呵

    [回复]

  14. Showfom Says:

    嗯哼

    [回复]

    kangzj 回复:

    @Showfom, 嗯哼个毛线~~吼吼

    [回复]

  15. 超人 Says:

    linux我就玩过一次.还是上Q

    [回复]

    kangzj 回复:

    @超人, 上Q?玩Linux?

    [回复]

    HzlzH 回复:

    @kangzj, 那个linux QQ太抵挡了。。。啥功能都米

    [回复]

    kangzj 回复:

    @HzlzH, 我反而感觉很简洁,很好用咧~

    [回复]

    HzlzH 回复:

    @kangzj, 这样的话,webQQ 是不错的选择,呵呵
    PS:你的回复email 果然一如既往的在我的垃圾箱里 :mrgreen:

    [回复]

    kangzj 回复:

    @HzlzH, 你的邮箱比较凶猛。。。

    [回复]

    HzlzH 回复:

    @kangzj, 哪有啊,我一直用的Qmail你知道的,所以说phpmail就是没有smtp好,嘿嘿

    [回复]

  16. Hobo Says:

    不太懂这方面的东西呵呵,过来串门,并且圣诞快乐

    [回复]

    kangzj 回复:

    @Hobo, 圣诞快乐 :lol:

    [回复]

  17. ShuaiGe.Me Says:

    圣诞快乐。。

    [回复]

    don 回复:

    @ShuaiGe.Me, 剩蛋快乐

    [回复]

    kangzj 回复:

    @don, 圣诞快乐

    [回复]

    kangzj 回复:

    @ShuaiGe.Me, 圣诞快乐

    [回复]

  18. ngshaozhu Says:

    圣诞快乐 :-P

    [回复]

    houkai 回复:

    同上

    [回复]

    kangzj 回复:

    @houkai, 圣诞快乐

    [回复]

    kangzj 回复:

    @ngshaozhu, 圣诞快乐

    [回复]

  19. 小桥流水人家 Says:

    这个交互式的就厉害了!

    [回复]

    kangzj 回复:

    @小桥流水人家, 呵呵,我也想做成交互的呢,不过时间不多,没功夫做呀~

    [回复]

  20. pugwoo Says:

    实用,收下了~

    [回复]

    kangzj 回复:

    @pugwoo, 呵呵,挺有用的

    [回复]

Leave a Reply