gpt4 book ai didi

linux - 测试本地网络上的事件 ssh key

转载 作者:太空宇宙 更新时间:2023-11-04 05:12:48 25 4
gpt4 key购买 nike

我目前正在尝试实现一个 bash 脚本,该脚本将验证服务器上的 SSH key 是否仍然链接到局域网上事件的已知主机。您可以在下面找到我的 bash 脚本的开头来实现此目的:

#!/bin/bash

# LAN SSH KEYS DISCOVERY SCRIPT
# TRYING TO FIND THOSE SSH KEYS NOW

cat /etc/passwd | grep /bin/bash > bash_users
cat bash_users | cut -d ":" -f 6 > cutted.bash_users_home_dir
for bash_users in $(cat cutted.bash_users_home_dir)
do
ls -al $bash_users/.ssh/*id_* >> ssh-keys.txt
done

# DISCOVERING THE KNOWN_HOSTS NOW

for known_hosts in $(cat cutted.bash_users_home_dir)
do
cat $bash_users/.ssh/known_hosts | awk '{print $1}' | sort -u >>
hosts_known.txt
sleep 2
done
hosts_known=$(wc -l hosts_known.txt)
echo "We have $hosts_known known hosts that could be still active via SSH
keys"

# TIME TO TEST WHICH SSH servers are still active with the SSH keys
# AND THIS IS WHERE I AM FROZEN...
# Would love to have bash script that could
# ssh -l $users_that_have_/bin/bash -i $ssh_keys $ssh_servers
# Would also be very nice if it could save active
# SSH servers with the valid keys in output.txt in the format
# username:local-IP:/path/to/SSH_key

如果上面的 bash 脚本能够更好地实现所描述的目标,请放心编辑/修改它。

任何帮助将不胜感激,

谢谢

最佳答案

以下内容很酷:

</etc/passwd \
grep /bin/bash |
cut -d: -f6 |
sudo xargs -i -- sh -c '
[ -e "$1" ] && cat "$1"
' -- {}/.ssh/known_hosts |
cut -d' ' -f1 |
tr ',' '\n' |
sed '
/^\[/{
s/\[\(.*\)\]:\(.*\)/\1 \2/;
t;
};
s/$/ 22/;
' |
sort -u |
xargs -l1 -- sh -c '
if echo "~" | nc -q1 -w3 "$1" "$2" | grep -q "^SSH"; then
echo "#### SUCCESS $1 $2";
else
echo "#### ERROR $1 $2";
fi
' --

所以:

  1. /etc/passwd开头
  2. 过滤所有您称呼的“bash_users”
  3. 仅过滤用户主目录cut -d: -f6
  4. 对于每个用户主目录 sudo xargs -i -- 运行
    1. 检查用户主目录中的文件.ss​​h/known_hosts是否存在
    2. 如果是,则打印
  5. 仅过滤主机名
  6. 多个主机签名可以共享相同的 key ,并用逗号分隔。将逗号替换为换行符
  7. 现在是 sed 脚本:
    1. 如果一行以 [ 开头,则表示其格式为 [host]:port,我想将其替换为 host port
    2. 如果该行不以 [ 开头,我会将 22 添加到该行末尾,因此它是 host 22
  8. 然后我排序-u
  9. 现在每一行:

    1. 我从 ssh 获取 ssh 版本 echo "~"| nc 主机名端口 返回类似“SSH-2.0-OpenSSH_6.0”+换行符+“协议(protocol)不匹配”的信息。
    2. 因此,如果 nc hostname port 返回的行以 SSH 开头,则意味着另一端正在运行 ssh
    3. 我为无响应的主机添加了超时,但我认为也可以使用 nc -w timeout 选项。也许还应该指定 nc -q 1
  10. 现在真正有趣的是,当您将 max-procs 选项添加到最后一个 xargs 行时,您可以同时检查所有主机。在我的主机上,我有 47 个唯一地址,xargs -P30 在大约 2 秒内检查它们全部。

  11. 但确实存在一些问题。该脚本需要 root 才能读取所有用户的known_hosts。但更糟糕的是,known_hosts 可能会被散列。最好首先了解网络上的主机列表,然后从中生成known_hosts。它看起来像 ssh-keyscan -f list_of_hosts > ~/.ssh/known_hosts 或类似的。一般来说,如果known_hosts中存在主机,则应使用ssh-keygen -F hostname,遗憾的是没有列出命令。 known_hosts 文件格式可以在 ssh documentation 中找到。 .

关于linux - 测试本地网络上的事件 ssh key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com