¿Cómo puedo enumerar las direcciones IP de todas las impresoras AirPrint en una red?

4

Estoy tratando de hacer una lista de todas las impresoras AirPrint en la red en una escuela. Tenemos muchos de ellos debido a todas las impresoras de aula y oficina, pero no se han creado con nombres significativos. Intenté leer la tabla de asignación DHCP en el enrutador, pero muchas de las impresoras no informan un nombre de host. No puedo revisar las impresoras en persona debido a la interrupción de las clases, ya que ir a todas las habitaciones y jugar con las impresoras 1-3 allí.

El comando dns-sd como en Cómo ¿Encontrar la dirección IP de mi otra Mac? proporciona una columna llamada Nombre de instancia , en lugar del nombre de host. El uso de la opción dns-sd -G en los nombres de instancia no dio tal registro.

dns-sd -Z está más cerca, ya que proporciona nombres de host para buscar con la opción G , pero no proporciona una lista completa. Hay muchas más impresoras en el cuadro de diálogo Agregar impresora en una Mac que en la salida de dns-sd -Z .

¿Alguien tiene algún código o script para encontrar todas las direcciones IP de las cosas que publicita Bonjour?

    
pregunta user2127627 03.03.2015 - 21:35

4 respuestas

15

No tengo una impresora AirPrint en mi red. Y nunca jugó con uno tampoco ...

No puedo probar con un dispositivo AirPrint real en mi proximidad ahora mismo.

Pero aquí es cómo puedo enumerar todas las impresoras habilitadas IPP (en este caso, todas están conectadas a través de CUPS):

Primero, busque los servicios detectables de DNS-SD (todos los tipos):

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

Entonces, sí, hay un servicio de impresión IPP (pero no AirPrint, que estaría marcado por y se destacan como Tipo de servicio de _airprint._tcp en la lista).

En segundo lugar, busque todos los servicios actuales del 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

Bien, uno de los nombres de instancia es "Officejet 6600 @ mbp" .

Tercero, busque información específica sobre la impresora llamada "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 mitad de la información que está buscando (nombre de host de la impresora) está cubierta por la oración "Officejet \ 0326600 \ 032 @ \ 032mbp._ipp._tcp.local. se puede encontrar en mbp2-2.local .: 631 "

Esto proporciona el nombre de host actual (Bonjour-) del nodo que ofrece el servicio de impresión buscado.

En cuarto lugar, busque las direcciones IPv4 e IPv6 para un nombre de host determinado:

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

Resumen

Suponiendo que mi comando first hubiera devuelto algún servicio _airprint disponible en mi red, entonces supongo que una de las líneas devueltas sería:

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

Por lo tanto, mi comando segundo tendría que ser:

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

Supongo que esto podría devolver algo así como

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

Luego, mi comando third debería leer:

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

Lo que devolvería una línea diciéndole que "... puede contactarse en algún lugar.local.:1234 ". De la cual derivar el comando cuarto :

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

Caveats: La última parte, acerca del descubrimiento del servicio AirPrint puede estar equivocada. Podría darse el caso de que los servicios de AirPrint se anuncien como lo hacen los servicios IPP estándar. Tienes que averiguarlo tú mismo. Si lo hace, informe de nuevo.

Actualizar

He buscado un poco en Google para " _airprint._tcp ".

No encontré una sola instancia de nadie que haya reportado en algún foro su salida de dns-sd -B listando esta cadena en particular.

Sin embargo, hubo lotes + lotes de _airplay._tcp y _ipp._tcp resultados. Esto significa que " _airprint._tcp " no parece existir, y las impresoras AirPrint deben usar una firma diferente para darse a conocer a los posibles clientes. Sin embargo, ya sabemos que todos los servicios de AirPrint utilizan IPP para comunicarse con sus clientes, por lo que también MUST están realizando los anuncios de tipo de servicio _ipp._tcp .

Por lo tanto, es seguro concluir que ...

  1. ... todos los dispositivos AirPrint se anunciarán como _ipp._tcp (no _airprint._tcp ). Además, parece que ...
  2. ... puedes identificar los dispositivos AirPrint buscando el registro TXT de urf="$anything" y pdl="$anything,image/urf" .

Para verificar esto, verifiqué lo que dice el (falso) anuncio de dns-sd.org sobre su AirPrint (advertencia, no está permanentemente en Internet, a veces desaparece por horas) ...). Devuelve esto:

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

De hecho, "Stuart's Home AirPrint Printer" menciona "URF" en sus registros TXT.

Entonces, para resumir la respuesta a su pregunta "¿Cómo puedo obtener las direcciones IP de todas las impresoras AirPrint?"

  1. Primero, liste todas las impresoras IPP.
  2. Segundo, excluya estas impresoras IPP que no NOT enumeran las dos entradas urf mencionadas anteriormente en sus registros TXT.

Verificar mis declaraciones

