尬了。sftp的rm一次只能删除一个文件,用shell的循环只能登录一次删一个,效率有点低,而且容易被风控,当然也可以使用脚本提前生成文件一次解决,那就顺便就看了下expect的内嵌循环,真的真是资料有点少。
expect内嵌循环实在是不会用,百度了一下,一知半解,这里记录一下,另外说下expect中的语法多个空格都要报错,只能一点一点排查。
例:sftp一次性删除远端多个文件
expect脚本如下:
#!/usr/bin/expect
#set变量赋值
set FE_IPADD 192.168.68.160
set FE_USER root
set FE_PWD 123456789
set DEL_PATH /root/filename.txt
set timeout -1
#打开$DEL_PATH文件赋值给NAME
set NAME [open ${DEL_PATH} r]
spawn sftp ${FE_USER}@${FE_IPADD}
expect {
"yes/no" { send "yes\r" }
"password:" { send "$FE_PWD\r" }
}
#expect的while循环,get读取$NAME变量
while {[gets $NAME line] >= 0} {
#set 赋值FE_FILE
#$line,while循环行,从第一行开始
#0代表第一列,1代表第二列。。。
set FE_FILE [lindex $line 0]
expect "sftp>" { send "rm $FE_FILE \n" }
}
expect "sftp>" { send "exit \n" }
close $NAME
功能:从/root/filename.txt读取文件名,登录sftp后,使用expect的while循环进行逐一删除。
发表评论