这对我来说可能是显而易见的,但我已经被困了一段时间了。
我正在尝试编写一个非常简单的 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
它完全可以满足您的需求 - 它根据列表连接到计算机,运行命令,并且可以将输出保存在日志文件或基于主机名的文件中。