Expect基本用法
一、安装
参考链接:https://www.lmlphp.com/user/67199/article/item/1450160/
离线安装expect - tozh - 博客园 (cnblogs.com)
二、远程登录
1、嵌入执行
-
在shell中使用expect
-
ftp中的交互
#!/bin/sh
nowdate=`date +%Y%m01` #本月第一天
startDay=`date -d"$nowdate last month" +%Y%m%d`
endDay=`date -d"$nowdate last day" +%Y%m%d`
month=${startDay:0:6}
echo $startDay
echo $endDay
echo $month
/usr/bin/expect<<-EOF
set timeout -1
spawn sftp -P port user_name@ip
expect "Password:*"
send "password\r"
#关闭主动模式
#expect "ftp>*"
#send "prompt\r"
#上传文件
expect "ftp>*"
send "mget TO_PS_SOFTPROBE_*.csv\r"
#结束
expect "]*"
[interact]
send "exit\r"
expect eof
EOF
2、直接执行
-
直接使用expect
-
变量的赋值
-
expect中日期的设定
-
gp数据库中的交互
-
if-else语句的使用
#!/usr/bin/expect
set timeout -1
# 今天
set date [ clock format [ clock seconds ] -format "%Y%m%d" ]
set secon [ clock seconds ]
# 6天前
set day6_secon [expr {$secon - 518400} ]
set day6 [ clock format [ expr {$day6_secon} ] -format "%Y%m%d" ]
set endNum [ clock format [ expr {$day6_secon} ] -format "%d" ]
puts "$endNum"
if {$endNum == 05 || $endNum == 10 || $endNum == 15 || $endNum == 20 || $endNum == 25 || $endNum == 30} {
set pwd_root "password"
spawn ssh user_name@ip
expect "*password:"
send "$pwd_root\r"
expect "]*"
send "scp -r hdfs@10.17.10.70:/var/lib/hadoop-hdfs/output_gp/*/$day6/*.txt /data/sysk/result\r"
expect "*yes"
send "yes\r"
expect "*password:"
send "$pwd_hdfs\r"
expect "]*"
send "su root\r"
expect "Password*"
send "$pwd_root\r"
send "su gpadmin\r"
send ". /home/gpadmin/.bash_profile\r"
send "psql -d new_qc_sys_c\r"
expect "new_qc_sys_c=#"
send "copy qc_sys_c.sysk_statistics_indicator FROM '/data/sysk/result/statistics_indicator-$day6.txt' with DELIMITER as '|' NULL as 'null string' ;\r"
expect "new_qc_sys_c=#"
send "copy qc_sys_c.sysk_statistics_provcity FROM '/data/sysk/result/statistics_provcity-$day6.txt' with DELIMITER as '|' NULL as 'null string' ;\r"
} else {
puts "不满足出入库的结束时间"
}
#结束
expect "]*"
[interact]
send "exit\r"
3、传参登录
#!/usr/bin/expect
if { $argc != 1 } {
send_user "usage: expect $argv0 user name\n"
exit
}
set user [lindex $argv 0]
set pwd_root "pwd_root"
set pwd_xlfx "pwd_xlfx"
if { $user == "root" } {
spawn ssh $user@ip
expect "*password:"
send "$pwd_root\r"
#expect "]*"
#send "su root\r"
#expect "Password:*"
#expect "*password:"
#send "$pwd_root\r"
} elseif { $user == "xlfx" } {
spawn ssh $user@ip
expect "*password:"
send "$pwd_xlfx\r"
}
#结束
expect "]*"
[interact]
send "exit\r"
三、循环语句和条件语句
1、循环建立数据库月分区表
#!/usr/bin/expect
set timeout -1
set date [ clock format [ clock seconds ] -format "%Y%m%d" ]
set secon [ clock seconds ]
set day10_secon [expr {$secon + 864000} ]
set mon [ clock format [ expr {$day10_secon} ] -format "%Y%m" ]
puts "本月25号创建下个月份分区表,起始为:${mon}01,结束${mon}32"
spawn ssh xlfx@192.168.24.217
expect "*password:"
send "$pwd_xlfx\r"
expect "]*"
send "su root\r"
expect "Password*"
send "$pwd_root\r"
send "su gpadmin\r"
send ". /home/gpadmin/.bash_profile\r"
send "psql -d new_qc_sys_c\r"
for { set i 1 } { $i <37 } { incr i 1 } {
expect "new_qc_sys_c=#"
send "alter table qc_sys_c.ods_slsw_d_tb$i add partition p$mon start(${mon}01::integer) end (${mon}32::integer);\r"
}
#结束
expect "]*"
[interact]
send "exit\r"
2、判断数值
if {$endNum == 05 || $endNum == 10 || $endNum == 15 || $endNum == 20 || $endNum == 25 || $endNum == 30} {
puts "满足出入库的结束时间"
} else {
puts "不满足出入库的结束时间"
}
四、参考链接
1、shell脚本实现ssh自动登录远程服务器示例 - lqyyue - 博客园 (cnblogs.com)
2、(68条消息) Linux中EOF和Expect命令详解_Jeremy_Lee123的博客-CSDN博客_eof expect
3、(68条消息) linux expect 自动交互脚本用法_hiekay的博客-CSDN博客_expect linux