Rerchercher un fichier sous Linux avec la commande locate

Besoin de rechercher un fichier sur son système Linux ? Facile avec la commande « locate » !

Elle n’est pas présente sur tous les systèmes, mais la plupart la propose sous forme d’un package prêt à être installer comme sur Debian/Ubuntu.

aptitude install locate

La commande est maintenant disponible, mais ne soyez pas étonné si aucun résultat n’est retourné lors d’une recherche. Car pour que « locate » fonctionne, il faut qu’au préalable votre système soit analysé pour connaitre tous les fichiers présents. Ces informations sont ensuite placées dans une base de données, actualisée toutes les 24h au moyen d’une tâche planifiée. Il y a donc un décalage possible. Pour forcer manuellement le rafraichissement, il faut utiliser la commande suivante :
updatedb

Et voici le resultat d’une recherche basée sur le mot « uname »
root@debian:~# locate uname
/bin/uname
/usr/share/man/man1/uname.1.gz

Désinstaller une carte réseau fantôme sous Windows

Le retrait physique d’un périphérique ne désinstalle pas tous les composants logiciels qui lui sont associés, pilotes, logiciels et enregistrements registre restent donc présents sur l’ordinateur. Cela m’a posé problème lorsque j’ai voulu renommer une carte réseau, le nom « Connexion au réseau local » était déjà utilisé, mais la carte réseau n’était plus présente dans le Panneau de configuration. J’avais besoin de ce nom pour utiliser un script faisant appel à netsh. Même problème lorsque j’ai voulu affecter une adresse IP déjà assignée à une ancienne carte pourtant inexistante physiquement …

Voici une des méthodes donnée par Microsoft pour supprimer des cartes réseaux fantômes :

  1. Cliquez sur Démarrer, sur Exécuter, tapez cmd.exe, puis appuyez sur Entrée,
  2. Tapez set devmgr_show_nonpresent_devices=1, puis appuyez sur Entrée,
  3. Tapez devmgmt.msc, puis appuyez sur Entrée,
  4. Cliquez sur Affichage, puis sur Afficher les périphériques cachés,
  5. Développez l’arborescence de Cartes réseau,
  6. Cliquez avec le bouton droit sur la carte réseau en grisé, puis cliquez sur Désinstaller.

Lien utile

KB 269155 de Microsoft

Mise en place d’un serveur d’impression AirPrint

Apple a lancé AirPrint, un système d’impression pour ses appareils mobiles fonctionnant sous iOS – soient les iPod touch, les iPhone et les iPad – ne nécessitant aucune configuration de la part de l’utilisateur. Il suffit juste de s’équiper d’une imprimante compatible – quelques modèles présents (environ une cinquantaine de modèles HP et Epson). Mais il est aussi possible de faire appel au monde du logiciel libre, car en mixant CUPS et Avahi, on peut transformer n’importe quelle imprimante en imprimante AirPrint !

Tout d’abord, il faut que CUPS soit en place et qu’au moins une imprimante soit configurée dessus. Si besoin, se référer à l’article suivant pour savoir comment faire.

Ajouter la ligne suivante dans le fichier « /etc/cups/cupsd.conf ». Dans mon cas j’ai mis cette ligne sous la directive « Listen ».
[generic]ServerAlias *[/generic]

Avec l’arrivée d’iOS 6, il faut ajouter deux nouveaux fichiers pour que le serveur AirPrint soit visible sur les iDevices.

  • /usr/share/cups/mime/airprint.types
    [generic]#
    # « $Id: $ »
    #
    # AirPrint type
    image/urf urf string(0,UNIRAST<00>)
    #
    # End of « $Id: $ ».
    #[/generic]
  • /usr/share/cups/mime/airprint.convs
    [generic]#
    # « $Id: $ »
    #
    # AirPrint
    # Updated list with minimal set 25 Sept
    image/urf application/pdf 100 pdftoraster
    #
    # End of « $Id: $ ».
    #[/generic]

Pour prendre en compte cet ajout, il faut redémarrer le service CUPS.
service cups restart

