Affichage des articles dont le libellé est shell. Afficher tous les articles
Affichage des articles dont le libellé est shell. Afficher tous les articles

vendredi 3 novembre 2017

installer une imprimante en ligne de commande

Mise à jour du 01/01/2018 Ajouté comment supprimer une imprimante et comment trouver une URI, en particulier pour une imprimantte usb.

AntiX

Je viens d'installer linux AntiX 17 (pour amd64) sur une de mes machines. AntiX est une distribution dérivée de debian sans systemd et c'est pourquoi j'ai voulu la tester. De nouveau, car un vieil essai précédent ne mm'avait pas tellement convaincu. Mais là je suis sous le charme !

D'abord, antiX connaît le clavier bépo au niveau de son CD d'installation. Celui-ci est un live CD, qui se charge très vite (j'utilise une clé USB 2.0 pour ce test). Je ne dirai rien pour le wifi et le bluetooth car ma machine en était dépourvue, mais les deux écrans sont gérés d'office dans leur meilleure résolution, et pas en mode cloné. Ce sont deux écrans physiquement identiques.

L'installation avec partitionnement manuel (mon choix -- toujours) est particulièrement rapide. Bon, ça n'installe pas de gros trucs comme gnome ou mate, alors ça aide. Pour installer mate, j'ai installé tasksel puis j'ai installé mate avec tasksel. Pas de gros problème. Faites attention au gestionnaire d'écran choisi pour la session la première fois, car celui sélectionné par défaut est un peu court (pas possible d'ouvrir un terminal -- je suis passé par l'édition d'un texte avec vi pour lancer bash depuis vi -- mais j'aurai dû choisir un autre gestionnaire de fenêtres).

Tout allait pour le mieux jusqu'à ce que je décide d'installer une imprimante.

installer une imprimante à la main

En effet, la boîte de dialogue de gestion des imprimantes n''apparaît pas (sous mate). Rien à faire. Je me suis donc hissé à un niveau de geekitude supérieur et j'ai utilisé lpadmin. Aucune difficulté de syntaxe particulière. Mais il ne faut pas se tromper avec l'URI de l'imprimante sinon la communication n'aura jamais lieu et une commande lpstat -p myprinter -R indiquera que la dite imprimante myprinter « is not responding » . Au fait, il faut aussi rendre l'imprimante disponible avec lpadmin -p myprinter -E et on peut en faire l'imprimante par défaut avec lpadmin -d myprinter. On peut combiner tout ça en une seule commande comme par exemple :

sudo lpadmin -p myprinter -v socket://myprinter.chez.moi.com:9100 \
  -P ~/drivers/modele-de-mon-imprimante.ppd -E -d myprinter

Pour l'URI d'une imprimante réseau, on peut donc avoir socket://...:9100 et c'est le seul truc qui marchait pour moi. Sinon on peut aussi essayer ipp://.../ipp ou ipps://.../ipp entre autres.

Pour une imprimante usb, il faut trouver la bonne URI aussi. En ligne de commande, le plus simple est d'utiliser lpinfo -v | grep usb:. Si lpinfo n'est pas reconnu, essayez /usr/sbin/lpinfo -v. Pensez à installer cups-bsd au besoin (voir un peu plus loin). Par exemple, pour mon imprimante Samsung M2026W j'obtiens :

/usr/sbin/lpinfo -v | grep usb:
direct usb://Samsung/M2020%20Series?serial=08HYB8GG5E00H9Y

Ici, l'URI à recopier est usb://Samsung/M2020%20Series?serial=08HYB8GG5E00H9Y tout simplement ;-)

Une autre possibilité est d'utiliser le frontal web de cups situé par défaut à http://localhost:631/ qui permet d'imprimer une page de test. Mais qui ne vous donnera pas le bon schéma d'URI à utiliser : là enccore, il faut deviner. Un petit truc sous cette interface : si votre imprimante y apparaît comme raw printer bien que vous ayez fourni un fichier ppd pour le pilote, il est à peu près certain que le l'URI utilisée n'est pas la bonne !

lpq

Si vous voulez utiliser lpq au lieu de lpstat en ligne de commande, ou encore lpinfo, il faut l'installer avec sudo apt-get install cups-bsd car c'est en effet une commande BSD. L'avantage de lpq, c''est qu'il suffit de taper lpq pour voir la file de l'imprimante par défaut. Et en prime on aura lprm qui peut aussi servir de temmps en temps. Surtout pour moi tant que je n'aurai pas récupéré l'interface graphique normale de gestion des imprimantes !

Pour supprimer une imprimante, utilisez lpadmin -x myprinter.

mardi 8 décembre 2015

trouver des paquets sous debian dans un script

On a parfois besoin dans un script shell de trouver le nom exact d'un paquet disponible, ou en tout cas tous ceux qui pourraient convenir. Par exemple si on veut trouver les forth disponibles on peut utiliser :

aptitude search 'forth' -F '%p'

On peut trouver la liste des directives de format dont %p est un exemple.

Si aptitude n'est pas installé, on peut utiliser dpkg, mais il faut plus de travail autour pour avoir un résultat similaire :

dpkg -l '*forth*' | tail -n +6 | awk '{ print $2; }'

Si on n'est intéressé que par les paquets installés, on peut utiliser dpkg-query :

dpkg-query -f '${binary:Package}\n' -l '*forth*'

Exemple concret : trouver le nom du paquet à installer pour installer libmagickwand et y procéder.

lmw=$(aptitude search '~n^libmagickwand[0-9]' -F '%p' | head -1)
sudo aptitude install $lmw

mercredi 10 décembre 2014

variables Bash : bye bye basename

édition rapide du contenu des variables sous bash et dash

Bash a un mécanisme d'édition de variables intégré permettant d'en supprimer le début ou la fin. En prime, ça peut aussi compter la longueur du contenu.

Pour supprimer le début c'est avec #. Si on prononce # « dièse », ça commence par un D comme « début ».

Pour supprimer la fin c'est avec %. Bon, on peut se dire qu'un pourcentage s'écrit avec % à la fin pour s'en souvenir.

Exemples d'utilisation

transformer un flac en ogg
sox $chanson ${chanson%.flac}.ogg
calculer la longueur d'un mot
echo $mot fait ${#mot} char. de long
afficher le début d'un texte
echo début du texte : ${texte:0:30}
évaluer le chemin du script exécuté
chemin=${0%/*}
évaluer le chemin du script exécuté, complété pour le cas des liens symboliques
this=$(readlink -e $0)
chemin=${this%/*}
afficher le seul nom du script exécuté
echo ${0##*/}
supprimer un éventuel / final à un nom de répertoire
repertoire=${repertoire%/}

Tout cela fonctionne aussi avec dash !

Une petite colle maintenant : si votre script est appelé par la commande point (.) alors $0 n'est pas le nom de votre script mais celui du shell appelant ou du script appelant. Comment récupérer le nom du script dans ce cas-là ? Je n'en sais rien !

un petit exemple concret

Le programme suivant permet d'éditer en mode comparaison tous les couples de fichiers de même nom dans deux répertoires différents, en se restreignant au seul cas où ils ont un contenu différent. C'est un script dash pour plus de radipité au lancement. L'éditeur utilisé est vim ou gvim (sous la forme vimdiff ou gvimdiff).

#!/bin/sh

# édite les fichiers de même nom dans deux répertoires mais différents

usage() {
  echo "usage: ${0##*/} [-g] dir01 dir02"
  echo "Edit same files in both directories with different contents only."
  echo "With -g use gvimdiff instead of vimdiff."
  exit 1
}

editor=vimdiff
if [ "$1" = '-g' ] ; then
  editor=gvimdiff
  shift
fi
[ $# -eq 2 ] || usage
dir01="${1%/}"
dir02="${2%/}"
ndiff=0
ntotal=0

compare() {
  if [ -f $2 ] ; then
    ntotal=$((ntotal+1))
    if ! cmp --quiet $1 $2 ; then
      #echo '!=' DIFF $1 $2
      $editor $1 $2
      ndiff=$((ndiff+1))
    fi
  fi
}

files=$(find "$dir01" -maxdepth 1 -type f)
for f01 in $files ; do
  f02=$dir02/${f01##*/}
  compare $f01 $f02
done
echo "$ndiff couples of files were different out of $ntotal."