将 bash 循环输出重定向到变量特定文件

将 bash 循环输出重定向到变量特定文件

这对我来说可能是显而易见的,但我已经被困了一段时间了。

我正在尝试编写一个非常简单的 bash 循环来获取服务器列表,从中检索一些特定信息,然后根据启动计算机上的主机地址将输出保存到文件中。

目前代码如下:

#!/bin/bash

SERVER_LIST=/path/to/hosts

while read REMOTE_SERVER
do
    {
    ssh user@$REMOTE_SERVER 'show_stat_from_shell_command' 
} > "$REMOTE_SERVER"
done < $SERVER_LIST

上面的结果只为我的列表中的第一个主机生成一个输出文件,然后退出。

为了阻止一些更明显的解决方案,Ansible 等不是一个选择,因为这是一个非常受限的环境。出于同样的原因,使用多 shell 或 tmux 也不是一种选择(我一次只能从主机登录一个系统)。

因此,如果有人能准确地告诉我我是如何搞砸的,我将不胜感激!

答案1

代替

ssh user@$REMOTE_SERVER 'show_stat_from_shell_command'

经过

ssh user@$REMOTE_SERVER 'show_stat_from_shell_command' </dev/null

也防止 ssh 从 stdin ( $SERVER_LIST) 读取。或者使用ssh的选项-n


-n:从 /dev/null 重定向标准输入(实际上,防止从标准输入读取)。

答案2

对于这个特定问题还有另一种解决方案。它被称为并行 ssh,pssh它完全可以满足您的需求 - 它根据列表连接到计算机,运行命令,并且可以将输出保存在日志文件或基于主机名的文件中。

该项目位于http://code.google.com/p/parallel-ssh/

相关内容