![在 CRON 中通过 SSH 捕获远程执行命令的输出失败](https://linux22.com/image/633586/%E5%9C%A8%20CRON%20%E4%B8%AD%E9%80%9A%E8%BF%87%20SSH%20%E6%8D%95%E8%8E%B7%E8%BF%9C%E7%A8%8B%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E5%A4%B1%E8%B4%A5.png)
这个问题与这个问题直接相关:从 cron bash 脚本运行时 ssh 无法执行远程命令 - 从 CLI 运行
由于我没有足够的代表,我无法对接受的答案发表评论,所以请耐心等待。
我在 Linux PC 机器上运行脚本,我试图从中获取输出的主机是带有操作系统的路由器,因此我无法影响控制台的配置。基本上在 cron 下执行此操作会得到一个空变量。OUT=$(ssh -tt -vv [email protected] "remote command")
debug1: Sending command: remote command
debug2: channel 0: request exec confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 2621440 rmax 262144
debug2: channel 0: read<=0 rfd 4 len 0
debug2: channel 0: read failed
如果我在 cron 之外执行此操作,即在 CLI 中,我会获得预期的输出。如您所见,强制分配伪 tty 的 -tt 选项没有帮助。
有什么解决方案可以帮助 cron 克服有问题的远程控制台吗?
答案1
您的命令打印结果 stderr 还是 stdout?
您可以重新路由stderr
至stdout
使用
OUT=$(ssh -tt -vv [email protected] "remote command" 2>&1 )
答案2
您是否考虑过对 cronjob 使用完全限定路径?
使用/usr/bin/ssh user@host
而不是ssh user@host
答案3
一些路由器或嵌入式设备的 SSH 实现非常糟糕。我见过一些情况,它们只知道如何从控制台读取命令,而无法处理在命令行上传递的命令。如果您遇到这种情况,您可能需要尝试将远程命令通过管道传输到远程 ssh。
echo remote command | ssh user@host
如果这有帮助的话,那么您可能更幸运地尝试使用 编写一些代码 expect
。