无法在cron中获得远程ssh stdout输出,但是在我的终端中它可以工作

时间:2018-09-02 18:53:47

标签: linux bash ssh cron

上周我遇到了一个问题,这使我发疯。我编写了一个BASH脚本,该脚本与acamai进行了ssh远程连接,然后执行了一个简单的“ ls”。我想将'ls'sdtout输出重定向到给定文件。

虽然脚本本身在手动运行时就像一个超级按钮,但在通过cron运行时却不会。 cronjob以root身份运行,并且每个命令均按ssh命令的预期运行。我的系统是Gentoo Linux,cron是旧的但金色的vixie-cron。

为了减少200个LOC,我在此处仅介绍了一个基础知识(作为一个脚本)就足以说明问题。

#!/bin/bash
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin'
#set -x
shopt -s lastpipe
exec 2>log.out
(ssh -i <path to key> -o HostKeyAlgorithms=+ssh-dss -o StrictHostKeyChecking=no <account@example.com> 'ls -r <path>') > '/root/listing.txt'

即使在-vvv的{​​{1}}调试模式下,我也可以看到一切正常……只是没有任何stdout输出。 比我尝试在互联网上的另一个帖子中找到的其他东西:

ssh

这里有缺点,我开始了一个我无法关闭的ssh会话,我猜是由于/ dev / zero造成的。 另一种方法是使用TEE Pipe ssh命令的子外壳...这工作了很短的时间(为什么还没有呢?!)

现在我一无所知,需要帮助。 Cron有它的PATH,使用BASH等。很好奇我的老板使用Java成功做到了这一点(他讨厌BASH ...)。

欢迎任何解释和有用的提示。

1 个答案:

答案 0 :(得分:-1)

我有同样的问题,我为CRON编写了脚本,它从远程SSH主机获取输出。 如果我手动运行脚本-它可以正常工作。但是当CRON运行它时-我只是远程输出的一部分。

我不知道为什么会这样。

#!/bin/sh
pass=123
filelist=$(sshpass -p "$pass" ssh -q -tt -o StrictHostKeyChecking=no user@"10.10.10.10" "list")

filestring=$(echo "$filelist" | grep -Po "(\S+\s\S+\s+\d+\s\d{2}:\d{2}:\d{2}\s\d{4})\slist0\.lst")
filedate=${filestring% list0.lst}
echo $filedate
filestamp=$(date -d "$filedate" +"%s")
echo $filestamp

当我通过CRON在文件中获取回显时-有从0:00:00开始的日期-具有日期的字段(echo $ filedate)为空。但是当我手动运行时-我会得到正常的日期和时间...

这真的让我感到困扰。

帮助?

我找到了解决方法-在ssh命令中添加“ -tt”,所有输入都变为变量。

filelist=$(sshpass -p "$pass" ssh -q -tt -o StrictHostKeyChecking=no user@"10.10.10.10" "list")