在许多服务器上通过 SSH 自动运行命令

Lan*_*nes 55 scripting ssh parallelism

.txt 文件中有一个 IP 地址列表,例如:

1.1.1.1
2.2.2.2
3.3.3.3
Run Code Online (Sandbox Code Playgroud)

每个 IP 地址后面都有一个服务器,并且在每个服务器上都有一个在端口 22 上运行的 sshd。并非每个服务器都在known_hosts列表中(在我的 PC 上,Ubuntu 10.04 LTS/bash)。

如何在这些服务器上运行命令并收集输出?

理想情况下,我想在所有服务器上并行运行这些命令。

我将在所有服务器上使用公钥身份验证。

以下是一些潜在的陷阱:

  • ssh 提示我将给定的服务器 ssh 密钥放入我的known_hosts文件中。
  • 给定的命令可能返回非零退出代码,表明输出可能无效。我需要认识到这一点。
  • 与给定服务器的连接可能无法建立,例如由于网络错误。
  • 应该有一个超时,以防命令运行的时间比预期的要长,或者服务器在运行命令时出现故障。

服务器是 AIX/ksh(但我认为这并不重要。

Cal*_*leb 68

有几种工具可以让您同时登录并在多台机器上执行一系列命令。这里有几个:

  • 您可能希望将 [pdsh](http://sourceforge.net/projects/pdsh/) 添加到列表中。 (2认同)

Ric*_*rri 18

如果您更喜欢Python脚本而不是 bash脚本,那么Fabric可能是适合您的工具。

Fabric 主页

Fabric 是一个 Python(2.5 或更高版本)库和命令行工具,用于简化 SSH 在应用程序部署或系统管理任务中的使用。

它提供了一套基本的操作来执行本地或远程 shell 命令(通常或通过 sudo)和上传/下载文件,以及诸如提示正在运行的用户输入或中止执行的辅助功能。

典型用途包括创建一个包含一个或多个函数的 Python 模块,然后通过 fab 命令行工具执行它们。

  • Fabric v1 太棒了。不幸的是,Fabric v2 删除了大部分对此用例有用的功能——目前不推荐(2018 年 6 月)。 (3认同)

Arc*_*ege 16

假设您无法安装 pssh 或其他软件,您可以执行以下类似操作:

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
Run Code Online (Sandbox Code Playgroud)

  • 将脚本置于后台会创建子进程。当子进程退出时,进程“槽”和资源会留在系统中,直到父进程退出或父进程“等待”子进程。这些“被仍然存在的”进程称为“僵尸”进程。在子进程之后进行清理并回收资源是一种良好的行为。 (5认同)

Ant*_*hon 12

我确实为此使用了GNU 并行,最具体地说,您可以使用以下方法:

parallel --tag --nonall --slf your.txt command
Run Code Online (Sandbox Code Playgroud)

随着your.txt与所述服务器IP地址/名称的文件。

  • @Özzesh 查看 http://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html 是否涵盖了您不安装 GNU Parallel 的原因 (2认同)

mic*_*has 11

非常基本的设置:

for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done
Run Code Online (Sandbox Code Playgroud)

使用名称/密码进行身份验证真的不是一个好主意。您应该为此设置一个私钥:

ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done
Run Code Online (Sandbox Code Playgroud)