Attaquons la partie touchant le service Avahi. Nous allons récupérer un script en Python écrit par Timothy J Fontaine permettant de déclarer automatiquement nos imprimantes auprès d’Avahi.
cd /tmp
wget -O airprint-generate.py --no-check-certificate https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py
chmod +x airprint-generate.py
./airprint-generate.py -d /etc/avahi/services

Nous pouvons aller vérifier que des fichiers sont apparus dans « /etc/avahi/services/ ». Voici dans mon cas le contenu du dossier.
root@airprint:~# ls -l /etc/avahi/services/
total 4
-rw-r--r-- 1 root root 891 déc. 26 19:02 AirPrint-LexmarkE320.service

Si le répertoire n’est pas vide, alors nous pouvons redémarrer le service Avahi.
service avahi-daemon restart

Nous allons pouvoir passer au test, mais tout d’abord, vérifier d’être connecté sur le même réseau que votre serveur d’impression. Ensuite, il faut trouver un document à imprimer, iOS vous proposera les imprimantes partagées sur votre réseau.

AirPrint

Lien utile

Discussion sur le site Apple

Mise en place d’un serveur d’impression CUPS

CUPS (Common Unix Printing System) est le serveur d’impression présent sur les machines Unix. Le service CUPS se gère au moyen d’un interface web – accessible uniquement en local en se rendant sur ici (ne pas hésiter à accepter le certificat SSL permettant de sécuriser le site).

Installation des paquets requis. Le paquet virtuel « printer-driver-all » permet d’avoir tous les drivers d’imprimantes reconnues par Debian. Pour les autres, il faudra fouiller sur le site constructeur à la recherche d’un paquet Debian/Ubuntu.
aptitude install cups printer-driver-all

Ici, travaillant sur un serveur dépourvu d’interface graphique, il a fallu que je modifie le fichier de configuration pour autoriser les autres ordinateurs de mon réseau à se connecter sur l’interface web.

Faire une sauvegarde du fichier de configuration
[generic]cp /etc/cups/cupsd.conf /etc/cups/cupsd.conf.old[/generic]

Éditer le contenu de « /etc/cups/cupsd.conf » en modifiant les 4 lignes suivantes.

  • Ceci …
    [generic]Listen localhost:631
    Listen /var/run/cups/cups.sock[/generic]
    … devient
    [generic]#Listen localhost:631
    Listen /var/run/cups/cups.sock
    Port 631[/generic]
  • Ceci …
    [generic]<Location />
    Order allow,deny
    </Location>[/generic]
    … devient
    [generic]<Location />
    Order allow,deny
    Allow from 127.0.0.1
    Allow from 192.168.1.0/24
    </Location>[/generic]
  • Ceci …
    [generic]<Location /admin>
    Order allow,deny
    </Location>[/generic]
    … devient
    [generic]<Location /admin>
    Order allow,deny
    Allow from 127.0.0.1
    Allow from 192.168.1.0/24
    </Location>[/generic]
  • Ceci …
    [generic]<Location /admin/conf>
    AuthType Default
    Require user @SYSTEM
    Order allow,deny
    </Location>[/generic]
    … devient
    [generic]<Location /admin/conf>
    AuthType Default
    Require user @SYSTEM
    Order allow,deny
    Allow from 127.0.0.1
    Allow from 192.168.1.0/24
    </Location>[/generic]

Redémarrer le service pour prendre en compte nos modifications.
service cups restart

On peut maintenant se rendre sur l’interface web d’administration pour ajouter une imprimante. Dans mon cas ici. C’est au moyen du compte privilégié « root » que l’on pourra accéder à l’onglet d’administration. L’interface étant en français, il ne reste plus qu’à se laisser guider pour ajouter son imprimante et procéder à un test d’impression.

Copie de repertoires via Robocopy sous Windows

Pour déplacer ou effectuer une copie de manière quasi automatisée, il faut savoir qu’il existe un outil pour Windows (non disponible sur toutes les versions, mais récupérable gratuitement en allant ici).

En fonction de votre système d’exploitation, il faudra se déplacer dans l’arborescence pour aller chercher le fameux exécutable sur votre système. Dans mon cas, il a fallu que je me déplace dans le répertoire « C:Program FilesWindows Resource KitsTools » à l’aide la commande « cd » dans une invite de commande.

