Come posso elencare gli indirizzi IP di tutte le stampanti AirPrint su una rete?

4

Sto provando a creare un elenco di tutte le stampanti AirPrint sulla rete in una scuola. Ne abbiamo molti a causa di tutte le stampanti per classe e per ufficio, ma non sono stati creati con nomi significativi. Ho provato a leggere la tabella di allocazione DHCP nel router, ma molte stampanti non riportano un nome host. Non riesco a controllare le stampanti di persona a causa dell'interruzione delle lezioni dall'entrare in ogni stanza e giocare con le stampanti 1-3 presenti.

Il comando dns-sd come in Come trova l'indirizzo IP del mio altro Mac? fornisce una colonna denominata Nome istanza , anziché il nome host. L'utilizzo dell'opzione dns-sd -G sui nomi di istanza non ha fornito alcun record di questo tipo.

dns-sd -Z è più vicino, poiché dà ai nomi degli host la possibilità di cercare con l'opzione G , ma non fornisce un elenco completo. Ci sono molte altre stampanti nella finestra di dialogo Aggiungi stampante su un Mac di quanto non ci siano nell'output di dns-sd -Z .

Qualcuno ha qualche codice o script per trovare tutti gli indirizzi IP delle cose pubblicitarie di Bonjour?

    
posta user2127627 03.03.2015 - 21:35
fonte

4 risposte

15

Non ho una stampante AirPrint sulla mia rete. E non ho mai giocato con nessuno dei due ...

Non riesco a testare con un vero dispositivo AirPrint nella mia prossimità in questo momento.

Ma ecco come posso elencare tutte le stampanti abilitate per IPP (in questo caso sono tutte collegate tramite CUPS):

Per prima cosa, cerca i servizi rilevabili DNS-SD (tutti i tipi):

kp@zdv-wireless-43-219:> dns-sd  -B  _services._dns-sd._udp  local.

  Browsing for _services._dns-sd._udp.local.
  DATE: ---Fri 20 May 2016---
  23:54:37.797  ...STARTING...
  Timestamp     A/R Flags  if Domain  Service Type         Instance Name
  23:54:37.798  Add     3   4 .       _tcp.local.          _ssh
  23:54:37.798  Add     3   4 .       _tcp.local.          _sftp-ssh
  23:54:37.798  Add     3   4 .       _tcp.local.          _airplay
  23:54:37.798  Add     3   4 .       _tcp.local.          _raop
  23:54:37.798  Add     3   4 .       _tcp.local.          _googlecast
  23:54:37.798  Add     3   4 .       _tcp.local.          _nomachine
  23:54:37.798  Add     3   4 local.  _apple-mobdev2._tcp. _sub
  23:54:37.798  Add     3   4 .       _tcp.local.          _apple-mobdev2
  23:54:37.798  Add     3   4 .       _tcp.local.          _ipps
  23:54:37.798  Add     3   4 .       _tcp.local.          _ipp
  23:54:37.798  Add     3   4 .       _tcp.local.          _workstation
  23:54:37.798  Add     3   4 .       _tcp.local.          _http
  23:54:37.798  Add     3   4 .       _tcp.local.          _amzn-wplay
  23:54:37.798  Add     3   4 .       _tcp.local.          _rfb
  23:54:37.798  Add     3   4 .       _tcp.local.          _afpovertcp
  23:54:37.798  Add     3   4 .       _tcp.local.          _smb
  23:54:37.798  Add     3   4 .       _udp.local.          _net-assistant
  23:54:37.798  Add     2   4 .       _tcp.local.          _eppc
  ^C

Quindi sì, c'è davvero un servizio di stampa IPP (ma nessuno di AirPrint, che sarebbe contrassegnato da risulterà contrassegnato come Tipo di servizio di _airprint._tcp nell'elenco).

Secondo, cerca tutti i servizi presenti di tipo "IPP":

