还是expect的问题
#!/usr/bin/expect -f
set ip [lindex $argv 0]
spawn ssh root@$ip
expect {
"(yes/no)*" {send "yes\r"}
}
expect "password:"
send "123456\r"
expect "*#"
send "/usr/bin/uptime |awk '{print $1}' > /tmp/123.txt"
现在又2个问题,因为我不能确定是不是第一次登陆,如果登陆到不是第一次登陆的时候,红色的部分会报错,最后一句也报错
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
这个问题真蛋疼,你既然知道是登陆次数的问题,为啥第一次不手动登陆,让ip记住信任,然后再去写个tcl脚本
那样还叫什么脚本
这样就可以了,这一段代码今天粘了两回了
Passwd 可以在函数外面定义一下
SSH () {
Server=$1
Comm=$2
expect<<eof
set timeout 10
spawn ssh -t "$Server" "$Comm"
expect {
"not know" {send_user "[exec echo \"not knowServer\"]";exit}
"(yes/no)?" {send "yes\r";exp_continue}
"password:" {send "[exec echo $Passwd]\r";exp_continue}
"ermission denied, please try again." {
send_user "[exec echo \"Errorassword is wrongServer\"]"
exit
}
}
eof
}
昏倒,那你就expect多种情况,你的脚本里只捕获了一种yes no的情况,语法如下:
复制代码
太感谢了,我明白了,还有一个问题
就是我打算在登陆的机器上执行/usr/bin/uptime |awk '{print $1}' > /tmp/123.txt
但是报错啊
建议你去看一下tcl的一些man手册,你不能直接调用linux的外部命令,你如果想执行,用下面的方式:
好比:
复制代码
本帖最后由 dzhxc 于 2011-04-15 18:02 编辑
回复 6# ooooldman
把管道符转义了试试看,最好把重定向符也转义了。
我能明确的是,管道符不转义会出问题
还有,send 命令最后一定要加\r
tcl中调用shell命令不是这么用的,通过exec调用是语法,不是转义不转义的事情
建议适用log_file 参数保留日志到本地服务器。