23 votos

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

Estoy tratando de hacer una lista de todas las impresoras AirPrint en la red de una escuela. Tenemos muchas debido a todas las impresoras de las aulas y oficinas, pero no se han configurado con nombres significativos. He intentado leer la tabla de asignación DHCP en el router, pero muchas de las impresoras no informan de un nombre de host. No puedo comprobar las impresoras en persona debido a la interrupción de las clases por ir a cada sala y jugar con las 1-3 impresoras que hay.

El dns-sd como en ¿Cómo encontrar la dirección IP de mi otro Mac? da una columna llamada Nombre de la instancia en lugar del nombre del host. Utilizando el dns-sd -G en los nombres de las instancias no dio ningún registro de este tipo.

dns-sd -Z está más cerca, ya que da nombres de host para buscar con el G pero no da una lista completa. Hay muchas más impresoras en el Añadir impresora en un Mac que los que hay en la salida de dns-sd -Z .

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

38voto

Kristina Puntos 21

No tengo una impresora AirPrint en mi red. Y tampoco he jugado nunca con una...


Ahora mismo no puedo hacer pruebas con un dispositivo AirPrint real que esté cerca.

Pero así es como puedo enumerar todos los IPP -impresoras habilitadas (en este caso todas están conectadas a través de CUPS):

En primer lugar, 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

Así que sí, efectivamente hay un servicio de impresión IPP (pero no uno AirPrint, que estaría marcada por destacan al ser etiquetados como Tipo de Servicio de _airprint._tcp en la lista).

En segundo lugar, busque todos los servicios presentes de 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" .

En tercer lugar, 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  Officejet\\0326600\\032@\\032mbp.\_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 buscas (nombre de host de la impresora) está cubierta por la frase "Officejet \0326600\032 @ \032mbp._ipp._tcp.local. puede ser contactado en mbp2-2.local.:631"

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

En cuarto lugar, busca 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 primero comando había devuelto algunos _airprint servicio disponible en mi red, entonces mi suposición es que una de las líneas devueltas diría:

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

Así, mi segundo comando tendría que ser:

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

Supongo que esto podría devolver algo como

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

Entonces mi tercera debe decir:

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

Lo que devolverá una línea que le dirá "... puede ser localizado en algún lugar.local.:1234 ". De donde se deriva el cuarto comando:

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

------~~

Advertencias: La última parte, sobre el descubrimiento del servicio AirPrint puede estar mal. Podría darse el caso de que los servicios AirPrint se anuncien a sí mismos igual que los servicios IPP estándar. Tienes que averiguarlo tú mismo. Si lo haces, por favor, infórmate.


Actualización

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

No encontré un solo caso de alguien que informara en algún foro su salida de dns-sd -B que enumera esta cadena en particular.

Sin embargo, había muchos + muchos _airplay._tcp y _ipp._tcp resultados. Esto significa que " _airprint._tcp " no parece existir, y las impresoras AirPrint deben estar utilizando una firma diferente para darse a conocer a los clientes potenciales. Sin embargo, ya sabemos que todos los servicios AirPrint utilizan IPP para comunicarse con sus clientes, por lo que también DEBE hacer el _ipp._tcp anuncios de tipo de servicio.

De ahí que sea seguro concluir que...

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

Para verificarlo, he comprobado con lo que el anuncio (falso) de dns-sd.org cuenta sobre su AirPrint (aviso, no está permanentemente en Internet, a veces se va durante horas...). Sí 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's\\032Home\\032AirPrint\\032Printer.\_ipp.\_tcp
  Stuart's\\032Home\\032AirPrint\\032Printer.\_ipp.\_tcp SRV     0 0 631 airprint.dns-sd.org. ; Replace with unicast FQDN of target host
  Stuart's\\032Home\\032AirPrint\\032Printer.\_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.

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

  1. En primer lugar, enumere todas las impresoras IPP.
  2. En segundo lugar, excluir estas impresoras IPP que hacen NO enumerar los dos mencionados urf -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 autodescubiertos.

