![用于纠正大量主机中授权密钥文件权限的 Shell 脚本](https://linux22.com/image/105885/%E7%94%A8%E4%BA%8E%E7%BA%A0%E6%AD%A3%E5%A4%A7%E9%87%8F%E4%B8%BB%E6%9C%BA%E4%B8%AD%E6%8E%88%E6%9D%83%E5%AF%86%E9%92%A5%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
我有大量系统需要连接到 (hosts.txt) 并在将密钥推送到系统之前更新授权密钥文件的权限。
我继承了可以推送密钥的文件,检查使用一组用户名/密码响应 22 的主机的子网,并检查 ssh 是否可以与我们的密钥连接。其中大部分都是用expect写的。
现在,我需要获取该列表,并根据需要将权限(0700 或 0600?)推送到在子网扫描中响应的主机,以便我们可以将密钥一起推送到系统。
我可以弄清楚 do/while read hosts.txt 部分。我所坚持的部分是通过执行 chmod 0700 ~/.ssh/authorized_key 文件对目标系统进行 ssh 编程(使用 sshpass 或期望密码自动化)。
我真的很想在发生故障时看到一些返回代码(旧的系统管理员有时会让 root 成为 ~/.ssh 目录的所有者,甚至是我们正在调整的标准用户的 ~ 目录的所有者。
我可以手动执行 ssh user@host 。用户(和密码)将保持不变,只是主机根据我们将加载的hosts.txt 文件进行更改。我只是想避免手动执行数百次。完成此操作后,我将能够使用 Pushkey.exp 自动(执行/同时)更新所有已更正的系统。
这是我到目前为止所得到的:
#!/bin/bash
# Permissions fix authorized_keys, using bash
#
# Usage: ./manage_host.sh
# -----------------------------------------------------------------------------
file="/home/user1/bin/hosts.txt"
while IFS= read -r host
do
expect -f
spawn ssh remoteuser@$host
expect "assword:"
send "ourpasswordhere\r"
if [ ! -d "~/.ssh"]; then mkdir -p ~/.ssh fi
if [ ! -f "~/.ssh/authorized_keys."]; then touch ~/.ssh/authorized_keys. fi
chown -R remoteuser:remoteuser ~/.ssh
# store exit status of chown
status=$?
# Error checking subroutine to post failures on manager server
if [ $status -ne 0 ]; then echo "'$host' ownership could not be set to svcsis." >> results.txt; fi
chmod 600 ~/.ssh/authorized_keys
exit
./push_key.exp remoteuser@$host
./keycheck.sh $host >>response.txt
done