sh脚本中包含expect ,手动执行成功,crontab执行失败

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容