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

posted @ 2022-07-12 15:06  代码生财  阅读(507)  评论(0)    收藏  举报