关于这个命令程序的用法网上也有很多了,有了这个脚本自动执行更加方便。这里总结自己常用的和注意事项。
基本用法
自动登录后不影响vim
#!/usr/bin/expect -f
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
** 注意 trap 里面是为了防止用tmux 等登录服务器使用 vim 等出现错误的情况 ** 应该是为了把窗口改变的信息传给相应程序。【猜测】
传参
set var [lindex $argv 1]
自动登录
set user user_name
set host 1.1.1.1
set password user_pass
set timeout 30
#spawn ssh -D $port $user@$host
spawn lftp $user@$host
#expect "*assword:*"
#send "$password\r"
expect {
"yes/no" {send "yes\r"}
"*assword:" {send "$password\r"}
}
登录后执行命令
expect {
"lftp wangpengrui" {send "cd __log \r"}
}
#send "mirror 1.mrun/visual_direct/ 1.mrun\r"
send "bye\r"
演示了两种,一种等待出现然后执行,一种直接执行
执行结束
也是两种
expect eof # 直接结束交互
#interact # 转让交互给用户
示例
自动scp
2、3 个参数主要是为了支持 -r 选项,当然下面的写法只是单向的,后续如果用到双向再研究 [主要是新的脚本语法,很不熟]
#!/usr/bin/expect
if {$argc == 2} {
#set user [lindex $argv [expr $argc-1]]
set src [lindex $argv 0]
set dst [lindex $argv 1]
set cmd ""
} elseif {$argc==3 } {
set cmd [lindex $argv 0]
set src [lindex $argv 1]
set dst [lindex $argv 2]
} else {
send "argc $argc"
exit
}
set server "xxx@xxx"
set password "xxxx"
send "scp $cmd $src $server:$dst\n"
#exit
#spawn scp $cmd $src $server:$dst
spawn sh -c "scp $cmd $src $server:$dst"
# spawn sh -c "scp $cmd $server:$src $dst" # 如果再实现判断语句
expect {
"(yes/no)?" {
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:" {
send "$password\n"
}
}
interact