#276 Aujourd'hui à 12:23
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
mapfile -t printer_name < <(avahi-browse -d local _http._tcp -tk | grep IPv4 | gawk '/HP/ {print $4}')
Je ne peux pas tester car je n’ai qu’une vieille HP qui ne fait pas de réseau.
Mais si tu utilises gawk, tu peux te passer de grep.
Et le nom de modèle pour ta HP ici présente serait plutôt en $5 et $6.
Quelques exemples chez moi où seule la Freebox apparaît :
~$ avahi-browse -d local _http._tcp -tk
+ enp5s0 IPv4 Freebox Server _http._tcp local
~$ avahi-browse -d local _http._tcp -tk | gawk '/IPv4/ && /Freebox/ {print "réseau : "$4,$5}'
réseau : Freebox Server
~$ avahi-browse -d local _http._tcp -tk | gawk -vIGNORECASE=1 '/ipv4/ && /freebox/ {print "réseau : "$4,$5}'
réseau : Freebox Server
~$ avahi-browse -d local _http._tcp -tk | gawk -vIGNORECASE=1 '$3 == "ipv4" && /freebox/ {print "réseau : "$4,$5}'
réseau : Freebox Server
~$
-vIGNORECASE=1, c’est pour le -i de grep.
Et j’ai ajouté le texte « réseau : » pour aller avec le code actuel de la détection automatique (pour la liste à afficher le cas échéant).
Hors ligne
#277 Aujourd'hui à 15:38
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
pour la liste qui devrait s' afficher au cas ou plusieurs imprimantes sont trouvées , ne pourrait on pas faire :
# NET_printer_name= ???
declare -a printer_IP printer_name
my_IP="$(hostname -I | cut -d ' ' -f1)"
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
#printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
#echo "${printer_IP[*]}"
for p_ip in "${printer_IP[@]}"; do
if wget -E "$p_ip" -O "$tmpDir/index.html"; then
printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
#echo "printer_name == ${printer_name[*]}"
fi
done
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB") # +++++
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]##* } # ! printer_name != printerName
if [[ ${printer_name[0]} =~ "^réseau" ]]
then
IP=${printer_IP[0]}
else
usb="true"
fi
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}" # +++ l ' affichage serait OK directement , pas le cas si les 2 tableaux n ' ont pas autant d' indice chacun je suppose ?
done
while test -z "$choix"
do
read -rp "Choisissez le numero qui correspond à l’imprimante que voulez installer : " choix
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$((choix-1))]##* }"
D_IP=${printer_IP[$((choix-1))]}
if ! test "$D_IP" = "USB";then
IP="$D_IP"
fi
# if [[ ${printer_name[$((choix-1))]} =~ "^réseau" ]]
# then
# IP=${printer_IP[$((choix-1))]}
# else
# usb="true"
# fi
;;
esac
...
#check IP
if test "$D_IP" = "USB"
then
echo "Installation en USB."
else
until test -n "$IP"
...
etc
et ne mettre que : " une IP " ou USB dans le tableau printer_IP
supprimer : " reseau : " et " USB true " .
introduire une nouvelle variable de substitution : " $D(=display)_IP => D_IP temporairement à la place de "$IP" , en disant que
IP="$D_IP" si c' est une IP ?
dans la suite du code , il me semble que ca simplifierait les choses et eviterait de devoir faire des regex , est ce utile / mieux ou pas ?
qu ' en penses tu ?
sinon , j 'avais pas fait attention , mais , c' est quoi ça ? :
modelName="${printer_name[$((choix-1))]##* }"
à la fin le " ##* " ?
pour mettre la variable en majuscule ?
Dernière modification par iznobe (Aujourd'hui à 16:14)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#278 Aujourd'hui à 15:57
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Pour le awk avec avahi browse .
si on ne considere que les imprimantes de marque brother , il faudrait avoir un avahi-browse sur une brother je vais essayer en SSH sur mon pi , ca devrait le faire .
en fonction , du retour de :
avahi-browse -d local _http._tcp -tk
ou
avahi-browse -d local _http._tcp -tkp
on pourra alors aviser .
voici ce que j ' obtiens pour chacune des commandes ci-dessus :
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk
+ eth0 IPv4 mysmartwifi _http._tcp local
+ eth0 IPv6 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 Brother DCP-L3560CDW series _http._tcp local
+ lo IPv4 Brother DCP-L3560CDW series (USB) _http._tcp local
+ eth0 IPv4 smartlink _http._tcp local
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tkp
+;eth0;IPv6;Brother\032DCP-L3560CDW\032series;_http._tcp;local
+;eth0;IPv4;smartlink;_http._tcp;local
+;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local
+;eth0;IPv4;mysmartwifi;_http._tcp;local
+;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local
iznobe@k-pi3:~ $
Dernière modification par iznobe (Aujourd'hui à 16:05)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#279 Aujourd'hui à 16:00
- Watael
Re : remise au gout du jour du script de demonipuch imprimante brother
l'évaluation arithmétique est inutile : la partie entre crochet est déjà adns un "contexte arithmétique".
la substitution ne retourne que la partie de la variable après le dernier espace.
$ ar=( 'a b c' 'd e f' k l m )
$ i=2
$ echo ${ar[i-1]}
d e f
$ echo ${ar[i-1]##* }
f
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#280 Aujourd'hui à 16:02
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
l'évaluation arithmétique est inutile : la partie entre crochet est déjà adns un "contexte arithmétique".
la substitution ne retourne que la partie de la variable après le dernier espace.
Merci Watael pour l' explication .
si il n' y a pas d' espace ? et il ne devrait pas y en avoir dans le nom du modele justement ...
EDIT : je me réponds :
ok , et bien en fait ca ne sert à rien quand pas de dernier espace , puisque :
iznobe@iznobe-pc:~$ ar=( 'abc' 'def' klm )
iznobe@iznobe-pc:~$ i=2
iznobe@iznobe-pc:~$ echo ${ar[i-1]}
def
iznobe@iznobe-pc:~$ echo ${ar[i-1]##* }
def
iznobe@iznobe-pc:~$
Dernière modification par iznobe (Aujourd'hui à 16:18)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#281 Aujourd'hui à 16:06
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
bon , ca va apporter de la confusion mon histoire .
juste j' ajoute USB au tableau printer_IP pour l' affichage et ne touche pas au reste pour le moment .
ce qui donne ( avant modification avahi ) :
#!/bin/bash -x
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
# définitions de variables
# gestion des arguments
# infos Brother
# quelques fonctions
# quelques vérifications
# initialisation du tableau associatif `printer'
# vérification de variables disponibles dans `printer'
# préparation du système
# téléchargement des pilotes
# configuration de l'imprimante
# configuration du scanner
# <
shopt -s extglob nullglob globstar
############################
# définitions de variables
############################
if test -f /etc/lsb-release
then
. /etc/lsb-release
DistroName="$DISTRIB_ID"
VersionYear="${DISTRIB_RELEASE::2}"
codeName="$DISTRIB_CODENAME"
elif test -f /usr/lib/os-release
then
. /usr/lib/os-release
DistroName="$NAME"
VersionYear="${VERSION_ID::2}"
codeName="$VERSION_CODENAME"
fi
user="$SUDO_USER"
arch="$(uname -m)"
date=$(date +%F_%T)
tmpDir="/tmp/packages"
Logfile="/home/$user/brprinter_install.log"
libDir="/usr/lib/$arch-linux-gnu"
declare -A printer
declare -i err
#################
# infos Brother
#################
# ancienne adresse d' obtention des infos :
#Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# nouvelle adresse :
Url_Info="https://download.brother.com/pub/com/linux/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages"
#Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages" # ancienne adresse d'obtention des paquets
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
#Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=${printerName}_us_eu_as"
#######################
# quelques fonctions #
#######################
errQuit()
{
>&2 echo "$@"
exit 1
}
verif_lien()
{ # pour faire un boucle, suffit-il vérifier que le nombre d'arguments est pair ?
local lien=$1 cible=$2
if ! test -L "$lien"
then
ln -s "$cible" "$lien"
fi
}
install_pkg()
{
for pkg do
if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
then
apt-get install -qq "$pkg"
fi
done
}
###########################
# quelques vérifications #
###########################
if test "$DistroName" != "Ubuntu"; then errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."; fi
if test "$SHELL" != "/bin/bash"; then errQuit "Shell non compatible. utilisez : bash"; fi
if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi
# if [[ $arch != @(i386|i686|x86_64) ]]
if ((EUID)); then errQuit "Vous devez lancer le script en root : sudo $0"; fi
if ! nc -z -w5 'brother.com' 80; then errQuit "le site \"brother.com\" n'est pas joignable."; fi
######################
# prérequis pour le script #
######################
apt-get update -qq
# script : "wget" "nmap" "libxml2-utils" " gawk"
# imprimantes : "multiarch-support" "lib32stdc++6" "cups"
# scanner : "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
install_pkg "wget" "nmap" "libxml2-utils" "gawk"
if ! test -d "$tmpDir"
then
mkdir -pv "$tmpDir"
fi
declare -u modelName=$1
if test -z "$modelName"
then
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
declare -a printer_IP printer_name
my_IP="$(hostname -I | cut -d ' ' -f1)"
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
#printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
#echo "${printer_IP[*]}"
for p_ip in "${printer_IP[@]}"; do
if wget -E "$p_ip" -O "$tmpDir/index.html"; then
printer_name+=( "réseau : $(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
#echo "printer_name == ${printer_name[*]}"
fi
done
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "usb : $p_usb" )
printer_IP+=("USB")
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
if [[ ${printer_name[0]} =~ "^réseau" ]]
then
IP=${printer_IP[0]}
else
usb="true"
fi
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numero qui correspond à l’imprimante que voulez installer : " choix
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$((choix-1))]}"
if [[ ${printer_name[$((choix-1))]} =~ "^réseau" ]]
then
IP=${printer_IP[$((choix-1))]}
else
usb="true"
fi
;;
esac
#else
##########################
# gestion des arguments #
##########################
# if test -n "$modelName"; then
# modelName="${modelName^^}"
# else
# declare -u modelName=$1
# fi
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
#check IP
if test "$usb" = "true"
then
echo "Installation en USB."
else
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
err=0
unset IP
fi
done
fi
###################################################
# initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
F_P_fichier_Info="$tmpDir/$printerName.info"
wget -q "$Url_PrinterInfo" -O "$F_P_fichier_Info"
if ! test "$(grep PRINTERNAME "$F_P_fichier_Info" | cut -d= -f2)" == "$printerName"
then
errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
elif test "$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"; then
Url_PrinterInfo="$Url_Info/$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"
fi
#echo "$Url_PrinterInfo"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
#########################################################
# vérification de variables disponibles dans `printer' #
#########################################################
if test -n "${printer[SCANNER_DRV]}"
then
install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
printer[udev_rules]="$Udev_Deb_Name"
. <(wget -qO- "$Url_Info/${printer[SCANNER_DRV]}.lnk" | sed -n '/^DEB/s/^/scanner_/p')
. <(wget -qO- "$Url_Info/${printer[SCANKEY_DRV]}.lnk" | sed -n '/^DEB/s/^/scanKey_/p')
printer[SCANNER_DRV]="$scanner_DEB64"
printer[SCANKEY_DRV]="$scanKey_DEB64"
if test -n "$VersionYear"; then
if (( VersionYear >= 24 )) && test "${printer[SCANKEY_DRV]}" = 'brscan-skey-0.3.2-0.amd64.deb'
then
printer[SCANKEY_DRV]="$Scankey_Drv_Deb_Name"
fi
else
errQuit "Impossible d’évaluer la version de la distribution."
fi
else
err+="1"
echo "Pas de pilote pour le scanner."
fi
###########################
# préparation du système #
###########################
# a remettre le script en service
# if test -f "$Logfile"; then
# Old_Date="$(head -n1 "$Logfile")"
# mv -v "$Logfile" "$Logfile"."$Old_Date".log
# fi
# echo "$date" >> "$Logfile" # indispensable pour la rotation du log .
install_pkg "multiarch-support" "lib32stdc++6" "cups"
for d in "/usr/share/cups/model" "/var/spool/lpd"
do
if ! test -d "$d"
then
mkdir -pv "$d"
fi
done
for i in \
DCP-{11{0,5,7}C,120C,31{0,5}CN,340CW} \
FAX-{18{15,20,35,40}C,19{2,4}0CN,2440C} \
MFC-{21{0,5}C,32{2,4}0C,33{2,4}0CN,3420C,3820CN,4{1,2}0CN,425CN,5440CN,5840CN,620CN,640CW,820CW}
do
if test "$i" = "$modelName"
then
install_pkg "csh"
fi
done
for i in \
DCP-{1{0,4}00,80{{20,25D},{40,45D},{60,65DN}}} \
FAX-{2{850,900},3800,4{100,750e},5750e} \
HL-{1{030,230,2{4,5}0,270N,4{3,4,5}0,470N,650,670N,850,870N},5{0{3,4,5}0,070N,1{3,4}0,150D,170DN,240,2{5,7}0DN,280DW},6050{,D}} \
MFC-{4800,6800,8{4{20,40,60N},500,660DN,8{20D,40D,60DN,70DW}},9{0{3,7}0,1{6,8}0,420CN,660,7{0,6}0,8{0,6,8}0}}
do
if test "$i" = "$modelName"
then
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
if test -L /sbin/init
then
verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
###############################
# téléchargement des pilotes #
###############################
#echo " DL DRV TAB == ${printer[*]}"
for drv in "${printer[@]}"
do
if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
for addr in "$Url_Pkg"
do
if ! test -f "$tmpDir/$drv"
then
Url_Deb="$Url_Pkg/$drv"
if test "$drv" = "${printer[udev_rules]}"
then
Url_Deb="$Udev_Deb_Url/$drv"
fi
wget -cP "$tmpDir" "$Url_Deb"
else
break
fi
done
pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
errQuit "Rien à installer."
else
dpkg --install --force-all "${pkg2install[@]}"
fi
##################################
# configuration de l'imprimante #
##################################
#retrouver le fichier `.ppd' pour l'imprimante
for drv in "PRN_CUP_DEB" "PRN_DRV_DEB"
do
pkg=${printer[$drv]}
#echo "pkg == $pkg"
if test -n "$pkg" -a -f "$tmpDir/$pkg"
then
while read -rd '' fileName # avec ou sans option " r " ?
do
PPDs+=( "$fileName" )
done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub(".","",$NF); print $NF}')
fi
done
#echo "PPDs == ${PPDs[*]}"
if test -z "$Ppd_File"
then
PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
0) echo "no ppd"
err+="1"
;;
1) echo one ppd
Ppd_File=${PPDs[0]}
;;
*) err+="1"
echo "more than one ppd"
Ppd_File=${PPDs[0]}
;;
esac
cp /etc/cups/printers.conf.O /etc/cups/printers.conf "$tmpDir"
systemctl restart cups
sleep 1
if test -n "$IP"
then
lpadmin -p "$modelName" -E -v "lpd://$IP/binary_p1" -P "$Ppd_File"
else
lpadmin -p "$modelName" -E -v 'usb://dev/usb/lp0' -P "$Ppd_File"
fi
#############################
# configuration du scanner #
#############################
if test -z "$IP"
then #USB
if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
then
echo " - Règle udev deja presente dans le fichier $Udev_Rules"
else
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
udevadm control --reload-rules
fi
else #network
for saneConf in /usr/bin/brsaneconfig{,{2..5}}
do
test -x "$saneConf" && cmd=$saneConf
done
if test -z "$cmd"
then
errQuit "no brsaneconfig found."
elif test "$cmd" = '/usr/bin/brsaneconfig4'
then
sed -i '/Support Model/a\
0x029a, 117, 1, "MFC-8690DW", 133, 4\
0x0279, 14, 2, "DCP-J525W"\
0x027b, 13, 2, "DCP-J725DW"\
0x027d, 13, 2, "DCP-J925DW"\
0x027f, 14, 1, "MFC-J280W"\
0x028f, 13, 1, "MFC-J425W"\
0x0281, 13, 1, "MFC-J430W"\
0x0280, 13, 1, "MFC-J435W"\
0x0282, 13, 1, "MFC-J625DW"\
0x0283, 13, 1, "MFC-J825DW"\
0x028d, 13, 1, "MFC-J835DW"' /opt/brother/scanner/brscan4/Brsane4.ini
fi
$cmd -a name=SCANNER model="$modelName" ip="$IP"
fi
if test -d "$libDir"
then
case $cmd in
/usr/bin/brsaneconfig)
cd "$libDir" || exit;
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
ln -sf libbrscandec.so.1 libbrscandec.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
ln -sf libsane-brother.so.1 libsane-brother.so
;;
/usr/bin/brsaneconfig2)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
ln -sf libsane-brother2.so.1 libsane-brother2.so
;;
/usr/bin/brsaneconfig3)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
ln -sf libsane-brother3.so.1 libsane-brother3.so
;;
/usr/bin/brsaneconfig4)
cd "$libDir"/sane || exit
ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
ln -sf libsane-brother4.so.1 libsane-brother4.so
;;
/usr/bin/brsaneconfig5)
cd "$libDir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
;;
esac
fi
github actualisé .
Dernière modification par iznobe (Aujourd'hui à 16:42)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#282 Aujourd'hui à 16:45
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
# +++ l ' affichage serait OK directement , pas le cas si les 2 tableaux n ' ont pas autant d' indice chacun je suppose ?
Je n’y avais pas pensé mais, dans la mesure où on renseigne d’abord les éventuelles imprimantes réseau, les imprimantes USB sont en fin de liste. Il ne devrait donc pas y avoir de problème.
qu ' en penses tu ?
C’est faisable mais je ne vois pas vraiment où le code est plus simple à part qu’on s’affranchit de la variable usb.
Il faudrait aussi modifier le cas d’une seule imprimante et on peux se passer de la variable $D_IP :
…
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
declare -a printer_IP printer_name
my_IP="$(hostname -I | cut -d ' ' -f1)"
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
#printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
#echo "${printer_IP[*]}"
for p_ip in "${printer_IP[@]}"; do
if wget -E "$p_ip" -O "$tmpDir/index.html"; then
# version robuste :
printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
#echo "printer_name == ${printer_name[*]}"
fi
done
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=( "USB" )
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
IP=${printer_IP[0]}
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numero qui correspond à l’imprimante que voulez installer : " choix
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[choix-1]}"
IP=${printer_IP[choix-1}
else
usb="true"
fi
;;
esac
#else
##########################
# gestion des arguments #
##########################
# if test -n "$modelName"; then
# modelName="${modelName^^}"
# else
# declare -u modelName=$1
# fi
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
#check IP
if test "$IP" = "USB"
then
echo "Installation en USB."
else
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
err=0
unset IP
fi
done
fi
###################################################
# initialisation du tableau associatif `printer' #
###################################################
…
sinon , j 'avais pas fait attention , mais , c' est quoi ça ? :
modelName="${printer_name[$((choix-1))]##* }"
à la fin le " ##* " ?
pour mettre la variable en majuscule ?
C’était pour effacer le suffixe (réseau ou usb) que j’avais ajouté.
Dernière modification par nany (Aujourd'hui à 20:14)
Hors ligne
#283 Aujourd'hui à 16:58
- lynn
Re : remise au gout du jour du script de demonipuch imprimante brother
Dans le script, j'ai du mal à comprendre comment la ligne suivante peut donner un résultat pertinent :
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
En adaptant à mon I.P et en enlevant le filtre bien sur, la commande suivante
sudo nmap -sn -oG - 192.138.0.38/24
me renvoie ça :
# Nmap 7.95 scan initiated Sun Aug 17 16:33:55 2025 as: nmap -sn -oG - 192.138.0.38/24
Host: 192.138.0.1 () Status: Up
Host: 192.138.0.2 () Status: Up
Host: 192.138.0.8 () Status: Up
Host: 192.138.0.9 () Status: Up
Host: 192.138.0.12 () Status: Up
Host: 192.138.0.45 () Status: Up
Host: 192.138.0.238 () Status: Up
Host: 192.138.0.239 () Status: Up
Host: 192.138.0.255 () Status: Up
# Nmap done at Sun Aug 17 16:34:03 2025 -- 256 IP addresses (9 hosts up) scanned in 7.97 seconds
Il n'y a pas de trace d'un quelconque nom d'imprimante... Est-ce que l'I.P est vraiment importante du moment qu'on arrive à déterminer le modèle de l'imprimante existant ?
Autrement, il y a également lpstat qui donne des infos sur le modèle :
lpstat -a
Canon_MF620C_Series accepte des requêtes depuis dim. 17 août 2025 15:59:36
lpstat -v
matériel pour Canon_MF620C_Series : implicitclass://Canon_MF620C_Series/
Et aussi arp-scan qui donnera une liste d'I.P dont celle de l'imprimante mais sans nommer implicitement la marque (mes adresses MAC sont masqués):
sudo arp-scan -q --localnet
Interface: eno1, type: EN10MB, MAC: xx:xx:xx:xx:xx:xx, IPv4: 192.168.0.38
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.0.27 xx:xx:xx:xx:xx:xx
192.168.0.44 xx:xx:xx:xx:xx:xx
192.168.0.1 xx:xx:xx:xx:xx:xx
192.168.0.9 xx:xx:xx:xx:xx:xx
192.168.0.28 xx:xx:xx:xx:xx:xx
192.168.0.7 xx:xx:xx:xx:xx:xx
192.168.0.39 xx:xx:xx:xx:xx:xx
192.168.0.47 xx:xx:xx:xx:xx:xx
192.168.0.10 xx:xx:xx:xx:xx:xx
192.168.0.254 xx:xx:xx:xx:xx:xx
192.168.0.6 xx:xx:xx:xx:xx:xx
11 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.868 seconds (137.04 hosts/sec). 11 responded
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#284 Aujourd'hui à 17:09
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Curieusement , avec avahi , on obtient aussi la brother en USB :
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk
+ eth0 IPv6 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 smartlink _http._tcp local
+ eth0 IPv4 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 mysmartwifi _http._tcp local
+ lo IPv4 Brother DCP-L3560CDW series (USB) _http._tcp local
iznobe@k-pi3:~ $
du coup , je ne sais pas trop quoi faire :
+ me baser sur " IPv6 " pour n' en avoir qu ' une ?
+ vérifier en + si le champ (USB) est présent ? peut etre qu on pourrait se passer du coup de " lsusb" , a voir / vérifier .
+ vérifier les 2 1ers champs en + ... ce qui serait le plus judicieux certainement et le plus long .
bon , c' est pas gagné pour avahi-browse :
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk
+ eth0 IPv6 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 smartlink _http._tcp local
+ eth0 IPv4 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 mysmartwifi _http._tcp local
+ lo IPv4 Brother DCP-L3560CDW series (USB) _http._tcp local
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk | gawk '/IPv4/ && /Brother/ {print "réseau : "$5}'avahi-resolve -n -4 "$host".local | cut -c1-"${#host}" + 6)
bash: erreur de syntaxe près du symbole inattendu « ) »
iznobe@k-pi3:~ $ avahi-resolve -n -4 "$host".local | cut -c1-"${#host}" + 6)
bash: erreur de syntaxe près du symbole inattendu « ) »
iznobe@k-pi3:~ $ avahi-resolve -n -4 "$host".local | cut -c1-"${#host}" + 6
cut: intervalle décroissant incorrect
Saisissez « cut --help » pour plus d'informations.
Failed to create host name resolver: Invalid host name
iznobe@k-pi3:~ $ host=Brother
iznobe@k-pi3:~ $ avahi-resolve -n -4 "$host".local | cut -c1-"${#host}" + 6
cut: +: Aucun fichier ou dossier de ce type
cut: 6: Aucun fichier ou dossier de ce type
Failed to resolve host name 'Brother.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "$host".local
Failed to resolve host name 'Brother.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 'Brother DCP-L3560CDW'.local
Failed to resolve host name 'Brother DCP-L3560CDW.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "Brother DCP-L3560CDW".local
Failed to resolve host name 'Brother DCP-L3560CDW.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "Brother".local
Failed to resolve host name 'Brother.local': Timeout reached
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#285 Aujourd'hui à 17:11
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
voici ce que j ' obtiens pour chacune des commandes ci-dessus :
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk + eth0 IPv4 mysmartwifi _http._tcp local + eth0 IPv6 Brother DCP-L3560CDW series _http._tcp local + eth0 IPv4 Brother DCP-L3560CDW series _http._tcp local + lo IPv4 Brother DCP-L3560CDW series (USB) _http._tcp local + eth0 IPv4 smartlink _http._tcp local iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tkp +;eth0;IPv6;Brother\032DCP-L3560CDW\032series;_http._tcp;local +;eth0;IPv4;smartlink;_http._tcp;local +;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local +;eth0;IPv4;mysmartwifi;_http._tcp;local +;lo;IPv4;Brother\032DCP-L3560CDW\032series\032\040USB\041;_http._tcp;local iznobe@k-pi3:~ $
avahi-browse -d local _http._tcp -tk | gawk '/IPv4/ && /Brother/ && !/USB/ {print $5}'
?
Hors ligne
#286 Aujourd'hui à 17:19
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Dans le script, j'ai du mal à comprendre comment la ligne suivante peut donner un résultat pertinent :
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
En adaptant à mon I.P et en enlevant le filtre bien sur, la commande suivante
sudo nmap -sn -oG - 192.138.0.38/24
me renvoie ça :
# Nmap 7.95 scan initiated Sun Aug 17 16:33:55 2025 as: nmap -sn -oG - 192.138.0.38/24 Host: 192.138.0.1 () Status: Up Host: 192.138.0.2 () Status: Up Host: 192.138.0.8 () Status: Up Host: 192.138.0.9 () Status: Up Host: 192.138.0.12 () Status: Up Host: 192.138.0.45 () Status: Up Host: 192.138.0.238 () Status: Up Host: 192.138.0.239 () Status: Up Host: 192.138.0.255 () Status: Up # Nmap done at Sun Aug 17 16:34:03 2025 -- 256 IP addresses (9 hosts up) scanned in 7.97 seconds
Il n'y a pas de trace d'un quelconque nom d'imprimante...
Je suppose qu’une imprimante Brother affiche quelque chose comme
Host: xx.xx.xx.xx (Brother) Status: Up
Est-ce que l'I.P est vraiment importante du moment qu'on arrive à déterminer le modèle de l'imprimante existant ?
Oui, l’IP est nécessaire pour l’installation en réseau.
Hors ligne
#287 Aujourd'hui à 17:22
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
j'ai du mal à comprendre comment la ligne suivante peut donner un résultat pertinent :
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
Pour que le nom de l ' imprimante apparaisse , il faut que celle-ci puisse être jointe via son IP:80 ( un serveur web auto-hebergé par l' imprimante pour fournir le status et diverses infos + parfois certains reglages .
Si ton imprimante ne possède pas cette fonction elle n ' apparaît donc pas dans le retour de nmap , ni dans celui de xmlint .
Apres , forcément , si une imprimante ne " divulgue " pas son nom m/DNS sur le réseau ( hostname ) , il sera impossible de l ' identifier ( ou je ne sais pas faire en tout cas ) .
C ' est pour ça que malgré la détection automatique ( qui est toujours en cours de construction ) , il reste la possibilité de rentrer les infos à la main , comme au bon vieux temps
Dernière modification par iznobe (Aujourd'hui à 17:58)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#288 Aujourd'hui à 17:29
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
avahi-browse -d local _http._tcp -tk | gawk '/IPv4/ && /Brother/ && !/USB/ {print $5}'
?
Parfait !
Reste que je n' arrive pas a trouver l' ip avec la commande :
avahi-resolve -n -4 "$host".local
dejà il faudrait arriver a savoir quel est le nom d' hote precisément ... pour le mettre dans "$host" .
mes derniers essais ne sont pas concluant , peut etre je m' y prends mal :
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tk
+ eth0 IPv6 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 smartlink _http._tcp local
+ eth0 IPv4 Brother DCP-L3560CDW series _http._tcp local
+ eth0 IPv4 mysmartwifi _http._tcp local
+ lo IPv4 Brother DCP-L3560CDW series (USB) _http._tcp local
iznobe@k-pi3:~ $ avahi-resolve -n -4 "mysmartwifi".local
mysmartwifi.local 192.168.1.1
iznobe@k-pi3:~ $ avahi-resolve -n -4 "smartlink".local
smartlink.local 192.168.1.49
iznobe@k-pi3:~ $ avahi-resolve -n -4 "Brother DCP-L3560CDW series".local
Failed to resolve host name 'Brother DCP-L3560CDW series.local': Timeout reached
iznobe@k-pi3:~ $
iznobe@k-pi3:~ $ avahi-resolve -n -4 'Brother DCP-L3560CDW'.local
Failed to resolve host name 'Brother DCP-L3560CDW.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "Brother DCP-L3560CDW".local
Failed to resolve host name 'Brother DCP-L3560CDW.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "Brother".local
Failed to resolve host name 'Brother.local': Timeout reached
iznobe@k-pi3:~ $ avahi-resolve -n -4 "DCP-L3560CDW".local
Failed to resolve host name 'DCP-L3560CDW.local': Timeout reached
il doit exister d' autre façons de faire .
Dernière modification par iznobe (Aujourd'hui à 17:32)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#289 Aujourd'hui à 17:42
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ok , bon , ca me parait pas si simple au final d' utiliser avahi ...
j ' ai pas explorer toutes les options , mais pour mon imprimante HP chez moi par exemple :
iznobe@iznobe-pc:~$ avahi-browse -art | grep -i hp
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _uscans._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _uscans._tcp local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _privet._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _privet._tcp local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Secure Internet Printer local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Secure Internet Printer local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _uscan._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _uscan._tcp local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _http-alt._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _http-alt._tcp local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _scanner._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _scanner._tcp local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Web Site local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Web Site local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Internet Printer local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Internet Printer local
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] PDL Printer local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] PDL Printer local
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] PDL Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "mac=50:81:40:13:9f:3c" "priority=40" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] PDL Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "mac=50:81:40:13:9f:3c" "priority=40" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Internet Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "Fax=F" "TLS=1.2" "note=" "adminurl=http://HP508140139F3C.local./#hId-pgAirPrint" "mac=50:81:40:13:9f:3c" "priority=20" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "URF=CP1,MT1-2-8-9-10-11,PQ3-4-5,RS300,SRGB24,OB9,OFU0,W8-16,DEVW8-16,DEVRGB24-48,ADOBERGB24-48,FN3,IS1,V1.4" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "rp=ipp/print" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Web Site local
hostname = [HP508140139F3C.local]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _scanner._tcp local
hostname = [HP508140139F3C.local]
txt = ["feeder=T" "flatbed=T" "button=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "mdl=DeskJet 3700 series" "mfg=HP" "ty=HP DeskJet 3700 series" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _http-alt._tcp local
hostname = [HP508140139F3C.local]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _uscan._tcp local
hostname = [HP508140139F3C.local]
txt = ["duplex=F" "is=adf" "cs=binary,color,grayscale" "rs=eSCL" "representation=images/printer.png" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "ty=HP DeskJet 3700 series" "pdl=application/octet-stream,application/pdf,image/jpeg" "vers=2.5" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] Secure Internet Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "Fax=F" "TLS=1.2" "note=" "adminurl=http://HP508140139F3C.local./#hId-pgAirPrint" "mac=50:81:40:13:9f:3c" "priority=30" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "URF=CP1,MT1-2-8-9-10-11,PQ3-4-5,RS300,SRGB24,OB9,OFU0,W8-16,DEVW8-16,DEVRGB24-48,ADOBERGB24-48,FN3,IS1,V1.4" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "rp=ipp/print" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _privet._tcp local
hostname = [HP508140139F3C.local]
txt = ["cs=offline" "id=" "type=printer" "url=https://www.google.com/cloudprint" "note=" "ty=HP DeskJet 3700 series [139F3C]" "txtvers=1"]
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _uscans._tcp local
hostname = [HP508140139F3C.local]
txt = ["duplex=F" "is=adf" "cs=binary,color,grayscale" "rs=eSCL" "representation=images/printer.png" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "ty=HP DeskJet 3700 series" "pdl=application/octet-stream,application/pdf,image/jpeg" "vers=2.5" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Internet Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "Fax=F" "TLS=1.2" "note=" "adminurl=http://HP508140139F3C.local./#hId-pgAirPrint" "mac=50:81:40:13:9f:3c" "priority=20" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "URF=CP1,MT1-2-8-9-10-11,PQ3-4-5,RS300,SRGB24,OB9,OFU0,W8-16,DEVW8-16,DEVRGB24-48,ADOBERGB24-48,FN3,IS1,V1.4" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "rp=ipp/print" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Web Site local
hostname = [HP508140139F3C.local]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _scanner._tcp local
hostname = [HP508140139F3C.local]
txt = ["feeder=T" "flatbed=T" "button=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "mdl=DeskJet 3700 series" "mfg=HP" "ty=HP DeskJet 3700 series" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _http-alt._tcp local
hostname = [HP508140139F3C.local]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _uscan._tcp local
hostname = [HP508140139F3C.local]
txt = ["duplex=F" "is=adf" "cs=binary,color,grayscale" "rs=eSCL" "representation=images/printer.png" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "ty=HP DeskJet 3700 series" "pdl=application/octet-stream,application/pdf,image/jpeg" "vers=2.5" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] Secure Internet Printer local
hostname = [HP508140139F3C.local]
txt = ["Scan=T" "Duplex=F" "Color=T" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "Fax=F" "TLS=1.2" "note=" "adminurl=http://HP508140139F3C.local./#hId-pgAirPrint" "mac=50:81:40:13:9f:3c" "priority=30" "usb_MDL=DeskJet 3700 series" "usb_MFG=HP" "product=(HP DeskJet 3700 series)" "ty=HP DeskJet 3700 series" "URF=CP1,MT1-2-8-9-10-11,PQ3-4-5,RS300,SRGB24,OB9,OFU0,W8-16,DEVW8-16,DEVRGB24-48,ADOBERGB24-48,FN3,IS1,V1.4" "kind=document,envelope,photo,postcard" "PaperMax=legal-A4" "rp=ipp/print" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf,image/pwg-raster" "qtotal=1" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _privet._tcp local
hostname = [HP508140139F3C.local]
txt = ["cs=offline" "id=" "type=printer" "url=https://www.google.com/cloudprint" "note=" "ty=HP DeskJet 3700 series [139F3C]" "txtvers=1"]
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _uscans._tcp local
hostname = [HP508140139F3C.local]
txt = ["duplex=F" "is=adf" "cs=binary,color,grayscale" "rs=eSCL" "representation=images/printer.png" "UUID=5066d230-9605-d800-e402-f2a1cf0fc11a" "note=" "adminurl=http://HP508140139F3C.local." "ty=HP DeskJet 3700 series" "pdl=application/octet-stream,application/pdf,image/jpeg" "vers=2.5" "txtvers=1"]
iznobe@iznobe-pc:~$ avahi-resolve -n -4 HP508140139F3C.local
HP508140139F3C.local 192.168.1.112
iznobe@iznobe-pc:~$
EDIT :
ok , il faut simplement " resoudre " les noms d' hotes :
iznobe@iznobe-pc:~$ avahi-browse -d local _http._tcp -tkr
+ enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _http._tcp local
+ enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _http._tcp local
= enp2s0 IPv4 HP DeskJet 3700 series [139F3C] _http._tcp local
hostname = [HP508140139F3C.local]
address = [192.168.1.112]
port = [80]
txt = []
= enp2s0 IPv6 HP DeskJet 3700 series [139F3C] _http._tcp local
hostname = [HP508140139F3C.local]
address = [192.168.1.112]
port = [80]
txt = []
iznobe@iznobe-pc:~$
et on a tout d' un coup en " human readable " .
et la version a utiliser en script , on y ajoute l' option parsé ( -p ) :
iznobe@iznobe-pc:~$ avahi-browse -d local _http._tcp -tkrp
+;enp2s0;IPv6;HP\032DeskJet\0323700\032series\032\091139F3C\093;_http._tcp;local
+;enp2s0;IPv4;HP\032DeskJet\0323700\032series\032\091139F3C\093;_http._tcp;local
=;enp2s0;IPv4;HP\032DeskJet\0323700\032series\032\091139F3C\093;_http._tcp;local;HP508140139F3C.local;192.168.1.112;80;
=;enp2s0;IPv6;HP\032DeskJet\0323700\032series\032\091139F3C\093;_http._tcp;local;HP508140139F3C.local;192.168.1.112;80;
iznobe@iznobe-pc:~$
du coup il faut modifier le Field Separator dans gawk ? et ajuster le tir pour extraire l ' IP et le nom du modele de l' imprimante ?
Au secours
la " vraie " commande et son retour , si une bon âme passe par là pour me faire ce machin svp
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tkrp | gawk '/IPv4/ && /Brother/ && !/USB/'
+;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local
=;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80;
iznobe@k-pi3:~ $
la ligne a ciblée commence par le " = " , ce qui indique que l' IP a étée resolue .
Dernière modification par iznobe (Aujourd'hui à 18:10)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#290 Aujourd'hui à 18:49
- lynn
Re : remise au gout du jour du script de demonipuch imprimante brother
Une autre approche avec nmap :
On récupère les I.Ps actives :
mapfile -t activeIPs < <(nmap -p 80,443 --open 192.168.0.0/24 -oG - | awk '/\/open/ && !/^#/{print $2}')
Et on va à la pêche aux infos en fonction de ces seules I.P :
for ip in "${activeIPs[@]}"; do
# On vérifie si il y a des occurrences de la marque sur la page
if wget -qO- --no-check-certificate --timeout=1 "http://$ip" 2>/dev/null | grep -qi "browser"; then
# On récupère le modèle dans le titre, puis affichage du modèle et de l'I.P
title=$(wget -qO- --no-check-certificate --timeout=1 "http://$ip" 2>/dev/null | awk -F'[<>]' '/<title>/ {print $3}')
model=$(echo "$title" | awk -F': ' '{print $NF}')
echo "I.P : $ip"
echo "Modèle : $model"
break
fi
done
Ça fonctionne chez moi avec une Canon, je ne peux pas tester avec une Browser... il faudra peut-être adapter !?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#291 Aujourd'hui à 19:07
- diesel
Re : remise au gout du jour du script de demonipuch imprimante brother
Chez moi :
jean-marie@jean-marie:~$ avahi-resolve --name -6 $(avahi-browse -aprt | grep ^= | grep IPv6 | grep Brother | grep -v Web | cut -d";" -f7)
BRNB42200CCEABC.local fe80::b622:ff:fecc:eabc
jean-marie@jean-marie:~$
ou
jean-marie@jean-marie:~$ avahi-resolve --name -4 $(avahi-browse -aprt | grep ^= | grep IPv6 | grep Brother | grep -v Web | cut -d";" -f7)
BRNB42200CCEABC.local 192.168.0.66
jean-marie@jean-marie:~$
Facile, non ?
Oui, je sais, on n'est pas obligé de piper les grep.
Amicalement.
Jean-Marie
Dernière modification par diesel (Aujourd'hui à 19:21)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#292 Aujourd'hui à 19:44
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
la " vraie " commande et son retour , si une bon âme passe par là pour me faire ce machin svp
iznobe@k-pi3:~ $ avahi-browse -d local _http._tcp -tkrp | gawk '/IPv4/ && /Brother/ && !/USB/' +;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local =;eth0;IPv4;Brother\032DCP-L3560CDW\032series;_http._tcp;local;BRN94DDF80CF268.local;192.168.1.84;80; iznobe@k-pi3:~ $
la ligne a ciblée commence par le " = " , ce qui indique que l' IP a étée resolue .
Sans les grep | grep | grep… :
avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4,$8}'
Hors ligne
#293 Aujourd'hui à 20:00
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
ça fonctionne nickel @nany
a la place de " print $4,$8 ", est il possible de mettre le contenu dans une variable ?
si non , comment je peux faire pour le coup ?
@lynn , le problème avec nmap ( bien que ca me semble plus simple ) , c' est que tout de même assez long entre 5 et 10 secondes environ selon les machines / réseaux ...
alors que avec avahi , c' est pratiquement instantané
D' ailleurs le code en place fonctionne à merveille , mais trop long ...
@diesel , je dois recuperer le nom du modèle de l' imprimante et son IP .
le " hostname " n ' était qu ' un intermédiaire pour recuperer l' IP , si on peut s' en passer , c' est encore mieux .
Dernière modification par iznobe (Aujourd'hui à 20:05)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#294 Aujourd'hui à 20:15
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
bon , je viens de tester l' affichage de la liste sur mon pi ( il a fallu modifié quelques vérifications ) , avec nmap , tres long a afficher le retour mais voilà ce que ça donne :
iznobe@k-pi3:~ $ sudo bash Watael.script.sh
--2025-08-17 20:12:30-- http://192.168.1.84/
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 301 Moved Permanently
Emplacement : /home/status.html [suivant]
--2025-08-17 20:12:30-- http://192.168.1.84/home/status.html
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 5138 (5,0K) [text/html]
Sauvegarde en : « /tmp/packages/index.html »
/tmp/packages/index.ht 100%[===========================>] 5,02K --.-KB/s ds 0s
2025-08-17 20:12:30 (17,7 MB/s) — « /tmp/packages/index.html » sauvegardé [5138/5138]
Plusieurs imprimantes ont été détectées.
1 ⇒ réseau : : 192.168.1.84
2 ⇒ usb : DCP-L3560CDW : USB
Choisissez le numero qui correspond à l’imprimante que voulez installer : 2
USB : DCP-L3560CDW
iznobe@k-pi3:~ $
Du coup on est vraiment pas mal pour la détection auto !
seul " hic " on a pas le nom du modèle .
EDIT , en fait le paquet libxml2-utils n ' a pas été installé , surement pour cela que le nom du modele ne s' est pas affiché .
Dernière modification par iznobe (Aujourd'hui à 20:38)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#295 Aujourd'hui à 20:16
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
a la place de " print $4,$8 ", est il possible de mettre le contenu dans une variable ?
Un truc dans le genre :
printer_name_ip=( $(avahi-browse -d local _http._tcp -tkrp | gawk -F';' '/^=/ && /IPv4/ && /Brother/ && !/USB/ {sub(/Brother\\032/,"",$4); sub(/\\032.*/,"",$4); print $4,$8}') )
modelName="${printer_name_ip[0]}"
IP=${printer_name_ip[1]}
?
Bien sûr, il faut adapter en cas de présence de plusieurs imprimantes.
Dernière modification par nany (Aujourd'hui à 20:17)
Hors ligne
#296 Aujourd'hui à 20:19
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
oui , mais je sens que ca va pas etre si simple que ce qui est deja en place ...
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#297 Aujourd'hui à 21:20
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
iznobe a écrit :# +++ l ' affichage serait OK directement , pas le cas si les 2 tableaux n ' ont pas autant d' indice chacun je suppose ?
Je n’y avais pas pensé mais, dans la mesure où on renseigne d’abord les éventuelles imprimantes réseau, les imprimantes USB sont en fin de liste. Il ne devrait donc pas y avoir de problème.
iznobe a écrit :qu ' en penses tu ?
C’est faisable mais je ne vois pas vraiment où le code est plus simple à part qu’on s’affranchit de la variable usb.
Il faudrait aussi modifier le cas d’une seule imprimante et on peux se passer de la variable $D_IP :… ########################## # DETECTION AUTOMATIQUE # ########################## # NET_printer_name= ??? declare -a printer_IP printer_name my_IP="$(hostname -I | cut -d ' ' -f1)" mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') #printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') ) #echo "${printer_IP[*]}" for p_ip in "${printer_IP[@]}"; do if wget -E "$p_ip" -O "$tmpDir/index.html"; then # version robuste : printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" ) #echo "printer_name == ${printer_name[*]}" fi done #echo "printer_name RESULT == #TAB printer_IP == ${printer_IP[*]} #TAB printer_name == ${printer_name[*]}" # USB_printer_name= ??? if lsusb | grep -q 04f9: then mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}') for p_usb in "${printer_usb[@]}" do printer_name+=( "$p_usb" ) printer_IP+=( "USB" ) done fi #echo "printer_name == #${#printer_name[*]} , #${printer_name[*]}" case ${#printer_name[*]} in 0) echo "Aucune imprimante détectée ! Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?" # on repars donc avec les questions de base : modele etc ... ;; 1) echo "Une seule imprimante détectée." modelName=${printer_name[0]} # ! printer_name != printerName IP=${printer_IP[0]} # pas besoin de poser de question , il ne reste plus qu ' a installer ;; *) echo "Plusieurs imprimantes ont été détectées." # il faut presenter sous forme de liste les éléments recupérés : # modele du materriel : IP ou USB # et demander à l' utilisateur de choisir un numero dans cette liste n_print=$(("${#printer_name[@]}")) for n in "${!printer_name[@]}" do echo " $((n+1)) ⇒ ${printer_name[$n]} ${printer_IP[$n]}" done while test -z "$choix" do read -rp "Choisissez le numero qui correspond à l’imprimante que voulez installer : " choix if ! ((choix > 0 && choix <= n_print)) then echo "Choix invalide !" unset choix fi done modelName="${printer_name[choix-1]}" IP=${printer_IP[choix-1} else usb="true" fi ;; esac #else ########################## # gestion des arguments # ########################## # if test -n "$modelName"; then # modelName="${modelName^^}" # else # declare -u modelName=$1 # fi until test -n "$modelName" do read -rp 'Entrez le modèle de votre imprimante : ' modelName done fi printerName="${modelName//-/}" # ! printer_name != printerName #check IP if test "$IP" = "USB" then echo "Installation en USB." else until test -n "$IP" do read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] " [[ $REPLY == [YyOo] ]] || break if test -n "$2" then IP=$2 shift $# else read -rp "Entrez l’adresse IP de votre imprimante : " IP fi IFS='.' read -ra ip <<< "$IP" for i in "${ip[@]}" do ((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1" done if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP" then err=0 unset IP fi done fi ################################################### # initialisation du tableau associatif `printer' # ################################################### …
iznobe a écrit :sinon , j 'avais pas fait attention , mais , c' est quoi ça ? :
modelName="${printer_name[$((choix-1))]##* }"
à la fin le " ##* " ?
pour mettre la variable en majuscule ?C’était pour effacer le suffixe (réseau ou usb) que j’avais ajouté.
Faut que je me penche sérieusement et au calme sur cette partie là .
en allant un peu plus loin que la liste multiple en détection auto lors des tests sur mon pi , j ' obtiens :
iznobe@k-pi3:~ $ sudo bash ubuntu.team.sh
--2025-08-17 21:03:04-- http://192.168.1.84/
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 301 Moved Permanently
Emplacement : /home/status.html [suivant]
--2025-08-17 21:03:04-- http://192.168.1.84/home/status.html
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 5138 (5,0K) [text/html]
Sauvegarde en : « /tmp/packages/index.html »
/tmp/packages/index.ht 100%[===========================>] 5,02K --.-KB/s ds 0s
2025-08-17 21:03:04 (47,9 MB/s) — « /tmp/packages/index.html » sauvegardé [5138/5138]
Plusieurs imprimantes ont été détectées.
1 ⇒ réseau : DCP-L3560CDW : 192.168.1.84
2 ⇒ usb : DCP-L3560CDW : USB
Choisissez le numero qui correspond à l’imprimante que voulez installer : 1
printerName == RÉSEAU : DCPL3560CDW
Installation en USB.
Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas.
iznobe@k-pi3:~ $
en modifiant " reseau : " ou " usb : " , le nom de l' imprimante detectée devient :
" printerName == RÉSEAU : DCPL3560CDW " et fausse le script puisque on fait :
printer_name+=( "réseau : $(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
...
echo "Une seule imprimante détectée."
modelName=${printer_name[0]}
if [[ ${printer_name[0]} =~ "^réseau" ]]
# forcément modelName ne doit PAS commencer par : " reseau " ...
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#298 Aujourd'hui à 21:56
- nany
Re : remise au gout du jour du script de demonipuch imprimante brother
Normal, dans le code sur github il n’y a pas la substitution (##* ).
Il faut :
modelName=${printer_name[0]##* }
Et plus bas :
modelName=${printer_name[choix-1]##* }
Ou bien tu reprends tout ce que j’ai mis en #282 (d’ailleurs j’ai fait une erreur dans ma réponse : c’est le préfixe et non le suffixe).
Dernière modification par nany (Aujourd'hui à 22:21)
Hors ligne
#299 Aujourd'hui à 21:57
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
voici ma version de test sur le pi ( remise en forme pour ubuntu si j' ai rien oublié ) qui avance un peu , il est fort probable que je n' ai pas tous corriger ...
le script s' arrete sur le pi à la ligne 251 :
install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
#!/bin/bash -x
# > vim search whole line : `yy / <Ctrl-F> p <Enter>'
# définitions de variables
# gestion des arguments
# infos Brother
# quelques fonctions
# quelques vérifications
# initialisation du tableau associatif `printer'
# vérification de variables disponibles dans `printer'
# préparation du système
# téléchargement des pilotes
# configuration de l'imprimante
# configuration du scanner
# <
shopt -s extglob nullglob globstar
############################
# définitions de variables
############################
if test -f /etc/lsb-release
then
. /etc/lsb-release
DistroName="$DISTRIB_ID"
VersionYear="${DISTRIB_RELEASE::2}"
codeName="$DISTRIB_CODENAME"
elif test -f /usr/lib/os-release
then
. /usr/lib/os-release
DistroName="$NAME"
VersionYear="${VERSION_ID::2}"
codeName="$VERSION_CODENAME"
fi
user="$SUDO_USER"
arch="$(uname -m)"
date=$(date +%F_%T)
tmpDir="/tmp/packages"
Logfile="/home/$user/brprinter_install.log"
libDir="/usr/lib/$arch-linux-gnu"
declare -A printer
declare -i err
#################
# infos Brother
#################
# ancienne adresse d' obtention des infos :
#Url_Info="http://www.brother.com/pub/bsc/linux/infs"
# nouvelle adresse :
Url_Info="https://download.brother.com/pub/com/linux/linux/infs"
# Packages :
Url_Pkg="https://download.brother.com/pub/com/linux/linux/packages"
#Url_Pkg2="http://www.brother.com/pub/bsc/linux/packages" # ancienne adresse d'obtention des paquets
Udev_Rules="/lib/udev/rules.d/60-libsane1.rules"
Udev_Deb_Name="brother-udev-rule-type1-1.0.2-0.all.deb"
Udev_Deb_Url="http://download.brother.com/welcome/dlf006654"
Scankey_Drv_Deb_Name="brscan-skey-0.3.4-0.amd64.deb"
#Printer_dl_url="https://support.brother.com/g/b/downloadtop.aspx?c=fr&lang=fr&prod=${printerName}_us_eu_as"
#######################
# quelques fonctions #
#######################
errQuit()
{
>&2 echo "$@"
exit 1
}
verif_lien()
{ # pour faire un boucle, suffit-il vérifier que le nombre d'arguments est pair ?
local lien=$1 cible=$2
if ! test -L "$lien"
then
ln -s "$cible" "$lien"
fi
}
install_pkg()
{
for pkg do
if ! dpkg-query -f '${binary:Package}\n' -W "$pkg" &>/dev/null
then
apt-get install -qq "$pkg"
fi
done
}
###########################
# quelques vérifications #
###########################
#if test "$DistroName" != "Ubuntu"; then errQuit "La distribution n’est pas Ubuntu ou une des ses variantes officielles."; fi
if test "$SHELL" != "/bin/bash"; then errQuit "Shell non compatible. utilisez : bash"; fi
#if test "$arch" != "armv7l"; then errQuit "Système non compatible."; fi
# if [[ $arch != @(i386|i686|) ]] armv7l
if test "$arch" != "x86_64"; then errQuit "Système non compatible."; fi
if ((EUID)); then errQuit "Vous devez lancer le script en root : sudo $0"; fi
if ! nc -z -w5 'brother.com' 80; then errQuit "le site \"brother.com\" n'est pas joignable."; fi
######################
# prérequis pour le script #
######################
# a remettre le script en service
# if test -f "$Logfile"; then
# Old_Date="$(head -n1 "$Logfile")"
# mv -v "$Logfile" "$Logfile"."$Old_Date".log
# fi
# echo "$date" >> "$Logfile" # indispensable pour la rotation du log .
apt-get update -qq
# script : "wget" "nmap" "libxml2-utils" " gawk"
# imprimantes : "multiarch-support" "lib32stdc++6" "cups"
# scanner : "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
install_pkg "wget" "nmap" "libxml2-utils" "gawk"
if ! test -d "$tmpDir"
then
mkdir -pv "$tmpDir"
fi
declare -u modelName=$1
if test -z "$modelName"
then
##########################
# DETECTION AUTOMATIQUE #
##########################
# NET_printer_name= ???
declare -a printer_IP printer_name
my_IP="$(hostname -I | cut -d ' ' -f1)"
mapfile -t printer_IP < <(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}')
#printer_IP=( $(nmap -sn -oG - "$my_IP"/24 | gawk 'tolower($3) ~ /brother/{print $2}') )
#echo "${printer_IP[*]}"
for p_ip in "${printer_IP[@]}"; do
if wget -E "$p_ip" -O "$tmpDir/index.html"; then
printer_name+=( "$(xmllint --html --xpath '//title/text()' "$tmpDir/index.html" 2>/dev/null | cut -d ' ' -f2)" )
#echo "printer_name == ${printer_name[*]}"
fi
done
#echo "printer_name RESULT ==
#TAB printer_IP == ${printer_IP[*]}
#TAB printer_name == ${printer_name[*]}"
# USB_printer_name= ???
if lsusb | grep -q 04f9:
then
mapfile -t printer_usb < <(lsusb | gawk '/04f9:/ {print $10}')
for p_usb in "${printer_usb[@]}"
do
printer_name+=( "$p_usb" )
printer_IP+=("USB")
done
fi
#echo "printer_name ==
#${#printer_name[*]} ,
#${printer_name[*]}"
case ${#printer_name[*]} in
0) echo "Aucune imprimante détectée !
Êtes vous sûr de l’avoir connectée au port USB de votre ordinateur ou à votre réseau local ?"
# on repars donc avec les questions de base : modele etc ...
;;
1) echo "Une seule imprimante détectée."
modelName=${printer_name[0]} # ! printer_name != printerName
IP=${printer_IP[0]}
# pas besoin de poser de question , il ne reste plus qu ' a installer
;;
*) echo "Plusieurs imprimantes ont été détectées."
# il faut presenter sous forme de liste les éléments recupérés :
# modele du materriel : IP ou USB
# et demander à l' utilisateur de choisir un numero dans cette liste
n_print=$(("${#printer_name[@]}"))
for n in "${!printer_name[@]}"
do
echo " $((n+1)) ⇒ ${printer_name[$n]} : ${printer_IP[$n]}"
done
while test -z "$choix"
do
read -rp "Choisissez le numéro qui correspond à l’imprimante que voulez installer : " choix
if ! ((choix > 0 && choix <= n_print))
then
echo "Choix invalide !"
unset choix
fi
done
modelName="${printer_name[$choix-1]}"
IP=${printer_IP[$choix-1]}
;;
esac
#else
##########################
# gestion des arguments #
##########################
until test -n "$modelName"
do
read -rp 'Entrez le modèle de votre imprimante : ' modelName
done
fi
printerName="${modelName//-/}" # ! printer_name != printerName
# echo " printerName == $printerName"
#check IP
if test "$IP" = "USB" # ???????????????
then
echo "Installation en USB."
else
until test -n "$IP"
do
read -rp "Voulez-vous configurer votre imprimante pour qu’elle fonctionne en réseau ? [o/N] "
[[ $REPLY == [YyOo] ]] || break
if test -n "$2"
then
IP=$2
shift $#
else
read -rp "Entrez l’adresse IP de votre imprimante : " IP
fi
IFS='.' read -ra ip <<< "$IP"
for i in "${ip[@]}"
do
((n++ ? i >=0 && i<=255 : i>0 && i<=255)) || err+="1"
done
if (( ${#ip[*]} != 4 )) || ((err)) || ! ping -qc2 "$IP"
then
err=0
unset IP
fi
done
fi
###################################################
# initialisation du tableau associatif `printer' #
###################################################
# creation $Url_PrinterInfo
Url_PrinterInfo="$Url_Info/$printerName"
F_P_fichier_Info="$tmpDir/$printerName.info"
wget -q "$Url_PrinterInfo" -O "$F_P_fichier_Info"
if ! test "$(grep PRINTERNAME "$F_P_fichier_Info" | cut -d= -f2)" == "$printerName"
then
errQuit "Les données du fichier info récupéré et le nom de l’imprimante ne correspondent pas."
elif test "$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"; then
Url_PrinterInfo="$Url_Info/$(grep LNK "$F_P_fichier_Info" | cut -d= -f2)"
fi
#echo "$Url_PrinterInfo"
while IFS='=' read -r k v
do
printer[$k]=$v
done < <(wget -qO- "$Url_PrinterInfo" | sed '/\(]\|rpm\|=\)$/d')
#########################################################
# vérification de variables disponibles dans `printer' #
#########################################################
if test -n "${printer[SCANNER_DRV]}"
then
install_pkg "libusb-0.1-4:amd64" "libusb-0.1-4:i386" "sane-utils"
printer[udev_rules]="$Udev_Deb_Name"
. <(wget -qO- "$Url_Info/${printer[SCANNER_DRV]}.lnk" | sed -n '/^DEB/s/^/scanner_/p')
. <(wget -qO- "$Url_Info/${printer[SCANKEY_DRV]}.lnk" | sed -n '/^DEB/s/^/scanKey_/p')
printer[SCANNER_DRV]="$scanner_DEB64"
printer[SCANKEY_DRV]="$scanKey_DEB64"
if test -n "$VersionYear"; then
if (( VersionYear >= 24 )) && test "${printer[SCANKEY_DRV]}" = "brscan-skey-0.3.2-0.amd64.deb"
then
printer[SCANKEY_DRV]="$Scankey_Drv_Deb_Name"
fi
else
errQuit "Impossible d’évaluer la version de la distribution."
fi
else
err+="1"
echo "Pas de pilote pour le scanner."
fi
exit
###########################
# préparation du système #
###########################
install_pkg "multiarch-support" "lib32stdc++6" "cups"
for d in "/usr/share/cups/model" "/var/spool/lpd"
do
if ! test -d "$d"
then
mkdir -pv "$d"
fi
done
for i in \
DCP-{11{0,5,7}C,120C,31{0,5}CN,340CW} \
FAX-{18{15,20,35,40}C,19{2,4}0CN,2440C} \
MFC-{21{0,5}C,32{2,4}0C,33{2,4}0CN,3420C,3820CN,4{1,2}0CN,425CN,5440CN,5840CN,620CN,640CW,820CW}
do
if test "$i" = "$modelName"
then
install_pkg "csh"
fi
done
for i in \
DCP-{1{0,4}00,80{{20,25D},{40,45D},{60,65DN}}} \
FAX-{2{850,900},3800,4{100,750e},5750e} \
HL-{1{030,230,2{4,5}0,270N,4{3,4,5}0,470N,650,670N,850,870N},5{0{3,4,5}0,070N,1{3,4}0,150D,170DN,240,2{5,7}0DN,280DW},6050{,D}} \
MFC-{4800,6800,8{4{20,40,60N},500,660DN,8{20D,40D,60DN,70DW}},9{0{3,7}0,1{6,8}0,420CN,660,7{0,6}0,8{0,6,8}0}}
do
if test "$i" = "$modelName"
then
verif_lien "/etc/init.d/lpd" "/etc/init.d/cups"
if test -L /sbin/init
then
verif_lien "/lib/systemd/system/cups.service" "/lib/systemd/system/lpd.service"
systemd daemon-reload
fi
fi
done
###############################
# téléchargement des pilotes #
###############################
#echo " DL DRV TAB == ${printer[*]}"
for drv in "${printer[@]}"
do
if [[ $drv == @($printerName|no|yes) ]]; then continue;fi
for addr in $Url_Pkg
do
if ! test -f "$tmpDir/$drv"
then
Url_Deb="$Url_Pkg/$drv"
if test "$drv" = "${printer[udev_rules]}"
then
Url_Deb="$Udev_Deb_Url/$drv"
fi
wget -cP "$tmpDir" "$Url_Deb"
else
break
fi
done
pkg2install+=( "$tmpDir/$drv" )
done
echo "PKG2INSTALL == ${pkg2install[*]}"
#installation des pilotes
if (( ${#pkg2install[*]} == 0 ))
then
errQuit "Rien à installer."
else
dpkg --install --force-all "${pkg2install[@]}"
fi
##################################
# configuration de l'imprimante #
##################################
#retrouver le fichier `.ppd' pour l'imprimante
for drv in "PRN_CUP_DEB" "PRN_DRV_DEB"
do
pkg=${printer[$drv]}
#echo "pkg == $pkg"
if test -n "$pkg" -a -f "$tmpDir/$pkg"
then
while read -rd '' fileName # avec ou sans option " r " ?
do
PPDs+=( "$fileName" )
done < <(dpkg --contents "$tmpDir/$pkg" | gawk 'BEGIN{ORS="\0"} /ppd/{sub(".","",$NF); print $NF}')
fi
done
#echo "PPDs == ${PPDs[*]}"
if test -z "$Ppd_File"
then
PPDs=( /usr/share/cups/model/**/*brother*@($printerName|$modelName)*.ppd )
fi
case ${#PPDs[*]} in
0) echo "no ppd"
err+="1"
;;
1) echo one ppd
Ppd_File=${PPDs[0]}
;;
*) err+="1"
echo "more than one ppd"
Ppd_File=${PPDs[0]}
;;
esac
cp /etc/cups/printers.conf.O /etc/cups/printers.conf "$tmpDir"
systemctl restart cups
sleep 1
if test -n "$IP"
then
lpadmin -p "$modelName" -E -v "lpd://$IP/binary_p1" -P "$Ppd_File"
else
lpadmin -p "$modelName" -E -v 'usb://dev/usb/lp0' -P "$Ppd_File"
fi
#############################
# configuration du scanner #
#############################
if test -z "$IP"
then #USB
if grep -q "ATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
then
echo " - Règle udev deja presente dans le fichier $Udev_Rules"
else
sed -i "/LABEL=\"libsane_usb_rules_begin\"/a\
\n# Brother\nATTRS{idVendor}==\"04f9\", ENV{libsane_matched}=\"yes\"" "$Udev_Rules"
udevadm control --reload-rules
fi
else #network
for saneConf in /usr/bin/brsaneconfig{,{2..5}}
do
test -x "$saneConf" && cmd=$saneConf
done
if test -z "$cmd"
then
errQuit "no brsaneconfig found."
elif test "$cmd" = '/usr/bin/brsaneconfig4'
then
sed -i '/Support Model/a\
0x029a, 117, 1, "MFC-8690DW", 133, 4\
0x0279, 14, 2, "DCP-J525W"\
0x027b, 13, 2, "DCP-J725DW"\
0x027d, 13, 2, "DCP-J925DW"\
0x027f, 14, 1, "MFC-J280W"\
0x028f, 13, 1, "MFC-J425W"\
0x0281, 13, 1, "MFC-J430W"\
0x0280, 13, 1, "MFC-J435W"\
0x0282, 13, 1, "MFC-J625DW"\
0x0283, 13, 1, "MFC-J825DW"\
0x028d, 13, 1, "MFC-J835DW"' /opt/brother/scanner/brscan4/Brsane4.ini
fi
$cmd -a name=SCANNER model="$modelName" ip="$IP"
fi
if test -d "$libDir"
then
case $cmd in
/usr/bin/brsaneconfig)
cd "$libDir" || exit;
cp --force /usr/lib64/libbrcolm.so.1.0.1 .
ln -sf libbrcolm.so.1.0.1 libbrcolm.so.1
ln -sf libbrcolm.so.1 libbrcolm.so
cp --force /usr/lib64/libbrscandec.so.1.0.0 "$libDir"
ln -sf libbrscandec.so.1.0.0 libbrscandec.so.1
ln -sf libbrscandec.so.1 libbrscandec.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother.so.1.0.7 .
ln -sf libsane-brother.so.1.0.7 libsane-brother.so.1
ln -sf libsane-brother.so.1 libsane-brother.so
;;
/usr/bin/brsaneconfig2)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec2.so.1.0.0 .
ln -sf libbrscandec2.so.1.0.0 libbrscandec2.so.1
ln -sf libbrscandec2.so.1 libbrscandec2.so
cp --force /usr/lib64/libbrcolm2.so.1.0.1 .
ln -sf libbrcolm2.so.1.0.1 libbrcolm2.so.1
ln -sf libbrcolm2.so.1 libbrcolm2.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother2.so.1.0.7 .
ln -sf libsane-brother2.so.1.0.7 libsane-brother2.so.1
ln -sf libsane-brother2.so.1 libsane-brother2.so
;;
/usr/bin/brsaneconfig3)
cd "$libDir" || exit
cp --force /usr/lib64/libbrscandec3.so.1.0.0 .
ln -sf libbrscandec3.so.1.0.0 libbrscandec3.so.1
ln -sf libbrscandec3.so.1 libbrscandec3.so
cd "$libDir"/sane || exit
cp --force /usr/lib64/sane/libsane-brother3.so.1.0.7 .
ln -sf libsane-brother3.so.1.0.7 libsane-brother3.so.1
ln -sf libsane-brother3.so.1 libsane-brother3.so
;;
/usr/bin/brsaneconfig4)
cd "$libDir"/sane || exit
ln -sf libsane-brother4.so.1.0.7 libsane-brother4.so.1
ln -sf libsane-brother4.so.1 libsane-brother4.so
;;
/usr/bin/brsaneconfig5)
cd "$libDir"/sane || exit
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0 libsane-brother5.so.1
ln -sf /usr/lib/x86_64-linux-gnu/sane/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0
ln -sf /opt/brother/scanner/brscan5/libsane-brother5.so.1.0.7 libsane-brother5.so.1.0.7
;;
esac
fi
avec le retour suivant ( probablement normal vu que c ' est pas du 64 bit et une archi en armvl / armhf)
iznobe@k-pi3:~ $ sudo bash ubuntu.team.sh
--2025-08-17 21:42:30-- http://192.168.1.84/
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 301 Moved Permanently
Emplacement : /home/status.html [suivant]
--2025-08-17 21:42:30-- http://192.168.1.84/home/status.html
Connexion à 192.168.1.84:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 5138 (5,0K) [text/html]
Sauvegarde en : « /tmp/packages/index.html »
/tmp/packages/index.ht 100%[===========================>] 5,02K --.-KB/s ds 0s
2025-08-17 21:42:30 (13,8 MB/s) — « /tmp/packages/index.html » sauvegardé [5138/5138]
Plusieurs imprimantes ont été détectées.
1 ⇒ DCP-L3560CDW : 192.168.1.84
2 ⇒ DCP-L3560CDW : USB
Choisissez le numero qui correspond à l’imprimante que voulez installer : 1
printerName == DCPL3560CDW
E: Impossible de trouver le paquet libusb-0.1-4:amd64
E: Impossible de trouver de paquet correspondant à l'expression rationnelle « libusb-0.1-4 »
E: Impossible de trouver de paquet correspondant à l'expression rationnelle « libusb-0.1-4 »
E: Impossible de trouver le paquet libusb-0.1-4:i386
E: Impossible de trouver de paquet correspondant à l'expression rationnelle « libusb-0.1-4 »
E: Impossible de trouver de paquet correspondant à l'expression rationnelle « libusb-0.1-4 »
iznobe@k-pi3:~ $
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#300 Aujourd'hui à 22:05
- iznobe
Re : remise au gout du jour du script de demonipuch imprimante brother
Normal, dans le code sur github il n’y a pas la substitution (## ).
Il faut :modelName=${printer_name[0]## }
Et plus bas :
modelName=${printer_name[choix-1]## }
Ou bien tu reprends tout ce que j’ai mis en #282 (d’ailleurs j’ai fait une erreur dans ma réponse : c’est le préfixe et non le suffixe).
le code en 282 que j' ai cité , comporte aussi une erreur dans le :
case
*)
du coup je m' y suis collé a tout reprendre . voir dernier code du forum que j' ai posté , pas mis sur github depuis des heures .
Comme personne a répondu à ma question ( posée plusieurs fois ) , il serait plus sage de poster sur github ( pour eviter de surcharger le forum ) , mais bon , j' ai eu l' impression que ca plaisait a personne ...
Watael , m ' ayant expliqué que ca supprimait le suffixe , j' avais supprimé , puisque cela ne servait à rien
Bref , admettons , mais je trouve ca compliqué .
le code que j' ai mis dans mon dernier message , me parait plus simple , plus clair et fonctionnel . bon je ne l' ai pas testé longtemps , une seule fois ... il faut que je vérifie encore probablement . avec les autres possibilités :
la détection auto unique
en mode manuel .
ce que je ferais demain .
Dernière modification par iznobe (Aujourd'hui à 22:07)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne