从命令行运行时,下面的脚本运行良好。我还放入了一个 Cron 作业,并且我知道 Cron 作业正在运行,因为我在 sftpFileLog.txt 中看到了条目。
但是,当在 Cron Job 下运行时,我在 sftpLog.txt 中看到的唯一内容是顶部的一行,该行绘制线条并放置当前日期/时间。另外,我期望的两个文件在 Cron Job 下运行时不会显示在 SFTP 服务器上(但在直接运行 Bash 脚本时会显示)。
我试图将“此处文档”和重定向到我发现的其他几篇文章的文件结合起来。
我是否可能存在安全问题或代码问题?我是一位经验丰富的 IT 人员,但对 bash 脚本和 Linux 还很陌生。 (这是 Ubuntu 20.04)。
#!/bin/bash
currentDate=`date`
echo "------- $currentDate ------------------------------------------------------------" >>/home/nealwalters/bin/sftpFileLog.txt
echo "------- $currentDate ------------------------------------------------------------" >>/home/nealwalters/bin/sftpLog.txt
for filename in /home/nealwalters/downloads/*.csv; do
currentDate=`date`
echo "Loop: Filename=$filename"
echo "$currentDate SFTPUser3 Filename=$filename" >> /home/nealwalters/bin/sftpFileLog.txt
(
sftp -i /home/nealwalters/keys/SFTPUser1_Private.pem [email protected] << EOF
cd User3ToMyCompany
put $filename
exit
EOF
) >> /home/nealwalters/bin/sftpLog.txt
echo "----------------------------------------------------------------"
done
sftpLog.txt 文件中的示例(以黄色突出显示的行是我从终端运行脚本时看到的预期结果,下面的行是从 Cron 作业运行后的每分钟)。
- - - 第2部分 - - - -
我不敢相信添加电子邮件会产生错误,而且它不会出现在其他两个地方之一:1)系统日志2)为什么我的重定向没有将其写入我提供的文件中。
我参考了这个帖子获取有关如何设置的信息并查看电子邮件。
问题 1 - 那么我的重定向与此处的文档混合完全错误吗?问题 2 - 为什么当我在 Cron 下运行时会收到“主机密钥验证失败”的消息,而当我自己运行时却不会收到“主机密钥验证失败”消息?我将尝试 user=nealwalters 而不是 user=root 来看看这是否有区别。
----- 第 3 部分 --------
从“root”更改为“nealwalters”似乎解决了这个问题。
我想我没有路由“stderr” - 需要这样的东西:out 2> sftpLog.txt。
root不是有所有权限吗?但我知道私钥可能很奇怪,并且只能访问一个用户。
答案1
只是一个大胆的猜测,但这也行得通吗?
scp -i /home/nealwalters/keys/SFTPUser1_Private.pem /home/nealwalters/downloads/*.csv [email protected]:User3ToMyCompany
您还可以~/.ssh/config
使用内容进行创建
Host company
Hostname 192.168.1.179
User STFPUser3
IdentityFile /home/nealwalters/keys/SFTPUser1_Private.pem
然后你只需这样做就可以了:
scp /home/nealwalters/downloads/*.csv company:User3ToMyCompany
主机密钥验证失败的原因是执行脚本的用户没有该主机的主机密钥。您似乎以 root 身份运行 cronjob。您还可以使用您自己的用户创建 cronjob crontab -e
。
答案2
我引用了这篇文章来获取有关如何设置和查看电子邮件的信息。
必须安装电子邮件 MTA(邮件传输代理),因为 stderr 和 stdout 显然已发送到电子邮件。
aptitude install postfix
使用这样的命令查看文件的最后几行(或在编辑器中打开)
tail -f /var/mail/<your_username>
然后我看到了安全错误,并且必须将 cron 作业文件中的用户从“root”切换到“”。