使用 for 循环中的变量执行远程命令

使用 for 循环中的变量执行远程命令

我有大约 100 台服务器的列表,我需要向其中添加用户。我有一个 ssh-rsa 密钥,我还需要添加到授权密钥文件中。我正在尝试使用 for 循环来完成此任务,但我没有取得任何进展。

我使用 SSH 的别名来堡垒(连接),我可以连接到服务器,但它会在提示符处停止,然后直到我在所述提示符处键入 exit 后才会继续。即使如此,我认为它实际上只是在本地执行命令而不是远程。

我无法使用任何第三方工具,因此我必须使用默认安装中提供的工具。

#!/bin/bash

connect='ssh user@bastionserver -t --'
adduser='adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q'
mkdir='mkdir /home/foobar/.ssh'
chmod='chmod -R 700 /home/foobar/.ssh/'
chown='chown -R soc /home/foobar/'

for server in $(cat server_list.txt)
do
    $connect root@"$server"
    echo "$adduser"
    echo "$mkdir"
    echo "$chmod"
    echo "$chown"
done

我想不通这个!任何帮助表示赞赏。

答案1

ssh命令可以在远程服务器上运行命令。当没有给出运行命令时,它会启动一个交互式 shell。用于ssh执行您想要执行的命令。例如:

#!/bin/sh

while read server; do
    ssh "user@$server" sh -c '
        adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q
        mkdir /home/foobar/.ssh
        chmod -R 700 /home/foobar/.ssh/
        chown -R soc /home/foobar/'
done <server_list.txt

这显然是未经测试的代码。为了能够执行多个命令,我们使用启动一个子 shellsh -c并为该 shell 提供要运行的命令列表。

您的命令“停止”,因为它连接到服务器(实际上是连接到user@bastionserver,但我不知道该服务器如何与输入文件中列出的服务器相关)并启动交互式 shell。在该交互式 shell 退出之前,您的脚本将不会继续。

其余代码仅将字符串输出到终端。它不执行它们。

不要尝试将命令放入变量中。它很少能按预期工作。参见例如“我们如何运行存储在变量中的命令?”。


如果这对我来说是一项真正的工作任务,我可能会尝试使用类似的方法来完成它安西布尔。不幸的是,我对 Ansible 的了解还不够深入,无法在这里自信地给出一个完整的解决方案。

相关内容