Récupérer le résultat d’une commande dans une variable

On continue dans les astuces courtes que j’ai eu à utiliser dans ma conception de scripts. Afin de pouvoir utiliser le PID que j’ai récupéré, il me fallait le stocker dans un variable. Ceci est une notion élémentaire dans le scripting Bash (mais j’avais un peu oublié …)

Il faut procéder comme suit :

variable=$(<COMMANDE_DONT_SOUHAITE_RECUPERER_LE_RESULTAT>)

Vous pouvez maintenant réutiliser le résultat de n’importe quelle commande à l’intérieur d’une autre.

Récupérer le PID d’un processus

Pour une fois un article un peu plus court puisque je viens juste apporter la technique pour récupérer le PID d’un processus. J’ai eu à l’utiliser dans un script de lancement (beaucoup de mises en place de services serveur ces temps ci) donc vous en verrai une utilisation dans les semaines à venir quand je détaillerai ces installations.

Il est bien sûr possible de passer par ps -e (agrémenté de grep et de sed en tous genres) mais ce n’est pas le plus efficace. Voici donc la commande magique :

pidof -x <NOM_DU_PROCESSUS>

Kit d’informations sous Linux

Il est toujours intéressant de collecter un certain nombre d’informations sur son système soit de manière répétée, soit occasionnellement. Voici un survol des principales commandes qu’il est bon de connaitre car on vient toujours à les utiliser :

  • apropos <mot>
    Affiche les commandes avec une courte définition en rapport avec <mot>
  • cat <fichier>
    Affiche le contenu texte de <fichier>
  • cat /proc/version
    Affiche la version de son noyau, son nom et la version du compilateur utilisé
  • df
    Affiche des informations sur les partitions
  • du
    Estime la place occupée par les fichiers et répertoires présents dans le dossier courant
  • find <mot>
    Recherche récursivement <mot> dans un répertoire
  • free
    Affiche la quantité de mémoire vive et swap utilisée
  • groups
    Affiche les groupes auxquelles appartient un utilisateur ou par défaut l’utilisateur qui lance la commande
  • id
    Permet d’afficher l’UID et le GID des utilisateurs du système
  • locate <mot>
    Recherche <mot> dans tous les répertoires
  • ls <direction>
    Liste les fichiers et/ou dossiers de <direction> ou par défaut du répertoire courant
  • lsmod
    Affiche le statut des modules du noyau Linux (fichier /proc/modules)
  • lspci
    Affiche les informations sur les bus PCI (donc de la plupart des périphériques)
  • more <fichier>
    Affiche <fichier> dans le shell page par page
  • mount
    Affiche la liste des disques montés. Permet aussi de monter des partitions et périphériques
  • printenv
    Affiche les variables d’environnement de l’utilisateur
  • ps
    Affiche les processus actifs du système
  • pstree
    Affiche les processus actifs du système sous forme d’arbre
  • pwd
    Affiche le chemin du répertoire actuel
  • stat <fichier>
    Affiche des informations sur un <fichier>
  • top
    Affiche des informations en continu sur l’activité du système
  • uname
    Affiche le type de système
  • uptime
    Affiche l’uptime (temps depuis lequel le système est allumé)
  • w
    Liste les utilisateurs connectés et quel programme ils utilisent actuellement
  • whois <URL ou IP>
    Affiche les informations de domaine de <URL> ou de <IP>
  • whatis <commande>
    Affiche la description despages de manuel de la <commande> correspondante
  • whereis <fichier>
    Recherche rapide de <fichier> dans tout le système
  • which <commande>
    Localise une <commande> sur le disque
  • who
    Affiche les utilisateurs connectés au système

Configuration du serveur FTP

Je voulais un serveur FTP pour pouvoir partager des données facilement et surtout pour avoir un espace de stockage accessible depuis n’importe où. Le premier besoin était de transmettre un gros fichier sans être limité par les quotas d’un mail.

Après avoir cherché un peu sur internet, j’ai décidé d’utiliser vsftpd mais d’autres font tout aussi bien l’affaire (proFTPd par exemple). Je l’ai donc installé avec :

apt-get install vsftpd

Je voulais que chaque utilisateur ait un espace qui lui est propre mais aussi un dossier qui serait commun à tous pour faciliter le partage. J’ai modifié le fichier de configuration ainsi :

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
ftpd_banner=Bienvenue sur mon FTP
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

Ceci me permet de garder chaque utilisateur dans son dossier avec des droits de lecture et d’écriture.

EDIT : ATTENTION : Ce qui suit est absolument nul, faisable avec des options sur les commandes de base sans avoir besoin de faire des scripts compliqués, sera supprimé dès que je me serais re-penché sur la question et a été supprimé de mon serveur tellement c’est lourd. Last but not least : le dossier de partage ne fonctionne pas. 

Pour le dossier de partage, j’ai utilisé ce que je qualifierais de patch parce que lourd à mettre en place et à maintenir. Je cherche un moyen plus efficace de faire la même chose.J’ai actuellement procédé ainsi :

mkdir /home/partage
groupadd ftpusers
chown root /home/partage
chgrp ftpusers /home/partage

Maintenant, à la création de chaque utilisateur, on le rendra membre du groupe ftpusers, on créera un dossier de partage et on montera /home/partage dedans. En plus, j’ai fait manuellement toutes ces opérations parce que je n’avais pas lu la manpage de useradd. Tout ceci peut donc évidemment être amélioré.

Voici les deux scripts que j’utilise actuellement pour créer et supprimer des utilisateurs :

Création :

#!/bin/sh
group="/etc/group";
fstab="/etc/fstab";

if [ -z $1 ]
 then
		echo "Usage : $0 username";
		echo "This script was designed to add a user and to give him an access to the shared zone";
 else
		useradd $1;
		mkdir -p /home/$1/partage;
		chown -R $1 /home/$1;
		chgrp -R $1 /home/$1;
		chmod 740 /home/$1
		mount --bind /home/partage /home/$1/partage;
		cp $group $group~
		sed -i "/ftpusers*/ s/.*/&amp;,$1/" $group;
		echo "/home/partage\t/home/$1/partage\tnone\tbind,defaults,auto\t0\t0" &gt;&gt; $fstab;
		echo "Initialisation du mot de passe\n";
		passwd $1;
		echo "User $1 created with success";
 fi

Suppression :

#!/bin/sh
fstab="/etc/fstab";

if [ -z $1 ]
then
        echo "Usage : $0 username";
        echo "This script was designed to add a user and to give him an access to the shared zone";
else
        umount /home/$1/partage;
        userdel $1;
        mv /home/$1 /home/archive;
        sed -i "/*$1*/ s/.*//" $fstab;
        sed -i '/^$/d' $fstab;
        echo "User $1 deleted with success";
fi

Je me rend compte en écrivant cet article que je ne supprime pas la ligne correspondante dans fstab.

A la suppression je déplace l’utilisateur dans le dossier archive au cas où il aurait fallut récupérer des données lui appartenant.

Je pense que ce que je veux faire est possible avec des utilisateurs virtuels. Ce sera mon prochain fil de recherche.