Macos OSX bash脚本可以工作,但在SFTP上的crontab中失败
这个话题已经被详细讨论过了,但是,我有一个关于这个主题的变体,我就是无法破解。两天过去了,我决定去社区打球。请提前阅读 执行官。总结是,我在OSX中有一个脚本,它运行良好,手动执行时不会出现问题或错误。当我将脚本放在crontab中以每天运行时,它仍然运行,但并不运行所有命令(特别是SFTP) 我已经读了足够多的文章来探讨环境问题,所以正如你在下面看到的,我在出现路径问题时硬引用了SFTP的位置 我唯一能想到的就是IdentityFile。注意:我把它放在crontab中,用于我的用户而不是root用户。所以我知道它应该出现在我创建的id_dsa.pub上(并且已经与服务器共享了该id_dsa.pub) 我不想做任何古怪的命令,希望绕过密码,等等。我不知道为什么从cron运行时会跳过SFTP行 请看下面的代码。。非常感谢你的帮助。。thxMacos OSX bash脚本可以工作,但在SFTP上的crontab中失败,macos,bash,cron,sftp,Macos,Bash,Cron,Sftp,这个话题已经被详细讨论过了,但是,我有一个关于这个主题的变体,我就是无法破解。两天过去了,我决定去社区打球。请提前阅读 执行官。总结是,我在OSX中有一个脚本,它运行良好,手动执行时不会出现问题或错误。当我将脚本放在crontab中以每天运行时,它仍然运行,但并不运行所有命令(特别是SFTP) 我已经读了足够多的文章来探讨环境问题,所以正如你在下面看到的,我在出现路径问题时硬引用了SFTP的位置 我唯一能想到的就是IdentityFile。注意:我把它放在crontab中,用于我的用户而不是ro
#!/bin/bash
export DATE=`date +%y%m%d%H%M%S`
export YYMMDD=`date +%y%m%d`
PDATE=$DATE
YDATE=$YYMMDD
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED="~/Dropbox/"
USER="user"
HOST="host.domain.tld"
A="/tmp/5nPR45bH"
>${A}.file1${PDATE}
>${A}.file2${PDATE}
BYEbye ()
{
rm ${A}.file1${PDATE}
rm ${A}.file2${PDATE}
echo "Finished cleaning internal logs"
exit 0
}
echo "get -r *" >> ${A}.file1${PDATE}
echo "quit" >> ${A}.file1${PDATE}
eval mkdir ${FEED}${YDATE}
eval cd ${FEED}${YDATE}
eval /usr/bin/sftp -b ${A}.file1${PDATE} ${USER}@${HOST}
BYEbye
exit 0
不是答案,只是对代码的注释
- 使用空格处理文件名的方法是引用变量:
--“$var”
不是一种方法。养成引用所有变量的习惯,除非你特别想使用不引用的副作用eval
- 您不需要导出变量,除非您调用的命令期望在环境中看到它们
- 您不需要调用两次
,因为YYMMDD值是日期的子字符串:date
YYMMDD=“${date:0:6}”
- 只是一个偏好:我在脚本中使用
而不是$HOME
~
- 您从未使用过“file2”临时文件--为什么要创建它
- 由于您的sftp批处理文件非常简单,因此您实际上不需要文件:
printf“%s\n”get-r*“quit”| sftp-b-“$USER@$HOST”
这里有一个改写,大大缩短了:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED_DIR="$HOME/Dropbox/$(date +%Y%m%d)"
USER="user"
HOST="host.domain.tld"
mkdir "$FEED_DIR" || { echo "could not mkdir $FEED_DIR"; exit 1; }
cd "$FEED_DIR"
{
echo "get -r *"
echo quit
} |
sftp -b - "${USER}@${HOST}"
不是答案,只是对代码的注释
- 使用空格处理文件名的方法是引用变量:
--“$var”
不是一种方法。养成引用所有变量的习惯,除非你特别想使用不引用的副作用eval
- 您不需要导出变量,除非您调用的命令期望在环境中看到它们
- 您不需要调用两次
,因为YYMMDD值是日期的子字符串:date
YYMMDD=“${date:0:6}”
- 只是一个偏好:我在脚本中使用
而不是$HOME
~
- 您从未使用过“file2”临时文件--为什么要创建它
- 由于您的sftp批处理文件非常简单,因此您实际上不需要文件:
printf“%s\n”get-r*“quit”| sftp-b-“$USER@$HOST”
这里有一个改写,大大缩短了:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
FEED_DIR="$HOME/Dropbox/$(date +%Y%m%d)"
USER="user"
HOST="host.domain.tld"
mkdir "$FEED_DIR" || { echo "could not mkdir $FEED_DIR"; exit 1; }
cd "$FEED_DIR"
{
echo "get -r *"
echo quit
} |
sftp -b - "${USER}@${HOST}"
你正在为一个临时文件做一项艰苦的工作,使用maketmp()
eval使它保持简单是复杂和危险的,不要在你不需要它的时候使用它。在这里,你不需要它,所以移除它;您确实需要将FEED=“~/Dropbox/”
更改为FEED=~/Dropbox
。将A=“/tmp/some\u fixed\u name”
替换为A=“$(mktemp)”
。(这些不是问题的原因。)钥匙上有密码吗?如果有,您希望如何获得它?。。。还有,为什么要使用那些不必要的“eval”命令。我的第一个建议是,你应该简化你的脚本,删除多余的或不必要的复杂内容。。并且\正在导致问题。。毫无疑问,我不会写诗意的代码。。所以tmp文件的内容是很久以前的编码。。关于SFTP和密码短语,这是一个很好的问题。。也许,希望是解决方案的核心。在终端中运行时,脚本按照上面所述的方式工作,不会出现问题、错误或交互。不需要密码或密码短语。我的意图是在cron中使用相同的方法。脚本执行时跳过了SFTP行。你正在为一个临时文件做一项艰苦的工作,使用maketmp()eval使它保持简单是复杂和危险的,不要在你不需要它的时候使用它。在这里,你不需要它,所以移除它;您确实需要将FEED=“~/Dropbox/”
更改为FEED=~/Dropbox
。将A=“/tmp/some\u fixed\u name”
替换为A=“$(mktemp)”
。(这些不是问题的原因。)钥匙上有密码吗?如果有,您希望如何获得它?。。。还有,为什么要使用那些不必要的“eval”命令。我的第一个建议是,你应该简化你的脚本,删除多余的或不必要的复杂内容。。并且\正在导致问题。。毫无疑问,我不会写诗意的代码。。所以tmp文件的内容是很久以前的编码。。关于SFTP和密码短语,这是一个很好的问题。。也许,希望是解决方案的核心。在终端中运行时,脚本按照上面所述的方式工作,不会出现问题、错误或交互。不需要密码或密码短语。我的意图是在cron中使用相同的方法。脚本执行时跳过了SFTP行。