El siguiente comando (mínimo) anunciará un dispositivo AirPrint falso en su LAN (hasta que cancele el comando con ^C ):

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

Sus dispositivos iOS ahora enumerarán esta impresora entre sus dispositivos AirPrint descubiertos automáticamente.

(Por cierto, también puede anunciar que el puerto es diferente al 631; los clientes de iOS seguirán identificándolo como un dispositivo AirPrint ...)

Ahora repita este pequeño experimento, simplemente deje una de las dos declaraciones image/urf o URF="" fuera de su comando:

  1. El dispositivo falso seguirá apareciendo como una impresora IPP en las listas de navegación DNS-SD / Bonjour.
  2. Pero los clientes de iOS solo enumerarán como dispositivos compatibles con AirPrint (falsos o reales) con las entradas relacionadas con "URF".
respondido por el Kurt Pfeifle 21.05.2016 - 00:36
2

Aquí hay otra respuesta. Es más corto, y más directo al punto. Sin embargo, dejaré que la primera respuesta se mantenga por sí sola, ya que puede ser útil para las personas que están explorando este tema.

Actualmente, solo conozco una respuesta para Linux .... Si encuentro un comando para Mac + dns-sd , extenderé esta respuesta.

En Linux, ejecute este 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"]

Como puede ver, el tipo de servicio _universal._sub._ipp._tcp mostrará dispositivos AirPrint, y el parámetro -r lo resolverá y revelará la dirección IP 192.168.177.20 .

respondido por el Kurt Pfeifle 23.05.2016 - 01:45
2

Antes de sumergirse en la siguiente respuesta:
Asegúrese de haber comprendido las explicaciones completas de AirPrint para la información de la etiqueta [AirPrint] que he escrito recientemente.

Hay otra herramienta que puede identificar dispositivos AirPrint. Es la utilidad ippfind poco conocida, que se envía como parte de CUPS (en Debian: como parte del paquete cups-client ).

También hay una utilidad ippfind.exe disponible para Windows. Se envía como parte del IPP Everywhere Selfcertification Package que está disponible para descargar desde el Grupo de trabajo de impresoras (PWG) ) sitio web aquí:

El siguiente método funciona tanto en Linux como en Mac OS X y Windows.

Lo mostraré ahora paso a paso, cómo trabajar con él ...

El comando más simple encuentra todos los URI de impresora IPP

La forma más sencilla de ejecutar la utilidad es esta:

ippfind

En mi sistema actual, devuelve:

  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

Esta es una lista de todos los servicios de impresión IPP (incluidos los de AirPrint). Tenga en cuenta que algunos de estos no utilizan el puerto IPP predeterminado 631, pero aún se descubren.

Debido a que ippfind no vio ningún parámetro de línea de comando, utilizó silenciosamente sus valores predeterminados, y en realidad este comando se ejecutó:

ippfind _ipp._tcp --print

Filtra los dispositivos AirPrint

Para restringir de todas las impresoras IPP a solo aquellas que son compatibles con AirPrint, debemos agregar el subtipo _universal a nuestra consulta:

 ippfind _ipp._tcp,_universal --print

Esto me deja con el siguiente subconjunto de la lista completa de arriba:

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

Obtenga los nombres de host para los URI de IPP

ippfind funciona de manera similar a la utilidad clásica find que busca archivos, directorios y otros objetos en la jerarquía del sistema de archivos, y por lo tanto tiene un parámetro --exec , que se puede usar para ejecutar un comando contra cada uno encontrado elemento:

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

El comando devuelve los nombres de host para todos los AirPrinters. No enumera las otras impresoras IPP que no son AirPrint:

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

Encuentre las direcciones IP de todos los dispositivos AirPrint

Ya que de las respuestas anteriores ya sabemos que dns-sd -G devolverá las direcciones IP, podemos ejecutar esto en lugar del simple comando echo desde arriba:

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!, una lista de direcciones IP junto con los nombres de host completos (Bonjour) ....

Por supuesto, también puedes ejecutar algo como:

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

(por ejemplo, si dns-sd no está disponible, como en Windows), y también informará las direcciones IP (simplemente porque ping las necesita y las resuelve y también las informa).

(Admito: no probé esto con dispositivos AirPrint reales, simplemente no tengo ninguno disponible. Lo hice con dispositivos simulados. Pero me sorprendería si esto no funcionara tan bien en el entorno el OP funciona con ...)

    
respondido por el Kurt Pfeifle 24.05.2016 - 03:57
1

Hay una forma bastante sencilla de hacerlo con el módulo 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";
}

Esto mostrará una lista de los nombres, las direcciones IP y los puertos de todas las impresoras habilitadas para Bonjour en la red, no solo las de AirPrint. Funciona en Mac, Windows y Linux.

    
respondido por el MJ Walsh 28.01.2018 - 14:46

Lea otras preguntas en las etiquetas