Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX bash脚本可以工作,但在SFTP上的crontab中失败_Macos_Bash_Cron_Sftp - Fatal编程技术网

Macos OSX bash脚本可以工作,但在SFTP上的crontab中失败

Macos OSX bash脚本可以工作,但在SFTP上的crontab中失败,macos,bash,cron,sftp,Macos,Bash,Cron,Sftp,这个话题已经被详细讨论过了,但是,我有一个关于这个主题的变体,我就是无法破解。两天过去了,我决定去社区打球。请提前阅读 执行官。总结是,我在OSX中有一个脚本,它运行良好,手动执行时不会出现问题或错误。当我将脚本放在crontab中以每天运行时,它仍然运行,但并不运行所有命令(特别是SFTP) 我已经读了足够多的文章来探讨环境问题,所以正如你在下面看到的,我在出现路径问题时硬引用了SFTP的位置 我唯一能想到的就是IdentityFile。注意:我把它放在crontab中,用于我的用户而不是ro

这个话题已经被详细讨论过了,但是,我有一个关于这个主题的变体,我就是无法破解。两天过去了,我决定去社区打球。请提前阅读

执行官。总结是,我在OSX中有一个脚本,它运行良好,手动执行时不会出现问题或错误。当我将脚本放在crontab中以每天运行时,它仍然运行,但并不运行所有命令(特别是SFTP)

我已经读了足够多的文章来探讨环境问题,所以正如你在下面看到的,我在出现路径问题时硬引用了SFTP的位置

我唯一能想到的就是IdentityFile。注意:我把它放在crontab中,用于我的用户而不是root用户。所以我知道它应该出现在我创建的id_dsa.pub上(并且已经与服务器共享了该id_dsa.pub)

我不想做任何古怪的命令,希望绕过密码,等等。我不知道为什么从cron运行时会跳过SFTP行

请看下面的代码。。非常感谢你的帮助。。thx

#!/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
    不是一种方法。养成引用所有变量的习惯,除非你特别想使用不引用的副作用

  • 您不需要导出变量,除非您调用的命令期望在环境中看到它们

  • 您不需要调用两次
    date
    ,因为YYMMDD值是日期的子字符串:
    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
    不是一种方法。养成引用所有变量的习惯,除非你特别想使用不引用的副作用

  • 您不需要导出变量,除非您调用的命令期望在环境中看到它们

  • 您不需要调用两次
    date
    ,因为YYMMDD值是日期的子字符串:
    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行。