从终端和 bash 脚本启动时查找命令结果不同

从终端和 bash 脚本启动时查找命令结果不同

这可能是我这边的一个概念错误,但此时我有点迷失了。

我想创建一个脚本(稍后由 Nagios 启动,但这是一个不同的故事),以便检查本地和远程主机中某个文件夹(包括子文件夹)上最新创建的文件的时间戳,以便我可以查看我们运行的 rsync 进程是否工作正常。

因此,我研究并提出了以下命令:

find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }

以及远程主机和文件夹的 ssh 版本:

ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }

如果我只是使用普通会话用户(而不是管理员帐户)在终端中启动这些命令,它们就可以正常工作,并且我会得到一个 UNIX 时间戳。

因此,我创建了一个 bash 脚本来复制这两个命令,并减去结果,以便我可以在差异大于 N 秒时发出警告。但这样就行不通了。这似乎不是代码错误,只是 ssh 命令在从 bash 脚本启动时返回不同的值。一个非常不同的价值,有多年的差异。

恕我直言,它不是通过 ssh 进行访问,而是以某种方式访问​​一个空文件夹,只包括一个隐藏文件夹(例如“./ssh/”或类似的东西)。但我不知道为什么。

该脚本有以下代码:

LOCAL_FOLDER=/home/myuser/myfolder/data/
REMOTE_FOLDER=/var/www/sites/all/data/
RSA_PRIVATE_KEY=/home/myuser/.ssh/id_rsa_Test
REMOTE_IP=XXX.XXX.XXX.XXX
REMOTE_USER=my-remote-user

last_local_timestamp=$(find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; })
last_remote_timestamp=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }')
test=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 ')
echo $test
time_diff=$((${last_local_timestamp%.*} - ${last_remote_timestamp%.*}))
echo LOCAL: ${last_local_timestamp%.*}
echo REMOTE: ${last_remote_timestamp%.*}
echo DIFF: ${time_diff}

知道发生了什么事吗?

编辑:使用以下文档进行更正尝试:

last_local_timestamp=$(find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | sed -e 's/^[^ ]* //')
last_remote_timestamp=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} <<- EOF
    find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | sed -e 's/^[^ ]* //'
    EOF )
test=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} <<- EOF
    find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1
    EOF )

答案1

  1. 为什么要将输出通过管道传输head -n 1read -a array然后打印数组的第一个元素?尝试只| sed -e 's/^[^ ]* //'删除第一个空格之前的所有内容。即从行的开头去除时间戳)。

  2. 引用你的变量。使用花括号是不是作为引用的替代品,它们的唯一目的是消除变量名称与相邻字符的歧义,否则这些字符将被解释为变量名称的一部分。

  3. ${REMOTE_FOLDER}里面单身的-quotes(即在 ssh 命令内)是一个文字字符串,它确实不是评估 $REMOTE_FOLDER 的值。引用始终是 shell 中的 PITA,特别是当您有(或需要)多层嵌套引用时。尝试使用定界符而不是引号,它会更容易使用。

相关内容