kp@zdv-wireless-43-219:> dns-sd  -B  _ipp._tcp  local.

  Browsing for _ipp._tcp.local.
  DATE: ---Fri 20 May 2016---
  23:54:47.782  ...STARTING...
  Timestamp     A/R  Flags  if Domain  Service Type   Instance Name
  23:54:47.783  Add      3   4 local.  _ipp._tcp.     Officejet6500donna @ mbp
  23:54:47.783  Add      3   4 local.  _ipp._tcp.     raw2dir @ mbp
  23:54:47.783  Add      2   4 local.  _ipp._tcp.     Officejet 6600 @ mbp
  ^C

Ok, uno dei nomi di istanza è "Officejet 6600 @ mbp" .

Terzo, cerca informazioni specifiche sulla stampante denominata "Officejet 6600 @ mbp":

kp@zdv-wireless-43-219:> dns-sd  -L  "Officejet 6600 @ mbp"  _ipp._tcp  local.

  Lookup Officejet 6600 @ mbp._ipp._tcp.local.
  DATE: ---Fri 20 May 2016---
  23:54:55.252  ...STARTING...
  23:54:55.253  Officejet266002@2mbp._ipp._tcp.local. can be reached at mbp2-2.local.:631 (interface 4)
   txtvers=1 qtotal=1 rp=printers/Officejet_6600 ty=Unknown \
    adminurl=https://mbp2-2.local.:631/printers/Officejet_6600 \
     note=Büro\ im\ Keller priority=0 product=\(Officejet\ 6600\ e-All-in-One\) \
      pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/pwg-raster \
       UUID=e7d11337-a440-3f2d-7168-b53de4325791 TLS=1.2 Color=T Scan=T \
        printer-state=3 printer-type=0x480900E
  ^C

La metà delle informazioni che stai cercando (nome host della stampante) è coperta dalla frase "Officejet \ 0326600 \ 032 @ \ 032mbp._ipp._tcp.local. può essere raggiunta su mbp2-2.local .: 631"

Questo fornisce l'attuale (Bonjour-) nome host del nodo che offre il servizio di stampa cercato.

In quarto luogo, cerca gli indirizzi IPv4 e IPv6 per un determinato nome host:

kp@zdv-wireless-43-219:> dns-sd -Gv4v6 mbp2-2.local

  DATE: ---Sat 21 May 2016---
  0:12:41.025  ...STARTING...
  Timestamp     A/R Flags if Hostname    Address                                      TTL
  0:12:41.025  Add  3  4 mbp2-2.local.   FE80:0000:0000:0000:AEBC:32FF:FEAE:CAEB%en0  120
  0:12:41.025  Add  3  4 mbp2-2.local.   FD00:0000:0000:0000:AEBC:32FF:FEAE:CAEB%  120
  0:12:41.025  Add  2  4 mbp2-2.local.   192.168.177.20                               120
  ^C

Sommario

Supponendo che il mio comando primo abbia restituito un po 'di _airprint di servizio disponibile nella mia rete, allora suppongo che una delle righe restituite dovrebbe essere: / strike>

00:00:00.000  Add     3   4 .       _tcp.local.          _airprint

Pertanto, il mio comando secondo dovrebbe essere:

kp@zdv-wireless-43-219:> dns-sd  -B  _airprint._tcp  local.

Suppongo che questo potrebbe restituire qualcosa di simile

200:00:00.000  Add    3   4 local.  _airprint._tcp.  Some AirPrinter @ somehost

Quindi il mio comando terzo dovrebbe contenere:

kp@zdv-wireless-43-219:> dns-sd  -L  "Some AirPrinter @ somehost"  local.

Che restituirebbe una linea che ti dice "... può essere raggiunta da qualche parte.local.:1234 ". Da cui derivare il comando quarto :

kp@zdv-wireless-43-219:> dns-sd  -Gv4v6  somewhere.local.  

Avvertimenti: L'ultima parte, relativa al rilevamento dei servizi AirPrint potrebbe essere errata. Potrebbe essere il caso che i servizi AirPrint si annunciano proprio come fanno i servizi IPP standard. Devi scoprire te stesso. Se lo fai, ti preghiamo di segnalarlo.

Aggiornamento

Ho cercato un po 'su " _airprint._tcp ".

Non ho trovato una singola istanza di qualcuno che ha segnalato in alcuni forum il loro output da dns-sd -B che elenca questa particolare stringa.

