脚本/命令从主机名列表中获取 IP 并合并到一个文件中

Iva*_*don 7 command-line awk shell-script

这似乎超出了我目前的技能,因为我已经尝试了一段时间并且没有取得太大进展。

我被要求获取主机和 IP 列表以确保安全,以便对这些服务器进行扫描。hosts.linux服务器上有一个包含所有主机名的主机列表,只是没有 IP。我正在尝试提出一个脚本,该脚本将从该文件中获取这些名称,然后运行诸如host获取 IP的命令之类的命令。

例如,此命令有效:

host csx-svc-spls-06 | awk '{ print $3 }'
Run Code Online (Sandbox Code Playgroud)

它只返回该服务器的 IP。是否可以从文件中读取,让它运行命令,然后将服务器的名称和 IP 地址在一行中导出到一个新文件?

小智 7

我不确定在 dig 上使用 nslookup 的含义,但我认为这可能有效:

for i in `cat linux.hosts`; do nslookup $i | grep ^Name -A1| awk '{print $2}';echo;done > outputfile
Run Code Online (Sandbox Code Playgroud)


Wil*_*ard 6

dig有一个+short选项可以使它生成结果 IP 地址,而不生成其他任何内容。


这段代码:

for h in google.com yahoo.com notfound.nosuch; do
  printf '%s = ' "$h"
  printf '%s' "$(dig +short "$h")" | tr '\n' ,
  echo
done
Run Code Online (Sandbox Code Playgroud)

产生输出:

google.com = 108.177.112.102,108.177.112.139,108.177.112.101,108.177.112.138,108.177.112.100,108.177.112.113
yahoo.com = 98.138.252.38,98.139.180.180,206.190.39.42
notfound.nosuch = 
Run Code Online (Sandbox Code Playgroud)

相比之下,这段代码:

for h in google.com yahoo.com notfound.nosuch; do
  printf "$h = %s\\n" $(dig +short "$h")
done
Run Code Online (Sandbox Code Playgroud)

产生输出:

google.com = 108.177.112.138
google.com = 108.177.112.100
google.com = 108.177.112.101
google.com = 108.177.112.113
google.com = 108.177.112.139
google.com = 108.177.112.102
yahoo.com = 98.139.180.180
yahoo.com = 206.190.39.42
yahoo.com = 98.138.252.38
notfound.nosuch = 
Run Code Online (Sandbox Code Playgroud)

要从文件中读取主机名,请将for上述任一代码片段中的行替换为for h in $(cat hostlist.txt); do— 尽管您可能希望添加一些输入验证。由你决定。


随你挑。如果您想要其他格式,请发表评论。


注:如果所有你想要的是IP地址,你不关心其包括在输出的主机名,那么所有你需要的是:

dig +short $(cat hostlist.txt)
Run Code Online (Sandbox Code Playgroud)

但是请记住,此命令将忽略未出现在 DNS 中的任何主机名。