robocopy "F:Public" "G:Public" /e /COPYALL /r:1

Ici, le contenu du répertoire « F:Public » se verra copié dans le répertoire « G:Public ». Voici une description des options utilisées :

  • « /e » permet de rendre récursive la commande. Tout fichier ou dossier (même vide) sera copié,
  • « /COPYALL » va ajouter les propriétés des fichiers (heure, date, propriétaire, …),
  • « /r:1 » est une option qui permet de retenter la copie une fois si celle ci échoue.

Lien utile

Documentation détaillée via Technet

Migrer des imprimantes réseau à l’aide d’un script VBS

Voici une de mes réalisations dans le but de reconnecter facilement toutes les imprimantes réseaux sur des postes clients suite à un changement du plan d’adressage.

Le site Activexperts m’a pas mal aidé dans le développement de ce script VBS.

Je tiens à préciser qu’il faut être administrateur sur l’ordinateur pour pouvoir l’exécuter.

Le script a pour but de recréer un port TCP/IP local s’il trouve une concordance avec une imprimante listée dans la collection en début de script. Ainsi par exemple, si un port TCP/IP local utilise l’adresse IP 10.0.1.10, elle deviendra 192.168.1.100. Pour fonctionner, le port doit porter un nom ressemblant à « IP_10.0.1.10 » ou juste « 10.0.1.10 » sous peine de se voir exclu.

La procédure est la suivante et s’effectuera automatiquement pour chaque imprimante trouvée :

  • recherche de l’imprimante au moyen de son nom de port actuel,
  • création d’un nouveau port TCP/IP local,
  • mappage de l’imprimante sur le nouveau port,
  • suppression de l’ancien port.
'
' Script VBS permettant la reconnexion des imprimantes réseaux
' d'un ordinateur suite à un changement du plan d'adressage.
' Il faudra exécuter ce script avec une élévation de privilèges
' sous peine de se voir refuser l'accès.
'
' https://blog.lumo.fr/migrer-des-imprimantes-reseau-a-laide-dun-script-vbs.html
'

' Constants
strComputer="."
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

' Variants
Dim myPrinters(5,1)

' Filling the collection
myPrinters(0,0) = "10.0.1.10"
myPrinters(0,1) = "192.168.1.100"
myPrinters(1,0) = "10.0.1.11"
myPrinters(1,1) = "192.168.1.101"
myPrinters(2,0) = "10.0.1.12"
myPrinters(2,1) = "192.168.1.102"

' Initiate WMI
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2")

