sftp连接服务器,expect上传文件手动执行上传成功,但是配置了crontab后执行不成功。
#!/bin/bash
#相关参数以及服务器压缩命令
expect <<!
spawn sftp $FTP_USER@$FTP_SERVER
expect {
"password:" {
send "pass\r"
exp_continue
}
"yes/no" {
send "yes\r"
exp_continue
}
}
expect "sftp"
send "lcd 文件目录\r"
send "put test.tar.gz 远端目录\r"
expect {
"100%" {send_user "上传成功"
exit 0
}
timeout {send_user "上传超时"
exit 2
}
}
send_user "上传文件结束"
send "bye\r"
expect eof
!
# 仅在上传成功时删除本地文件
if [ $? -eq 0 ]; then
rm -f test.tar.gz"
fi
排查下来原来的crontab的环境变量导致。原来核心原因是crontab的执行环境与用户登录环境不同,而crontab默认使用精简的PATH(通常只包含 /usr/bin:/bin ),而expect命令可能位于其他目录(如 /usr/local/bin ),通过which expect发现我的expect位于/usr/local/bin 下。因此解决方案为在脚本的开始增加以下内容,其实在crontab配置中设置PATH环境变量,包含expect的路径。
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin