23 votes

Comment puis-je répertorier les adresses IP de toutes les imprimantes AirPrint d'un réseau ?

J'essaie de dresser une liste de toutes les imprimantes AirPrint présentes sur le réseau d'une école. Nous en avons beaucoup en raison de toutes les imprimantes de classe et de bureau, mais elles n'ont pas été configurées avec des noms significatifs. J'ai essayé de lire la table d'allocation DHCP dans le routeur, mais de nombreuses imprimantes ne signalent pas de nom d'hôte. Je ne peux pas vérifier les imprimantes en personne, car cela perturberait les cours si je devais aller dans chaque salle et jouer avec les 1 à 3 imprimantes qui s'y trouvent.

Le site dns-sd comme dans Comment trouver l'adresse IP de mon autre Mac ? donne une colonne appelée Nom de l'instance plutôt que le nom de l'hôte. En utilisant le dns-sd -G sur les noms d'instance n'a pas donné d'enregistrement.

dns-sd -Z est plus proche, puisqu'elle donne les noms d'hôtes à rechercher avec la fonction G mais elle ne donne pas une liste complète. Il y a beaucoup plus d'imprimantes dans le Ajouter une imprimante sur un Mac qu'il n'y en a dans la sortie de l'application dns-sd -Z .

Est-ce que quelqu'un a un code ou un script pour trouver simplement toutes les adresses IP des choses qui font de la publicité par Bonjour ?

38voto

paulguy Points 121

Je n'ai pas d'imprimante AirPrint sur mon réseau. Et je n'ai jamais joué avec une imprimante non plus...


Je ne peux pas faire de test avec un vrai appareil AirPrint à proximité pour le moment.

Mais voici comment je peux lister toutes les IPP -Les imprimantes activées (dans ce cas, elles sont toutes connectées via CUPS) :

Tout d'abord, recherchez les services découvrables DNS-SD (tous types confondus) :

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

Donc, oui, il y a bien un service d'impression IPP (mais pas de service AirPrint, ce qui n'est pas toujours le cas). serait marquée par se distinguent en étant étiquetés comme Service Type of _airprint._tcp dans la liste).

Ensuite, recherchez tous les services actuels de type "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, un des noms d'instance est "Officejet 6600 @ mbp" .

Troisièmement, recherchez des informations spécifiques sur l'imprimante nommée "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 moitié de l'information que vous recherchez (le nom d'hôte de l'imprimante) est couverte par la phrase suivante "Officejet \0326600\032 @ \032mbp._ipp._tcp.local. peut être joint à mbp2-2.local.:631"

Cela donne le nom d'hôte (Bonjour) actuel du nœud offrant le service d'impression recherché.

Quatrièmement, recherchez les adresses IPv4 et IPv6 pour un nom d'hôte donné :

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

Résumé

En supposant que mon premièrement La commande a retourné quelques _airprint disponible sur mon réseau, alors je pense que l'une des lignes renvoyées serait la suivante :

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

Ainsi, mon deuxième le commandement devrait être :

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

Je suppose que cela pourrait retourner quelque chose comme

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

Ensuite, mon troisième doit être lu :

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

Ce qui renverrait une ligne vous disant "... peut être joint à quelque part.local.:1234 ". D'où l'on peut déduire le quatrième commandement :

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

------~~

Mises en garde : La dernière partie, concernant la découverte du service AirPrint, est peut-être fausse. Il se peut que les services AirPrint s'annoncent comme les services IPP standard. Vous devez le découvrir vous-même. Si vous le faites, veuillez nous en faire part.


Mise à jour

J'ai fait quelques recherches sur Google pour trouver " _airprint._tcp ".

Je n'ai pas trouvé un seul cas où quelqu'un a rapporté dans un forum son résultat de dns-sd -B qui énumère cette chaîne particulière.

Cependant, il y avait beaucoup, beaucoup de _airplay._tcp y _ipp._tcp résultats. Cela signifie que " _airprint._tcp "ne semble pas exister, et les imprimantes AirPrint doivent utiliser une signature différente pour se faire connaître des clients potentiels. Cependant, nous savons déjà que tous les services AirPrint utilisent le protocole IPP pour communiquer avec leurs clients, et donc qu'ils utilisent également le protocole IPP pour communiquer avec leurs clients. MUST faire le _ipp._tcp les annonces de type de service.

On peut donc conclure que...

  1. ...tous Les appareils AirPrint s'annoncent comme _ipp._tcp (pas _airprint._tcp ). Aussi, il semble que...
  2. ...vous pouvez identifier les périphériques AirPrint en recherchant le symbole TXT dossier de urf="$anything" y pdl="$anything,image/urf" .