Tuttavia, c'erano molti + lotti di _airplay._tcp e _ipp._tcp risultati. Ciò significa che " _airprint._tcp " non sembra esistere e che le stampanti AirPrint devono utilizzare una firma diversa per farsi conoscere dai potenziali clienti. Tuttavia, sappiamo già che tutti i servizi AirPrint utilizzano IPP per comunicare con i loro clienti, quindi anche DEVE fare gli annunci di tipo di servizio _ipp._tcp .

Quindi è sicuro concludere che ...

  1. ... tutti I dispositivi AirPrint si annunciano come _ipp._tcp (non _airprint._tcp ). Inoltre, sembra ...
  2. ... puoi identificare i dispositivi AirPrint cercando il TXT record di urf="$anything" e pdl="$anything,image/urf" .

Per verificarlo, ho verificato con che cosa l'annuncio (falso) di dns-sd.org parla della sua AirPrint (avviso, non è permanentemente su Internet, a volte va via per ore ...). Ritorna questo:

kp@zdv-wireless-43-219:>  dns-sd -Z _ipp._tcp,_universal dns-sd.org.

  Browsing for _ipp._tcp,_universal.dns-sd.org.
  DATE: ---Sat 21 May 2016---
   1:40:45.688  ...STARTING...

  ; To direct clients to browse a different domain, substitute that domain in place of '@'
  lb._dns-sd._udp                                 PTR     @

  ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
  ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
  ; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

  _ipp._tcp                                       PTR     Stuart's2Home2AirPrint2Printer._ipp._tcp
  Stuart's2Home2AirPrint2Printer._ipp._tcp SRV     0 0 631 airprint.dns-sd.org. ; Replace with unicast FQDN of target host
  Stuart's2Home2AirPrint2Printer._ipp._tcp TXT     "txtvers=1" "qtotal=1" "rp=ipp/printer" \
    "pdl=application/postscript,application/vnd.hp-PCL,application/vnd.hp-PCLXL,application/pdf,image/urf" \
    "URF=CP99,W8,OB10,PQ3-4-5,ADOBERGB24,DEVRGB24,DEVW8,SRGB24,IS1-2-4,MT1-2-3-5-12,MT1-2-3-5-12,RS600" \
    "ty=HP LaserJet 400 color M451nw" "product=(HP LaserJet 400 color M451nw)" \
    "priority=10" "adminurl=http://www.dns-sd.org/ServerStaticSetup.html" \
    "note=At Stuart's house" "Color=T" "Duplex=F" "Scan=F"
^C

In effetti, "Stuart's Home AirPrint Printer" menziona "URF" nei suoi record TXT.

Quindi, per riassumere la risposta alla tua domanda "Come posso ottenere gli indirizzi IP di tutte le stampanti AirPrint?"

  1. Innanzitutto, elenca tutte le stampanti IPP.
  2. In secondo luogo, escludi queste stampanti IPP che NON enumerano i due urf -entries sopra menzionati nei loro record TXT.

Verifica le mie dichiarazioni

Il seguente comando (minimo) annuncerà un falso dispositivo AirPrint nella tua LAN (finché non annulli il comando con ^ C ):

dns-sd                                                                   \                                                                            
    -R "Minimal AirPrint Demo (dummy+fake printer fooling iPad clients)" \               
    _ipp._tcp.,_universal                                                \                                                              
    .                                                                    \                                                                                  
    631                                                                  \                                                                                
    pdl="image/urf"                                                      \                                                                    
    URF=""

I tuoi dispositivi iOS ora enumereranno questa stampante tra i dispositivi AirPrint rilevati automaticamente.

(A proposito, puoi annunciare la porta come qualcosa di diverso dal 631 - i client iOS la identificheranno comunque come un dispositivo AirPrint ...)

Ora ripeti questo piccolo esperimento, lascia solo una delle due dichiarazioni image/urf o URF="" dal tuo comando:

  1. Il dispositivo falso apparirà ancora come una stampante IPP negli elenchi di navigazione DNS-SD / Bonjour.
  2. Ma i client iOS elencheranno solo come dispositivi compatibili con AirPrint (falsi o reali) con le voci correlate a "URF".
