Wiersz polecenia Nslookup z rekordowym adresem IP jako jedynym wyjściem

9

Znalazłem następujące polecenie, aby uzyskać bieżący publiczny adres IP, który działa dobrze z wiersza polecenia:

nslookup myip.opendns.com resolver1.opendns.com

Chcę być w stanie uruchomić polecenie, które po prostu drukuje resulant IP. (W tej chwili pokazuje określony serwer DNS i jego adres IP oraz wszystkie inne informacje IE:

Server:  resolver1.opendns.com
Address:  208.67.222.222

Non-authoritative answer:
Name:    myip.opendns.com
Address:  123.123.123.123

Chcę, aby po prostu wyprowadzał: 123.123.123.123

Nie jestem pewien, czy jest to flaga wiersza polecenia, aby uzyskać to, czego chcę, czy też mogę użyć sztuczek z wiersza polecenia, aby uzyskać tylko pożądane dane wyjściowe (ostatecznie chcę przekierować dane wyjściowe do pliku „> filename.txt”

BondUniverse
źródło
Jak zamierzasz radzić sobie z nazwami, które zwracają więcej niż jeden adres IP? Z jakiego systemu operacyjnego korzystasz?
Ƭᴇcʜιᴇ007

Odpowiedzi:

6

Nslookup z rekordowym adresem IP jako jedynym wyjściem

Zakładając, że używasz systemu Windows, można to zrobić za pomocą prostego polecenia w jednym wierszu.

Z wiersza poleceń:

for /f "skip=4 usebackq tokens=2" %a in (`nslookup myip.opendns.com resolver1.opendns.com`) do echo %a > ip.txt

Z pliku wsadowego:

for /f "skip=4 usebackq tokens=2" %%a in (`nslookup myip.opendns.com resolver1.opendns.com`) do echo %%a > ip.txt

Uwagi:

  • Publiczny adres IP jest przechowywany w pliku ( ip.txt).
  • Powyższe nie wymaga okna niestandardowe polecenia jak PowerShell, .Netlub awk.

Dalsza lektura

DavidPostill
źródło
1
„Zakładając, że używasz systemu Windows” ... Nie jestem pewien, czy to powinno być tutaj założenie.
RCross,
14

nslookuptak naprawdę nigdy nie był przeznaczony do użytku skryptowego. Naprawdę chcesz użyć digzamiast tego, który z tą +shortopcją tworzy dane wyjściowe do odczytu maszynowego zgodnie z parametrami zapytania.

dig +short myip.opendns.com @resolver1.opendns.com
brm
źródło
1
Witamy w Super User! Proszę wyjaśnić, dlaczego jest to poprawna odpowiedź; nie wszyscy wiemy, jak korzystać dig.
Glorfindel
Pomoże to innym użytkownikom z tym samym problemem
yass
1
To rozwiązanie jest lepsze niż inne używające awki / lub sedponieważ orurowanie jest często problematyczne, a w tym przypadku niepotrzebnie skomplikowane.
StockB
1
więc powinienem użyć ostatniej linii wyjściowej? W przypadku CNAME istnieją dwie lub więcej linii wyjściowych. dig +short www.getready.cz | tail -1
Jaro,
Jest to zdecydowanie najlepsza odpowiedź, ponieważ jest to rozwiązanie wieloplatformowe (ok użytkownicy Windows będą musieli pobrać dig), który pozwala uniknąć bałaganu związanego z manipulowaniem ciągami specyficznymi dla systemu operacyjnego.
RCross,
8

Jest to dobry przypadek użycia dla awk.

nslookup myip.opendns.com resolver1.opendns.com | awk -F': ' 'NR==6 { print $2 } '

Tutaj przesyłamy strumieniowo do awk, rozdzielając znakiem „:”, a następnie wyprowadzając tylko drugie rozdzielone pole linii 6.

JNevill
źródło
2
OP nie określił, ale założę się, że jest w systemie Windows i nie ma go awkw systemie Windows.
Ƭᴇcʜιᴇ007
2
@ Techie007 Ale OP nie określił też, że jest w systemie Windows, więc równie dobrze możemy podać pełne informacje. Powyższa odpowiedź działa na wszystkie Nixy, co ładnie uzupełnia inne odpowiedzi, w tym twoją.
MariusMatutiae
Tak, na serwerach Windows.
BondUniverse
2
To nie działa w niektórych przypadkach (zakodowany numer linii może być nieprawidłowy). Używam tego zamiast:nslookup-ip() { nslookup "$@" | tail -n +3 | sed -n 's/Address:\s*//p' }
zeroimpl
4

Jeśli korzystasz z systemu Windows i masz zainstalowany program PowerShell (w wersji 1 lub nowszej) (i wersję .Net), możesz użyć (długiej) jednej linii:

[System.Net.Dns]::GetHostAddresses("www.google.com")[0] | Select IPAddressToString -ExpandProperty IPAddressToString | Out-File c:\folder\filename.txt

Spowoduje to wyszukanie www.google.com i umieszczenie pierwszego zwróconego adresu IPv4 w pliku.

Jeśli używasz programu PowerShell v3 + w systemie Windows 8+ (lub Server 2012+), możesz użyć polecenia Resolve-DnsNamecmdlet zamiast wywołania .Net GetHostAddress. to znaczy:

(Resolve-DnsName www.google.com)[0] | Select IPAddressToString -ExpandProperty IPAddressToString | Out-File c:\folder\filename.txt

Po prostu zmień www.google.com na preferowaną nazwę domeny. Lub umieść go w skrypcie PowerShell i skonfiguruj tak, aby akceptował argument (nazwy domeny, którą chcesz wyszukać).

Więcej informacji na ten temat: jak przekazać argument do skryptu PowerShell?

Ƭᴇcʜιᴇ007
źródło
1

Działa dobrze na moim komputerze z systemem Linux. Nigdy nie próbowałem tego na innych systemach, ale Google ma wiele artykułów na temat instalacji, digna przykład w systemie Windows

Jedyne, na co należy zwrócić uwagę, należy wyraźnie dodać domenę wyszukiwania lokalnych nazw hostów. Więc jeśli masz myhosthosta w sieci lokalnej z mynetworkumieszczoną domeną wyszukiwania

dig +short myhost.mynetwork

w wierszu poleceń.

Przykłady:

sergeyi@sergeyi:~$ dig +short google.ru
173.194.222.94

sergeyi@sergeyi:~$ dig A +short google.ru
173.194.222.94

sergeyi@sergeyi:~$ dig AAAA +short google.ru
2a00:1450:4010:c0b::5e
Siergiej
źródło
0

Jeśli Twoim celem jest odzyskanie twojego zewnętrznego adresu IP za pomocą skryptu , możliwe byłoby użycie bardzo prostej funkcji PowerShell:

function Get-ExternalIP {
(Invoke-WebRequest ifconfig.me/ip).Content
}

Uruchomienie tej funkcji zwróci twój zewnętrzny adres IP i żadne inne bezużyteczne informacje.

Źródło i przykłady: http://jfrmilner.wordpress.com/2012/12/22/powershell-quick-tip-03-whats-my-external-ip-address-windows-command-line/

Alternatywnie, jeśli chcesz uzyskać rozdzielczość IP dla innych hostów , powinieneś rzucić okiem na cmdlet Resolve-DnsName . Niestety, aby korzystać z tego polecenia cmdlet, na komputerze musi być zainstalowany system Windows 8.1 lub Windows Server 2012 R2. Oto przykład, który właśnie wykonałem:

wprowadź opis zdjęcia tutaj

Mam nadzieję że to pomoże !

Ob1lan
źródło
Potrzebuję polecenia, aby niezawodnie działać na dowolnym serwerze z systemem Windows 2003+. Zgadzam się jednak, że gdyby Power Shell był opłacalny, wolałbym twoje rozwiązanie.
BondUniverse,
0

Prosty.

W nslookup użyj:

Ustaw typ = A

Następnie wyszukaj. Polecenie set wyświetli tylko dane wyjściowe dla rekordów A. Możesz użyć tego dla MX, CNAME, AAA itp.

Pełnomocnik
źródło
-1

Nie jest to idealne, ale czasami używam tej metody:

ping -c 1 myip.opendns.com | grep -ohE "\(([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\)" | head -1 | sed "s/[()]//g"

AlonL
źródło
Dlaczego dokładnie to rozwiązanie nie jest idealne? Znam odpowiedź, ale zwykle głosuję nad niejasnymi odpowiedziami przed głosowaniem nad nimi.
Ramhound
Nie wszyscy mają grepi zainstalowali na swoich komputerach z systemem Windows.
DavidPostill
a składnia ping jest nieprawidłowa.
Francisco Tapia
Co jest złego w składni? Chciałem tylko podać inną metodę, której używam, i pomyślałem, że ktoś też może uznać ją za przydatną. Mi to pasuje. Nie musisz go używać.
AlonL
-1

Korzystając z PowerShell, możesz uruchomić poniżej:

(((nslookup myip.opendns.com resolver1.opendns.com 2>null| select-string -pattern "Address:") -split ":")[3]).Trim()
Ajaz Ahmed
źródło