Pour vérifier cela, j'ai vérifié avec quoi l'annonce (fausse) du dns-sd.org parle de son AirPrint (attention, il n'est pas en permanence sur Internet, parfois il disparaît pendant des heures...). Il renvoie bien ceci :

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

En effet, "Stuart's Home AirPrint Printer" mentionne "URF" dans ses enregistrements TXT.

Donc, pour résumer la réponse à votre question "Comment puis-je obtenir les adresses IP de toutes les imprimantes AirPrint ?"

  1. Tout d'abord, dressez la liste de toutes les imprimantes IPP.
  2. Deuxièmement, exclure ces imprimantes IPP qui font PAS énumérer les deux mentionnés ci-dessus urf -dans leurs enregistrements TXT.

Vérifier mes déclarations

La commande suivante (minimale) annoncera un faux périphérique AirPrint dans votre LAN (jusqu'à ce que vous annuliez la commande avec ^C ) :

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

Vos appareils iOS vont maintenant répertorier cette imprimante parmi les appareils AirPrint qu'ils ont automatiquement découverts.

(BTW, vous pouvez annoncer le port comme quelque chose de différent de 631 aussi -- les clients iOS l'identifieront toujours comme un dispositif AirPrint...)

Maintenant, répétez cette petite expérience, mais laissez l'un des deux image/urf o URF="" les déclarations de votre commande :

  1. Le faux périphérique apparaîtra toujours comme une imprimante IPP dans les listes de navigation DNS-SD/Bonjour.
  2. Mais les clients iOS ne répertorieront comme compatibles AirPrint que les (faux ou vrais) appareils avec les entrées liées à "URF".

5voto

paulguy Points 121

Avant de vous plonger dans la réponse suivante :<br>Veuillez vous assurer que vous avez bien compris les explications complètes sur AirPrint pour les <a href="https://apple.stackexchange.com/tags/airprint/info">Info sur le tag [AirPrint] </a>J'ai récemment écrit.


Il existe un autre outil qui permet d'identifier les périphériques AirPrint. Il s'agit du peu connu ippfind qui fait partie de CUPS (sur Debian : comme partie de l'utilitaire cups-client paquet).

Il existe un ippfind.exe disponible pour Windows également. Il est livré avec le logiciel Logiciel d'autocertification IPP Everywhere qui peut être téléchargé à partir de la page Groupe de travail sur les imprimantes (PWG) ici :

La méthode suivante fonctionne donc aussi bien sur Linux que sur Mac OS X et Windows.

Je vais maintenant vous montrer, étape par étape, comment travailler avec elle...

La commande la plus simple trouve tous les URIs d'imprimantes IPP

La façon la plus simple d'exécuter l'utilitaire est la suivante :

ippfind

Sur mon système actuel, il renvoie :

  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

Il s'agit d'une liste de tous les services d'impression IPP (y compris les services AirPrint). Notez que certains d'entre eux n'utilisent pas le port IPP 631 par défaut, mais ils sont tout de même découverts.

Parce que ippfind n'a pas vu de paramètres de ligne de commande, il a silencieusement utilisé ses paramètres par défaut, et en réalité cette commande a été exécutée :

ippfind _ipp._tcp --print

Filtrer les périphériques AirPrint

Pour réduire le nombre de tous les imprimantes IPP à celles qui prennent en charge AirPrint, nous devons ajouter le sous-type _universel à notre requête :

 ippfind _ipp._tcp,_universal --print

Il me reste donc le sous-ensemble suivant de la liste complète ci-dessus :

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

Obtenir les noms d'hôtes pour les URI IPP

ippfind fonctionne de la même manière que le classique find qui recherche des fichiers, des répertoires et d'autres objets dans la hiérarchie du système de fichiers, et qui dispose donc d'une fonction --exec qui peut être utilisé pour exécuter une commande pour chaque élément trouvé :

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

La commande renvoie les noms d'hôte de tous les AirPrinters. Elle ne répertorie pas les autres imprimantes IPP non-AirPrint :

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

Trouver les adresses IP de tous les périphériques AirPrint

Puisque, d'après les réponses précédentes, nous savons déjà que dns-sd -G renverra les adresses IP, nous pouvons l'exécuter à la place de la simple commande echo d'en haut :

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à, une liste d'adresses IP avec les noms d'hôtes pleinement qualifiés (Bonjour) .....

Vous pourriez bien sûr aussi exécuter quelque chose comme :

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

(par exemple, si dns-sd n'est pas facilement disponible, comme sur Windows), et il signalera également les adresses IP (simplement parce que ping nécessaire et les a résolus et les signale également).


(Je l'admets : je n'ai pas testé cela avec de vrais appareils AirPrint - je n'en ai tout simplement pas de disponibles. Je l'ai fait avec des appareils simulés. Mais je serais surpris si cela ne fonctionnait pas aussi bien dans l'environnement avec lequel le PO travaille...)

4voto

MJ Walsh Points 270

Il existe un moyen assez simple de faire cela avec le module 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";
}

Il répertorie les noms, les adresses IP et les ports de toutes les imprimantes compatibles avec Bonjour sur le réseau, et pas seulement les imprimantes AirPrint. Il fonctionne sur Mac, Windows et Linux.

3voto

paulguy Points 121

Voici une autre réponse. Elle est plus courte et va plus directement au but. Toutefois, je vais laisser la première réponse se suffire à elle-même, car elle peut être utile aux personnes qui explorent ce sujet.


Actuellement, je ne connais une réponse que pour Linux..... Si je trouve une commande pour Mac + dns-sd Je vais prolonger cette réponse.

Sous Linux, exécutez cette commande :

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"\]

Comme vous pouvez le voir, le type de service _universal._sub._ipp._tcp affichera les périphériques AirPrint, et le bouton -r va le résoudre et révéler l'adresse IP 192.168.177.20 .


LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X