' Get collection of local printers with an IP address in the current range
' PortName can contain the string "IP_" or not
Set getPrinters = objWMI.ExecQuery("SELECT * FROM Win32_Printer WHERE Local=True AND (PortName LIKE 'IP_192.33.50.%' OR PortName LIKE '192.33.50.%')", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

' Iterate through that collection
For Each objPrinter In getPrinters
	' Display the details for each printer
	WScript.Echo "Printer Name = " & objPrinter.Name
	WScript.Echo "Current Port = " & objPrinter.PortName
	' Replace the current port name after a search into the collection myPrinters
	For aPrinter = 0 To 5
		' Deleting the string "IP_" if exists
		tempPortName = Replace(objPrinter.PortName, "IP_", "")
		' Comparaison
		If (StrComp(tempPortName, myPrinters(aPrinter,0))) = 0 Then
			Set getPorts = objWMI.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress='" & myPrinters(aPrinter,1) & "'")
			If getPorts.Count = 1 Then
				WScript.Echo "New port already exists"
			Else
				' Creating new port
				WScript.Echo "Creating new port ..."
				Set objNewPort = objWMI.Get("Win32_TCPIPPrinterPort").SpawnInstance_
				objNewPort.Name = "IP_" & myPrinters(aPrinter,1)
				objNewPort.Protocol = 1
				objNewPort.HostAddress = myPrinters(aPrinter,1)
				objNewPort.Put_
			End If
			' Now map the printer to the new port
			WScript.Echo "Mapping this printer to the new port" & VBCrLf
			objPrinter.PortName = "IP_" & myPrinters(aPrinter,1)
			objPrinter.Put_
			' Now, the old port is not in use, we can delete it
			WScript.Echo "Deleting old port ..."
			Set getPortsToDelete = objWMI.ExecQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress='" & myPrinters(aPrinter,0) & "'")
			For Each portToDelete In getPortsToDelete
				portToDelete.Delete_
			Next
		End If
	Next
Next

RFC 2606 : Noms de domaine réservés utilisables par tous

C’est en voulant mettre en place un contrôleur de domaine Active Directory que je me suis rendu compte de cela. Lors de la phase d’installation, l’assistant Microsoft propose un nom par défaut pour notre nouveau nom de domaine : « MICROSOFT.local ».

dcpromo

J’ai donc voulu faire de même en adaptant le nom tout en gardant l’extension « .local ». Or il s’avère d’après plusieurs sites sur la toile que cette extension de premier niveau n’est pas réservée. Pour l’instant on ne peut acheter un nom de domaine portant l’extension « .local », mais dans l’avenir cela pourrait bien changer et créer des conflits avec votre réseau local … Il n’est donc pas conseillé de garder cette extension.

Les sites que j’ai pu lire se rejoignent en proposant d’acheter un nom de domaine spécialement destiné à notre contrôleur de domaine, ou bien d’utiliser un sous-domaine comme « local.xxx.yyy » (où « xxx » et « yyy » correspondant à votre nom de domaine acheté chez un registar).

Il faut cependant savoir que tout comme les adresses IP privées (RFC 1918), il existe une norme qui définit des noms de domaine librement utilisables par tout le monde. Très utiles pour faire des maquettes ou des démonstrations.

Noms de domaine de premier niveau :

  • .test
  • .example
  • .invalid
  • .localhost

Noms de domaine de second niveau :

  • example.com
  • example.net
  • example.org

Liens utiles

Renommer un nom de domaine Active Directory

Si un jour l’envie de renommer le nom de domaine Active Directory vous viens à l’idée, sachez que c’est possible. L’opération reste tout de même périlleuse, car si elle échoue, elle peut rendre le contrôleur de domaine inopérant et impacter les services l’utilisant …
Attention néanmoins si vous avez un serveur Microsoft Exchange, il semblerait que ce ne soit pas possible avec cette technique. N’ayant pas de serveur Exchange, je n’ai pas poussé les recherches, mais beaucoup de sites et de personnes mentionnent avoir rencontrés des problèmes de migration.

Rendom

Microsoft met à disposition un outil en ligne de commande pour nous faciliter la tâche dans cette migration, son nom : « rendom ». Il est déjà disponible dans les versions Windows Server 2008 et 2008 R2. Pour les autres, il faudra récupérer le fichier dans le CD d’installation de Windows Server 2003.

Fichiers Rendom

La commande qui suit a pour but de générer le fichier XML « Domainlist » suivant. Vous le trouverez dans le dossier indiqué par le prompt (dans mon cas « C:\Users\Administrateur\ »).
[generic]rendom /list[/generic]

[xml]<?xml version ="1.0"?>
<Forest>
<Domain>
<!– PartitionType:Application –>
<Guid>90580e30-119d-4cc6-b7f9-1a0e2bf184dc</Guid>
<DNSname>DomainDnsZones.entreprise.invalid</DNSname>
<NetBiosName></NetBiosName>
<DcName></DcName>
</Domain>
<Domain>
<!– PartitionType:Application –>
<Guid>322ce353-89d9-41ea-ac9e-cf2abf0b1376</Guid>
<DNSname>ForestDnsZones.entreprise.invalid</DNSname>
<NetBiosName></NetBiosName>
<DcName></DcName>
</Domain>
<Domain>
<!– ForestRoot –>
<Guid>c9731862-a075-420c-8bee-f88e67474e9a</Guid>
<DNSname>entreprise.invalid</DNSname>
<NetBiosName>ENTREPRISE</NetBiosName>
<DcName></DcName>
</Domain>
</Forest>[/xml]

Il faut remplacer toutes les occurrences mentionnant l’ancien nom de domaine par le nouveau (ici, j’ai remplacé « entreprise.invalid » par « entreprise.exemple »). Ceci fait, enregistrez le fichier et constater vos modifications via la commande suivante.
[generic]rendom /showforest[/generic]

S’il y a bien concordance, nous allons pouvoir envoyer ce fichier au serveur.
[generic]rendom /upload[/generic]

Nous préparons les contrôleurs de domaine pour le renommage. Chaque contrôleur servant le nom de domaine est contacté et mis en condition.
[generic]rendom /prepare[/generic]

Lancement de la procédure de renommage.
[generic]rendom /execute[/generic]

Le serveur va redémarrer automatiquement, laissez le faire.

Nous allons pouvoir terminer par réparer les liens des stratégies de groupe (GPOs) présents dans Active Directory …
[generic]gpfixup /olddns:entreprise.invalid /newdns:entreprise.exemple[/generic]

… et si besoin la partie concernant NetBIOS si celui-ci change.
[generic]gpfixup /oldnb:entreprise.invalid/newnb:entreprise.exemple[/generic]

Attention ! Cette ultime commande est à exécuter si et seulement si tous les postes ont pris en compte le changement ! Car elle a pour but de supprimer les redirecteurs de migration (« msDS-DnsRootAlias » et « msDS-UpdateScript ») de l’ancien domaine vers le nouveau listés dans Active Directory. Si cette commande est exécutée trop tôt, elle peut empêcher les postes d’ouvrir une session utilisateur, et il faudra refaire la jonction du poste au domaine …
[generic]rendom /clean[/generic]

Vous pouvez maintenant aller dans la console de gestion DNS pour supprimer l’ancienne zone DNS devenue maintenant obsolète.

Liens utiles

Rercherche et suppression de fichier par critères sous Linux

Voici une mise en oeuvre de la commande « find » parmi tant d’autres.

Ici, je recherche tous les fichiers portant l’extension « .sql » ayant une date de création ou modification de plus de 15 jours. On peut facilement changer le dossier, la recherche, les options, ainsi que l’action à effectuer.

Voici le contenu de mon script Bash. Si vous faites comme moi, pensez à bien le rendre exécutable.

#!/bin/bash

# Suppression des sauvegardes MySQL de plus de 15 jours.
find /mnt/sauvegardes/*.sql -mtime +15 -exec rm {} ;

exit 0

Forcer un navigateur à récupérer un fichier Internet

Lors de la consultation de site sur Internet, le navigateur Internet (dit aussi « butineur ») met en cache des informations pour accélérer l’affichage d’un site lors d’une prochaine visite.
Il est aussi possible de toucher à la configuration de son serveur web (dans mon cas Apache) en activant et configurant le module « mod_expires ». Ce module permet de définir quel type de fichier est éligible à la mise en cache chez le client ainsi que la durée de conservation.

Oui mais voilà, malgré mes réglages côté serveur, la mise en cache se produit toujours de la même manière. Et n’est pas possible de toucher à la configuration côté client pour tout le monde …

Voici donc une petite alternative pour forcer le rechargement. Ici, on rajoute un morceau de chaine de caractères généré automatiquement au nom du fichier à télécharger. Le contenu du fichier restera le même, seule l’adresse va changer et passera de « http://127.0.0.1/mon_fichier.js » en « http://127.0.0.1/mon_fichier.js?ver=1338742725 ». Le numéro 1338742725 changera si une modification de contenu est faite sur le fichier, car la fonction PHP « filemtime » récupère la date de dernière modification du fichier.

Voici un exemple de mise en place de ce système dans une page PHP.

[html]<!DOCTYPE html>

<html lang="fr">

<head>
<title>Exemple</title>
<meta charset="utf-8" />
</head>

<body>
<div>
<h1>Mes fichiers</h1>
<ul>
<li><?php echo ‘<a href="mon_fichier.js?ver=’.filemtime("./mon_fichier.js").’">’; ?>Mon fichier</a></li>
</ul>
</div>
</body>

</html>[/html]