risposta data 21.05.2016 - 00:36
fonte
2

Ecco un'altra risposta. È più breve e più diretto al punto. Tuttavia, lascerò la prima risposta a sé stante, poiché potrebbe essere utile per le persone che stanno esplorando questo argomento.

Al momento, conosco solo una risposta per Linux .... Se trovo un comando per Mac + dns-sd , estenderò questa risposta.

Su Linux, esegui questo comando:

kp@zdv-linux-003:>  avahi-browse -rt _universal._sub._ipp._tcp

  +  wlan1 IPv4 AirPrint Demo (Dummy Drucker)                 Internet Printer     local
  =  wlan1 IPv4 AirPrint Demo (Dummy Drucker)                 Internet Printer     local
     hostname = [zdv-linux-003]
     address = [192.168.177.20]
     port = [632]
     txt = ["URF=V1.2,DM3,OF1-2-3-4,CP99,W8,OB10,PQ3-4-5,ADOBERGB24,DEVRGB24,DEVW8,SRGB24,IS1-2-4,MT1-2-3-5-12,RS600" \
            "pdl=application/pdf,image/urf,image/jpeg,image/pwg-raster" \
            "usb_CMD=" "usb_MDL=" "usb_MFG=" "Transparent=T" "TBCP=T" \
            "Product=" "Staple=T" "Sort=T" "Punch=2" "PaperCustom=T" \
            "PaperMax=isoC-A2" "Duplex=T" "Copies=T" "Color=T" \
            "Collate=T" "Bind=T" "Fax=F" "Binary=T" "Transparent=T" \
            "DUUID=12345678-9ABC-DEF0-1234-56789ABCDEF0" \
            "UUID=533f7ac6-1c37-11e6-ac21-ffa8e4bdcbf9" "TLS=1.2" \
            "printer-type=0x0480FFFC" "printer-state=3" \
            "product=Generic PDF PPD" "priority=1" \
            "adminurl=mailto:[email protected]" \
            "kind=disc,label,large-format,postcard,receipt,roll,document,envelope,photo" \
            "air=none" "air=username,password" "note3=" \
            "note2=(totally dummy and fake device)" \
            "note=Virtueller Drucker für Demos von IPP-Everywhere in Room 3a/3b" \
            "ty=Kurt Pfeifle Handmade Model" "rp=printers/DummyAirPrint" \
            "qtotal=1" "txtvers=1"]

Come puoi vedere, il tipo di servizio _universal._sub._ipp._tcp visualizzerà i dispositivi AirPrint e il parametro -r lo risolverà e rivelerà l'indirizzo IP 192.168.177.20 .

risposta data 23.05.2016 - 01:45
fonte
2

Prima di immergerti nella seguente risposta:
Assicurati di aver compreso le spiegazioni complete di AirPrint per le informazioni sui tag [AirPrint] che ho scritto di recente.

C'è un altro strumento che può identificare i dispositivi AirPrint. È il poco conosciuto ippfind utility, fornito come parte di CUPS (su Debian: come parte del pacchetto cups-client ).

Esiste anche un'utilità ippfind.exe disponibile per Windows. Viene fornito come parte del pacchetto software IPP Everywhere Selfcertification disponibile per il download dal Printer Working Group (PWG) ) sito web qui:

Quindi il seguente metodo funziona su Linux e su Mac OS X e Windows.

Mostrerò ora passo dopo passo come lavorarci ...

Il comando più semplice trova tutti gli URI della stampante IPP

Il modo più semplice per eseguire l'utilità è questo:

ippfind

Sul mio sistema attuale, restituisce:

  ipp://mbp2-2.local.:632/printers/DummyAirPrint
  ipp://mbp2-3.local.:631/printers/Officejet6500eric
  ipp://mbp2-4.local.:631/printers/Officejet_6500
  ipp://mbp2-5.local.:631/printers/Officejet_6500_E709n
  ipp://mbp2-1.local.:631/printers/Officejet_6600
  ipp://mbp2-7.local.:633/printers/Officejet6500donna
  ipp://mbp2-8.local.:631/printers/raw2dir

Questa è una lista di tutti i servizi di stampa IPP (compresi quelli di AirPrint). Nota come alcuni di questi non usano la porta IPP predefinita 631, ma sono ancora scoperti.

Poiché ippfind non ha visto alcun parametro della riga di comando, ha usato silenziosamente quelli predefiniti, e in realtà questo comando è stato eseguito:

ippfind _ipp._tcp --print

Filtra i dispositivi AirPrint

Per restringere le stampanti tutte IPP solo a quelle che supportano AirPrint, dobbiamo aggiungere il sottotipo _universal alla nostra query:

 ippfind _ipp._tcp,_universal --print

Questo mi lascia con il seguente sottoinsieme della lista completa di sopra:

  ipp://mbp2-2.local.:632/printers/DummyAirPrint
  ipp://mbp2-3.local.:631/printers/Officejet6500eric
  ipp://mbp2-7.local.:633/printers/Officejet6500donna

Ottieni i nomi host per gli URI IPP

ippfind funziona come la classica utility find che cerca file, directory e altri oggetti nella gerarchia del file system, e quindi ha un parametro --exec , che può essere usato per eseguire un comando su ogni trovato voce:

 ippfind _ipp._tcp,_universal --exec echo '{service_hostname}' \;

Il comando restituisce i nomi host per tutti gli AirPrinters. Non elenca le altre stampanti IPP non AirPrint:

  mbp2-2.local.
  mbp2-3.local.
  mbp2-7.local.

Trova gli indirizzi IP di tutti i dispositivi AirPrint

Poiché dalle risposte precedenti sappiamo già che dns-sd -G restituirà gli indirizzi IP, possiamo eseguirlo invece del semplice comando echo dall'alto:

ippfind _ipp._tcp,_universal --exec dns-sd -G v4 '{service_hostname}' \;

    DATE: ---Tue 24 May 2016---
     3:39:18.024  ...STARTING...
    Timestamp     A/R Flags if Hostname         Address          TTL
     3:39:18.028  Add     2  4 mbp2-2.local.    192.168.177.20   120
     3:39:18.028  Add     2  4 mbp2-3.local.    192.168.177.28   120
     3:39:18.028  Add     2  4 mbp2-7.local.    192.168.177.31   120
^C

Voila !, un elenco di indirizzi IP accanto ai nomi host completi (Bonjour) ....

Ovviamente potresti anche eseguire qualcosa del tipo:

ippfind _ipp._tcp,_universal --exec echo  '{service_hostname}' \;  \
    | while read line; do ping -c 1 "$line" ; done                 \
    | grep PING

PING mbp2-2.local (192.168.177.20): 56 data bytes
PING mbp2-3.local (192.168.177.28): 56 data bytes
PING mbp2-7.local (192.168.177.31): 56 data bytes

(ad esempio, se dns-sd non è prontamente disponibile, come su Windows), e segnalerà anche gli indirizzi IP (semplicemente perché ping è necessario e li ha risolti e li segnala anche).

(Lo ammetto: non l'ho provato con i veri dispositivi AirPrint - semplicemente non ne ho nessuno disponibile. L'ho fatto con quelli simulati, ma sarei sorpreso se questo non funzionasse altrettanto bene nell'ambiente l'OP funziona con ...)

    
risposta data 24.05.2016 - 03:57
fonte
1

C'è un modo abbastanza indolore per farlo con il modulo perl Net::Bonjour :

#!/usr/bin/perl

use Net::Bonjour;
use warnings;
use strict;

my $res = Net::Bonjour->new('printer');

print "Name\t\t\tAddress\tPort\n";
foreach my $entry ( $res->entries) {
    print join ("\t", $entry->name , $entry->address , $entry->port) , "\n";
}

Questo elencherà i nomi, gli indirizzi IP e le porte di tutte le stampanti abilitate Bonjour sulla rete, non solo quelle di AirPrint. Funziona su Mac, Windows e Linux.

    
risposta data 28.01.2018 - 14:46
fonte

Leggi altre domande sui tag