我有大约 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 的了解还不够深入,无法在这里自信地给出一个完整的解决方案。