如何使用 Expect 进行登录,执行命令,然后退出并获取整个输出

2016-03-23 18:30:30 +08:00
 F32

我想实现下面的效果

ssh root@192.168.1.1 (密码 admin) 登录后,运行 ls ,然后输入 exit 退出 最后把 ssh 的整个输出取出来

#!/usr/bin/expect -f  

set timeout 10
spawn ssh root@192.168.1.1
expect {
    "*yes/no" {
        send "yes\n";
        exp_continue
    }
    "*password:" {
        send "admin\n"
    }
    "# " {
        puts $expect_out(buffer)
        send "exit\n"
        expect eof
    }
}

但是上面的代码好像有点问题,没法实现我想要的效果,请问这个应该怎么写?

3992 次点击
所在节点    程序员
3 条回复
SpicyCat
2016-03-23 18:54:08 +08:00
ssh root@192.168.1.1 'ls'

这样不行么?
F32
2016-03-23 19:15:10 +08:00
@SpicyCat 发现好像可以的,目前可以解决我的问题。不过交互式模式有时也是需要的,这种情况下有获取输出的方法吗?
truehyp
2016-03-24 14:35:34 +08:00
最近东拼西凑出来的一个脚本,还没改完,可以批量操作,所有操作记录都在 log 文件里。打算再改改,用 scp 将所有输出取回本机。
________________
#!/bin/sh

cmdfile=cmd.txt
ipfile=ip.txt


#run expect function
function run()
{
expect <<-END
set timeout 30
set f [open $cmdfile r]
spawn ssh -l $2 $1
expect {
"yes/no)*" {send "yes\r";exp_continue}
"*?assword:*" {send "$3\r";exp_continue}
"]#*" {while {[gets \$f line] >= 0} {send "\$line\r"}}
}
send "exit\r"
expect eof

spawn scp $1:~/log.txt ./
expect {
"yes/no)*" {send "yes\r";exp_continue}
"*?assword:*" {send "$3\r";exp_continue}
}

END
return;
}


for i in `cat $ipfile`
do
ip=`echo $i | awk -F "|" '{print $1}'`
user=`echo $i | awk -F "|" '{print $2}'`
passwd=`echo $i| awk -F "|" '{print $3}'`

date >> log;
run $ip $user $passwd >> log;
done

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX