Làm cách nào tôi có thể phân giải tên máy chủ thành địa chỉ IP trong tập lệnh Bash?


416

Cách ngắn gọn nhất để phân giải tên máy chủ thành địa chỉ IP trong tập lệnh Bash là gì? Tôi đang sử dụng Arch Linux .


21
Thật xấu hổ vì getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>câu trả lời ở đâu đó ở dưới đó gần phía dưới. Đó là cách đơn giản nhất, không yêu cầu các gói bổ sung và cũng dễ dàng phân tích cú pháp từ tập lệnh Bash.
0xC0000022L

1
@ 0xC0000022L: Các xấu hổ mới là câu trả lời gợi ý rằng getent hosts somehost, khi chạy này trong khi trênsomehost sẽ tạo ra một địa chỉ IPv6 , đó là khác biệt so với cách các công cụ khác nhất ( ping, sshít nhất) giải quyết tên, và phá vỡ một số thứ. Sử dụng ahoststhay vì hosts.
j_random_hacker

@j_random_hacker: ai ngăn bạn yêu cầu địa chỉ cụ thể của IPv4 ( ahostsv4) hoặc IPv6 ( ahostsv6)? Cá nhân tôi thấy không có gì sai với yêu cầu không đặc biệt khi trả lại IPv6. Mã của bạn nên được chuẩn bị. IPv6 đã tồn tại hơn 20 năm nay.
0xC0000022L

@ 0xC0000022L: Không ai "ngăn tôi" làm điều đó, nhưng câu trả lời đặc biệt gợi ý hosts, và cho đến nay, 4 người đã nêu lên nhận xét của vinc17 thể hiện nỗi đau do "đột nhiên IPv6". Việc chuẩn bị cho IPv6 không phải lúc nào cũng là vấn đề: nhiều chương trình cần một cách để xác định xem hai tên / địa chỉ có liên quan đến cùng một máy chủ hay không. Họ có thể sử dụng kết hợp chuỗi đơn giản hoặc họ phải biết nhiều về mạng để tìm câu trả lời "đúng". Cái sau là một bãi mìn, rất nhiều chương trình và hệ thống của bên thứ 3 - mà tôi không kiểm soát được - sử dụng cái trước.
j_random_hacker

Câu trả lời:


533

Bạn có thể sử dụng getent, đi kèm glibc(vì vậy bạn gần như chắc chắn có nó trên Linux). Điều này giải quyết bằng cách sử dụng gethostbyaddr / gethostbyname2 và do đó cũng sẽ kiểm tra /etc/hosts/ NIS / etc:

getent hosts unix.stackexchange.com | awk '{ print $1 }'

Hoặc, như Heinzi đã nói bên dưới, bạn có thể sử dụng digvới +shortđối số (truy vấn trực tiếp máy chủ DNS, không nhìn vào /etc/hosts/ NSS / etc):

dig +short unix.stackexchange.com

Nếu dig +shortkhông có sẵn, bất kỳ một trong những điều sau đây sẽ hoạt động. Tất cả các DNS truy vấn trực tiếp và bỏ qua các phương tiện giải quyết khác:

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

Nếu bạn muốn chỉ in một IP, sau đó thêm exitlệnh vào awkquy trình làm việc của.

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'

2
Theo mặc định, sử dụng dig chỉ hoạt động với ipv4, trong đó máy chủ cung cấp cả câu trả lời ipv4 và ipv6. Điều này có thể là bất ngờ. Bạn có thể thử host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com.
jfg956

6
DIG không hoạt động, nếu là CNAME, nó sẽ không trả về IP.
sorin

4
Đôi khi, hostcó thể được hết thời gian và trả lại không có gì. Đối với một số tên miền, dig +shortcó thể trả về bí danh tên miền trong dòng đầu tiên. Vì vậy, để đảm bảo đầu ra là một địa chỉ IPv4, hãy sử dụng dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao

9
Việc sử dụng getent hosts <host>là không chính xác, ví dụ như nó có thể cung cấp địa chỉ IPv6 trong khi IPv6 không hoạt động. Giải pháp chính xác là sử dụng getent ahosts <host>để thử cả IPv6 và IPv4 nếu cần.
vinc17

5
Đáng nói hơn: máy chủ, máy đào và nslookup dường như nói chuyện trực tiếp với các máy chủ được liệt kê trong độ phân giải, trong khi "máy chủ lưu trữ" tôn trọng cả tệp máy chủ cục bộ và bộ đệm ẩn cấp thư viện (như nscd) nếu được bật.
Saustrup

141

Với hosttừ dnsutils gói:

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

( Tên gói được sửa theo các nhận xét. Như một lưu ý, các bản phân phối khác có hosttrong các gói khác nhau: Debian / Ubuntu bind9-host , openSUSE bind-utils , Frrifware bind .)


4
Ý bạn là dnsutils ? Dù sao, hostlàm việc tốt, cảm ơn
Eugene Yarmash

Bạn có thể đúng. Tôi không có Arch ở đây để kiểm tra. (Mục đích để nối thêm một bình luận sau đó nhắc đến điều này, nhưng câu trả lời đã được bỏ phiếu tán vì vậy tôi cho là tôi đóng đinh nó ...)
manatwork

1
Xem mục giải quyết bên dưới nếu bạn cần giải quyết vấn đề không có trong DNS (ví dụ: etc / hosts)
Gavin Brock

2
Xin lưu ý rằng hostđôi khi trả về đầu ra nhiều dòng (trong trường hợp chuyển hướng), bạn sẽ muốn host unix.stackexchange.com | tail -n1nếu bạn chỉ muốn dòng có địa chỉ IP.
Edward Coffey

3
Câu trả lời này xứng đáng với một downvote nghiêm trọng. hostlà một công cụ DNS (tương tự nslookup) vì vậy nó chỉ tìm kiếm các máy chủ trong DNS, không phải trong ví dụ /etc/hosts. Vì vậy, nó KHÔNG phải là một câu trả lời cho câu hỏi của OP.
peterh

54

Tôi có một công cụ trên máy của tôi dường như thực hiện công việc. Trang người đàn ông cho thấy nó dường như đi kèm với mysql ... Đây là cách bạn có thể sử dụng nó:

resolveip -s unix.stackexchange.com
64.34.119.12

Giá trị trả về của công cụ này khác 0 nếu tên máy chủ không thể được giải quyết:

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

CẬP NHẬT Trên fedora, nó đi kèm với máy chủ mysql:

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

Tôi đoán nó sẽ tạo ra một sự phụ thuộc kỳ lạ cho kịch bản của bạn ...


6
Đây dường như là giải pháp duy nhất ở đây sử dụng trình phân giải xây dựng của HĐH - vì vậy hoạt động cho / etc / hosts cũng như DNS.
Gavin Brock

8
getent, như chi tiết trong câu trả lời khác, cũng xem / etc / hosts và đi kèm với glibc, do đó không phụ thuộc vào hệ thống Linux.
Asfand Qazi

44

Lệnh sau sử dụng digcho phép bạn đọc kết quả trực tiếp mà không cần bất kỳ sed / awk / etc. ma thuật:

$ dig +short unix.stackexchange.com
64.34.119.12

digcũng được bao gồm trong dnsutilsgói.


Lưu ý : digcó giá trị trả về là 0, ngay cả khi tên không thể được giải quyết. Do đó, bạn cần kiểm tra xem đầu ra có trống không thay vì kiểm tra giá trị trả về:

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
else
    echo Could not resolve hostname.
fi

Lưu ý 2 : Nếu tên máy chủ có nhiều địa chỉ IP ( debian.orgví dụ: thử ), tất cả chúng sẽ được trả về. "Vấn đề" này ảnh hưởng đến tất cả các công cụ được đề cập trong câu hỏi này cho đến nay:


2
Lưu ý rằng nếu một tên miền có mục CNAME, tên miền của nó có thể được in ở dòng đầu tiên thay vì địa chỉ IP.
pcworld

40
getent hosts unix.stackexchange.com | cut -d' ' -f1

4
Cũng xem xét ahosts, ahostsv4, ahostsv6với getent.
0xC0000022L

cutsẽ không cho getent's, mà sử dụng \tđể tách các cột. Đây là trường hợp trên Solaris.
ceving 18/03/2016

1
@ceving: Trên Solaris bạn có thể phải chạy cutmà không có -d(mặc định \tlà dấu phân cách). Trên Linux, đó là không gian, do đó, dòng trên hoạt động.
s Harborky

27

Các giải pháp được đưa ra cho đến nay hầu hết đều hoạt động trong trường hợp đơn giản hơn: tên máy chủ trực tiếp phân giải thành một địa chỉ IPv4 duy nhất. Đây có thể là trường hợp duy nhất mà bạn cần giải quyết tên máy chủ, nhưng nếu không, dưới đây là một cuộc thảo luận về một số trường hợp mà bạn có thể cần phải xử lý.

Chris Down và Heinzi đã thảo luận ngắn gọn về trường hợp tên máy chủ giải quyết thành nhiều hơn một địa chỉ IP. Trong trường hợp này (và những người khác bên dưới), tập lệnh cơ bản theo giả định rằng tên máy chủ trực tiếp phân giải thành một địa chỉ IP duy nhất có thể bị hỏng. Dưới đây, một ví dụ với tên máy chủ phân giải thành nhiều hơn một địa chỉ IP:

$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104

Nhưng là www.l.google.comgì? Đây là nơi trường hợp bí danh cần được giới thiệu. Hãy xem ví dụ dưới đây:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104

Vì vậy, www.google.comkhông trực tiếp giải quyết các địa chỉ IP, mà là một bí danh mà chính nó phân giải thành nhiều địa chỉ IP. Để biết thêm thông tin về bí danh, kiểm tra ở đây . Tất nhiên, trường hợp bí danh có một địa chỉ IP duy nhất là có thể, như được hiển thị bên dưới:

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190

Nhưng bí danh có thể bị xiềng xích? Câu trả lời là có:

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105

Tôi không tìm thấy bất kỳ ví dụ nào mà tên máy chủ phân giải thành bí danh không phân giải địa chỉ IP, nhưng tôi nghĩ trường hợp này có thể xảy ra.

Hơn nhiều địa chỉ IP và bí danh, có một số trường hợp đặc biệt khác ... còn IPv6 thì sao? Bạn có thể thử:

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

Trong đó tên máy chủ ipv6.google.comlà tên máy chủ chỉ IPv6. Những gì về tên máy chủ ngăn xếp kép:

$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

Một lần nữa về IPv6, nếu máy chủ của bạn chỉ là IPv4, bạn vẫn có thể giải quyết các địa chỉ IPv6 (chỉ được thử nghiệm trên IPv4 WinXP và với ipv6.google.com, bạn có thể dùng thử trên Linux). Trong trường hợp này, độ phân giải thành công, nhưng ping không thành công với thông báo lỗi máy chủ không xác định . Đây có thể là một trường hợp mà kịch bản của bạn thất bại.

Tôi hy vọng những nhận xét đó là hữu ích.


2
Thật là một bổ sung tuyệt vời cho câu trả lời được chấp nhận, cho thấy tất cả các trường hợp cạnh mà người ta có thể muốn giải quyết trong kịch bản. Phiên bản của tôi hostthậm chí không ghi "có địa chỉ" cho các hộp của tôi.
Mihai Danila


18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

hoạt động mà không phụ thuộc vào các hệ thống khác (và cho các máy chủ được chỉ định trong / etc / hosts)


2
Việc sử dụng ping là những gì tôi cần vì tôi cần giá trị từ tệp máy chủ nhưng mô hình sed phân tích cú pháp chính xác nhưng điều này đã hoạt động ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s / ^ [^ (] * [(] //" | sed -e "s /[)[.*$//"
ManiacZX

1
Để giải quyết một cái gì đó trên mạng gia đình của tôi như myhostname.local điều này hoạt động vì vậy với tôi đây là câu trả lời tốt nhất.
Matt Friedman

1
Tôi cũng có thể đề nghị điều này:ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Matt Friedman

getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>làm việc cho tờ khai bên trong /etc/hosts, quá ... và đó là các công cụ go-to-cho tất cả các loại cơ sở dữ liệu hệ thống (passwd, nhóm, bí danh, dịch vụ).
0xC0000022L

17

Đơn giản nhưng hữu ích:

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

Tất cả các lệnh sẽ giải quyết một địa chỉ IP nếu máy chủ vẫn tồn tại. Nếu máy chủ trỏ đến CNAME, nó cũng sẽ nhận được IP trong trường hợp đó.

Lệnh đầu tiên trả về địa chỉ IPv4 đã giải quyết

Lệnh thứ hai trả về địa chỉ IPv6 đã giải quyết

Lệnh thứ ba sẽ trả về địa chỉ ưa thích của chủ sở hữu địa chỉ IPv4 hoặc IPv6.


Cho đến nay, đơn giản nhất. Và nó có sẵn theo mặc định. Không như thế hostđòi hỏi phải cài đặtbindutils
michaelbn

7

Dưới đây là một biến thể nhỏ của pingcách tiếp cận đưa "máy chủ không xác định" vào tài khoản (bằng cách chuyển qua stderr) và sử dụng trđể tránh sử dụng biểu thức chính quy sed:

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

Trong trường hợp điều quan trọng là phải nắm bắt giá trị thoát, thì cách sau sẽ hoạt động (mặc dù kém thanh lịch):

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

Tôi thích giải pháp này, bởi vì nó hoạt động mà không cần bất kỳ công cụ bổ sung.
Radon8472

7

Để hoàn thành câu trả lời của Chris Down và giải quyết các bình luận của jfgagne về các bí danh (có thể bị xiềng xích), đây là một giải pháp:

  • tính đến nhiều IP
  • tính đến một hoặc nhiều bí danh (CNAME)
  • không truy vấn /etc/hoststệp (trong trường hợp của tôi, tôi không muốn nó); để truy vấn nó, giải pháp python của dbernt là hoàn hảo)
  • không sử dụng awk / sed

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

Luôn trả về địa chỉ IP đầu tiên hoặc tring trống nếu không được giải quyết. với phiên bản đào:

    $ dig -v
    DiG 9.8.1-P1

1
Cảm ơn, các câu trả lời khác giả sử "đào + ngắn" luôn trả về một địa chỉ IP duy nhất. Họ không hạch toán cho CNAME.
jamshid

5
 php -r "echo gethostbyname('unix.stackexchange.com');"

điều này hoạt động, nhưng nó yêu cầu php được cài đặt trên thiết bị đầu cuối của bạn
Radon8472

1
có thể hữu ích trên một container docker php điển hình nơi "máy chủ", "đào", v.v. không có sẵn
Fabian Schmengler

5

Tôi muốn thêm điều này như một bình luận cho Andrew McGregor Re: ping. Tuy nhiên nó sẽ không cho phép tôi, vì vậy tôi cần thêm câu này như một câu trả lời khác. (Nếu ai đó có thể chuyển nó thành một nhận xét, vui lòng.)

Đây là một biến thể khác, chỉ sử dụng ping và grep:

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -Echo biểu thức chính quy mở rộng và grep -ochỉ trả về phần khớp. regrec chính nó tìm kiếm một hoặc nhiều chữ số ( [0-9]+) và tùy ý một dấu chấm ( \.?) bốn lần ( {4})


4

Bạn có thể sử dụng host:

hostname=example.org

# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;
fi

4

đây là một công thức Bash tôi đã nấu chín bằng cách sử dụng các câu trả lời của dân gian khác - lần đầu tiên thử /etc/hosts, sau đó quay lại với nslookup:

resolveip(){
    local host="$1"
    if [ -z "$host" ]
    then
        return 1
    else
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
        then
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
            then
                echo "unable to resolve '$host'" >&2 
                return 1
            else
                echo "$ip"
                return 0
            fi
        else
            echo "$ip"
            return 0
        fi
    fi
}

Để rõ ràng, getent hostskhông chỉ là một tra cứu trong / etc / hosts - đó là một cuộc gọi giải quyết DNS đầy đủ đến gethostbyaddr (3)rất khó có thể thất bại trong trường hợp digsẽ thành công. Xem trang người đàn ông để nhận .
Stuart P. Bentley

@Stuart là đúng - tôi đã học được rất nhiều từ khi viết nó và áp dụng một lệnh mạnh mẽ. getentvẫn là sở thích của tôi, mặc dù tôi cũng thíchdig +short
RubyTuesdayDONO

4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

là giải pháp tôi tìm thấy mà không cần máy chủ DNS


3

Có thể không phải là ngắn gọn nhất, nhưng nó có vẻ mạnh mẽ và hiệu quả:

# $(get_host_dns_short "google.com")
#
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
{
    (
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1
}

Điều này sẽ tạo ra một IP IPv4 duy nhất, cũng như trả về 1trong trường hợp thất bại, trong khi che dấu đầu ra stderr.

Bạn có thể sử dụng nó như thế này:

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
else
    echo "Failed to resolve Google's IP."
fi

IP của Google là 216.58.192.46.

Nếu bạn muốn một địa chỉ IPv6 thay thế, chỉ cần thay thế -4bằng -6.


3

dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'


1
Một số bối cảnh theo cách mà câu trả lời cải thiện so với những câu hỏi đã có sẽ là tuyệt vời. Ngoài ra, vui lòng thụt lề các lệnh theo 4 khoảng trắng (xem cú pháp đánh dấu).
maxschlepzig 17/03/2016

2

1 dòng giải quyết một danh sách tên máy chủ

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done

2

Tôi đang làm điều này mọi lúc trên máy Mac không có getent. pingcó vẻ như một hack. Tôi cũng muốn đưa /etc/hostsvào tài khoản.

Vì vậy, tôi đã viết một trình bao bọc ngu ngốc dns.lookupcho bạn đã cài đặt Node.js để cung cấp CLI:

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89

60% cơ hội phá vỡ trước khi bạn nhận được bất cứ nơi nào gần một giải quyết.
dotbit

@dotbit bạn có thể giải thích? Tôi đã sử dụng hàng tuần này kể từ '17 và không bao giờ có bất kỳ vấn đề.
Thomas Jensen

@Jensen nhưng bạn là người duy nhất, như mọi khi. Phần còn lại của chúng ta thường chạy vào FAIL loại này hay loại khác, và luôn luôn.
dotbit

"như mọi khi" Ý của bạn là gì? "Phần còn lại của chúng ta" Ai vậy? "Chạy vào FAIL" Bạn đang thấy vấn đề cụ thể nào? Tôi tò mò.
Thomas Jensen

2

đào quá chậm, nslookup nhanh hơn nhiều

nslookup google.com | grep -Po 'Address:\s*[0-9.]+' | tail -1 | sed -e 's/Address:\s*//g'

2

Tôi không biết cách dễ nhất cho bash-script nhưng nếu bạn muốn giải quyết tên máy chủ và xem máy chủ có hoạt động không, hãy sử dụng ping!

ping -a hostname -c 1

Sẽ pinglưu trữ một lần và giải quyết tên máy chủ thành địa chỉ IP.

$ ping -a www.google.com -c 1
PING www.google.com (216.58.211.132) 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms

sử dụng ping là tốt, bởi vì mọi người đều có nó, nhưng bạn cần lọc IP-Part từ các đầu ra, nếu bạn muốn sử dụng nó trong một tập lệnh.
Radon8472

1

Có, đã có nhiều câu trả lời, nhưng thiếu một giải pháp sử dụng perl:

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

Trong một tập lệnh bash, nó có thể được sử dụng như thế này:

#!/bin/bash
ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

Các mô-đun được sử dụng ở đây là các mô-đun cốt lõi, do đó nên có sẵn ở mọi nơi mà không cần cài đặt với CPAN.


perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null sạch hơn nhiều nhưng không ai ngoài hai chúng tôi đang sử dụng pörl, tất cả những người khác sử dụng Pascal Script.
dotbit

Trên thực tế tôi thích xem các thông báo lỗi nếu có gì sai. Can't call method "addr" on an undefined valuekhông chính xác là thông báo lỗi tốt nhất, nhưng có thể đưa ra gợi ý về vấn đề.
Slaven Rezic

1
#!/bin/bash

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "

1
Phiên bản ruby ​​in các trích dẫn xung quanh địa chỉ IP --- có lẽ printnên được sử dụng thay vì p.
Slaven Rezic

thx, @Slaven Rezic và thoải mái nâng cấp. sau đó một lần nữa, ở dưới cùng, tập lệnh có thể được nhìn thấy rõ hơn thực sự ... ;-)
dotbit

-1
host -t a cisco.com

lệnh này sẽ hiển thị địa chỉ IP (sẽ reslove tên miền thành IP)


-1

Bên cạnh giải pháp trên, bạn có thể dịch nhiều tên máy chủ sang ip thông qua tập lệnh bên dưới, phụ thuộc duy nhất là lệnh "ping" trong lõi Unix:

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log

ABC.DEF.GHI.XY1

ABC.DEF.GHI.XY2

ABC.DEF.GHI.XY3

ABC.DEF.GHI.XY4

ABC.DEF.GHI.XY5

ABC.DEF.GHI.XY6

ABC.DEF.GHI.XY7

ABC.DEF.GHI.XY8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.