(Por cierto, también puedes anunciar el puerto como algo diferente a 631 -- los clientes de iOS seguirán identificándolo como un dispositivo AirPrint...)

Ahora repite este pequeño experimento, sólo deja uno de los dos image/urf o URF="" declaraciones de su mando:

  1. El dispositivo falso seguirá apareciendo como una impresora IPP en las listas de exploración de DNS-SD/Bonjour.
  2. Pero los clientes de iOS sólo listarán como aptos para AirPrint estos dispositivos (falsos o reales) con las entradas relacionadas con "URF".

5voto

Kristina Puntos 21

Antes de que te sumerjas en la siguiente respuesta:<br>Asegúrese de que ha entendido las explicaciones completas de AirPrint para el <a href="https://apple.stackexchange.com/tags/airprint/info">Información de la etiqueta [AirPrint] </a>He escrito recientemente.


Hay otra herramienta que puede identificar los dispositivos AirPrint. Es la poco conocida ippfind que forma parte de CUPS (en Debian: como parte del cups-client paquete).

Hay un ippfind.exe utilidad disponible para Windows también. Se envía como parte del programa Paquete de software de autocertificación IPP Everywhere que está disponible para su descarga en el Grupo de Trabajo de Impresoras (PWG) sitio web aquí:

Así que el siguiente método funciona tanto en Linux como en Mac OS X y Windows.

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

El comando más sencillo encuentra todos los URIs de impresoras IPP

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

ippfind

En mi sistema actual, vuelve:

  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). Observe cómo algunos de ellos no utilizan el puerto IPP 631 por defecto, pero aún así se descubren.

Porque ippfind no vio ningún parámetro de la línea de comandos, utilizó silenciosamente los que tenía por defecto, y en realidad este comando sí se ejecutó:

ippfind _ipp._tcp --print

Filtrar los dispositivos AirPrint

Para reducir de todo IPP a sólo aquellas que soportan AirPrint, tenemos que añadir 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 URIs de IPP

ippfind funciona de forma similar al clásico find que busca archivos, directorios y otros objetos en la jerarquía del sistema de archivos, y por lo tanto tiene un --exec que se puede utilizar para ejecutar un comando contra cada elemento encontrado:

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

El comando devuelve los nombres de los hosts de todas las AirPrint. No muestra las otras impresoras IPP que no son AirPrint:

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

Encontrar las direcciones IP de todos los dispositivos AirPrint

Dado que por las respuestas anteriores ya sabemos que dns-sd -G devolverá las direcciones IP, podemos ejecutar esto en lugar del simple echo comando 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

Voilà, una lista de direcciones IP junto a los nombres de host completamente calificados (Bonjour) ....

Por supuesto, también podría 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á fácilmente disponible, como en Windows), y también informará de las direcciones IP (simplemente porque ping necesarios y los resuelve y también los informa).


(Lo admito: no he probado esto con dispositivos AirPrint reales, simplemente no tengo ninguno disponible. Lo hice con unos simulados. Pero me sorprendería que esto no funcionara igual de bien en el entorno con el que trabaja el OP...)

4voto

MJ Walsh Puntos 122

Hay una forma bastante sencilla de hacer esto 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á los nombres, las direcciones IP y los puertos de todas las impresoras habilitadas para Bonjour en la red, no sólo las de AirPrint. Funciona en Mac, Windows y Linux.

3voto

Kristina Puntos 21

Aquí hay otra respuesta. Es más corta y va más directa al grano. 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, sólo conozco una respuesta para Linux.... Si encuentro un comando para Mac + dns-sd voy a ampliar 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:kurt.pfeifle@gmail.com" \\
            "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á los dispositivos AirPrint, y el -r lo resolverá y revelará la dirección IP 192.168.177.20 .


AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X