Catégories
Devops

Linux Shell mémo

Recharger des fichiers de conf sans se déconnecter

. ~/.profile

est strictement équivalent à:

source ~/.profile

la commande source exécute le script spécifié dans le shell actuel.

Obtenir son adresse IP publique

dig +short myip.opendns.com @resolver1.opendns.com
curl -s http://whatismyip.akamai.com
curl wgetip.com

Changer de Shell

Vérifier si on est en shell Bash:

echo $SHELL  retourne /bin/bash

pour passer sous Fish par exemple, ajouter le path du binaire du nouveau Shell /usr/bin/fish dans /etc/shells puis changer de shell par défaut en lançant la commande chsh (Change Shell):

chsh -s /usr/bin/fish

Lister les port écoutés

sudo netstat -tupln4

ici les option utilisés permettent de lister les ports : TCP UDP en IPV4 locaux avec le nom du programme qui écoute avec le numéros de port (et non le nom du service).

Raccourcis Bash

CTRL + A ou CTRL + E : début ou fin de ligne

ALT + F ou ALT + B : avancer ou reculer 1 mot

CTRL + R : permet de rappeler une commande en parcourant l’historique des commandes (interactif)

!commande : exécute la commande avec les arguments de sa dernière exécution (ex: !ls)

source

Chemin complet

Pour afficher le chemin complet vers un fichier il est possible d’utiliser l’une de ces techniques :

readlink -f filename
ls -d -1 "$PWD/www.conf"
find "$(pwd)" -name  www.conf

Explorateur de fichier

ranger est explorateur de fichier « graphique » pour la ligne de commande qui utilises vim pour l’édition de nom de fichiers/dossiers

Trouver l’emplacement d’un binaire

la commande command -v est à favoriser par rapport à la commande which qui est un process externe (sécurité, performances etc.) et cherche les binaires pas uniquement dans le PATH.

command -v monbinaire

locate recherche des entrées dans une base de données mlocate mise à jour régulièrement par la système.
Cherche une correspondance sur tout le chemin, il est possible d’utiliser le paramètre -r (regex)

locate -r '^.*/monbinaire

find peut avec les arguments -exec ou -ok être utilisé pour exécuter des instructions sur les résultats de la commande

find -name '*onbinaire' -print -ok ls -l {} \;

grep -R en excluant des dossiers

grep -iR --exclude-dir=node_modules ' port ' *

Fichiers et droits

chown possède de nombreuses options, pour affecter des dossiers/fichiers de façon sélective:

chown www-data:www-data /tmp/toto              # modifie user:groupe
chown -R www-data:www-data /tmp/toto           # modifie récursivement
chown -h www-data:www-data /tmp/toto           # modifier les droits sur les symlinks eux même (et non la cible du lien)
chown --from=behrouze www-data /tmp/toto       # modifie le owner des fichier de l'utilisateur spécifié
chown --from=:old-group :new-group /tmp/toto   # modifie le groupe des fichier du groupe old-group
chown --reference=fichier-source fichier-cible # copie les droits d'un fichier existant
chown g+s www-data /toto/                      # utilisation du SGID, appliqué à tout nouveau fichier créé

voir l’admin guide avec également les setuid et setguid avec cette question.

Debugger en Bash

mode debug: set -x  et pour remettre en mode normal: set +x

Pour exécuter une successions de commandes en tant que root

Il suffit d’utiliser l’option -c puis de l’ensemble des commandes englobés dans des quotes :

sudo sh -c 'cat fichier|grep -v "#" > /etc/nginx/sites-available/monsite.conf'

Et pour exécuter des commandes avec un user ne disposant pas de shell, la commande précédente nous renvoi un méchant This account is currently not available. pour byepasser cela il faut utiliser l’option -s pour spécifier un shell:

su -s /bin/bash -c 'php /var/www/nextcloud/occ' www-data

Grep

grep -A  5   # affiche les 5 lignes suivants le pattern trouvé
grep -B  5   # précédent
grep -C  5   # avant et après
grep -E -w 'version|number' fichier  # cherche les mots version OU number dans le fichier

Divers

  • htop : commandes listant les process et leurs consommation en direct, avec une interface moins austère que le classique top
  • pgrep : équivalent à un ps | grep -v grep 👍
  • pstree -a : liste des process en arborescence
  • du -sh /usr/share/* | sort -h : taille des dossier trié par taille

MAJ du système

Pour appliquer les MAJ de sécurité automatiquement utiliser l’utilitaire unattended-upgrades. A noter que mettre un apt update dans un crontab sera souvent en échec car le PATH n’est pas setté lors de l’exécution par le daemon cron.

pour obtenir la date du dernier apt update :

ls -l /var/cache/apt/pkgcache.bin # date de dernière modif
stat /var/cache/apt/pkgcache.bin  # avec les détails des dates d'accès

la date du dernier apt upgrade :

tail -1 /var/log/apt/history.log

dans la même lignée, obtenir la date des 3 derniers reboot (ne fonctionne pas sur les Raspberry Pi utiliser uptime) :

last -x | grep shutdown | head -3

uptime -s  # la date
uptime -p  # depuis quand

Changer l’éditeur de texte par défaut

Un éditeur de text par défaut doit être sélectionné pour utiliser par exemple les commandes tels que crontab -e , et nous avons le choix parmis les éditeurs installés (souvent au moins vim et nano):

select-editor

Changer le nom de sa machine

il est possible d’utiliser les outils nmtui, nmcli ou hostnamectl (sudo hostnamectl set-hostname xxx, voir cet article) ou bien d’éditer directement les fichiers suivants:

vi /etc/hostname
vi /etc/hosts

Distribution Linux

Pour déterminer la distribution les infos se trouvent:

hostnamectl | grep -i sys  # hostnamectl fait parti de systemd
cat /etc/os-release
cat /proc/version

Grub

Pour customiser Grub (OS loader) en ajoutant la mémorisation du dernier choix, ainsi que l’ajout d’une image de background perso, il faut éditer le fichier sudo vi /etc/default/grub  et ajouter/modifier :

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
GRUB_BACKGROUND="/home/behrouze/Images/Grub.jpg"

et faire prendre en compte les modifications par un sudo update-grub.

Changer de timezone

Lorsque l’horloge de la machine est détallée de X heures, penser à vérifier le fuseau horaire et le modifier si nécessaire:

sudo timedatectl                            # liste le fuseau horaire et l'heure locale et UTC
sudo timedatectl list-timezones             # liste les timezones existantes
sudo timedatectl set-timezone Europe/Paris  # fixe le fuseau horaire à Paris

LOCALS

Si en utilisant un système on a des erreurs nous indiquant LANGUAGE = (unset) ou LC_ALL = (unset) il nous faut configurer les locales pour notre environnement, qu’il est possible de lister avec la commande locale.
Pour cela ajouter a notre .bashrc :

export LC_ALL="fr_FR.UTF-8"
export LANG="fr_FR.UTF-8"
export LANGUAGE="fr_FR.UTF-8"

et générer puis reconfigurer les locales avec raspi-config sur un Raspberry Pi ou sur un Linux quelconque :

locale-gen "en_US.UTF-8"
dpkg-reconfigure locales

Alias paramétré

En bash, pour créer un alias qui exploite des paramètres, cad à qui on peut passer des arguments, il faut passer par une fonction. Mais il est possible de créer une fonction inline (pour éviter la déclaration) comme ceci:

alias mon-alias-avec-params='func(){ echo avant "$@" après;  unset -f func; }; func'

L’alias est créé avec en 1ère partie la déclaration de la fonction (func) qui va prendre les arguments avec $@ ou $1 $2 etc. , suivi d’un unset -f qui va supprimer cette fonction du scope, puis en 2ème partie l’appel de la fonction fun pour l’exécuter.

Random

Linux nous permet de générer des caractères aléatoires:

head -c 30 /dev/urandom > random.txt                # génère un fichier de 30 caractères
head -30 /dev/urandom   > random.txt                # génère un fichier de 30 lignes

Modules Linux

Pour inspecter les modules chargé (actifs) sur votre système utiliser lsmod. Cette commande va vous lister les modules non inclus dans le kernel chargés.
modinfo nous donnera plus d’infos sur un module donné et il est possible de spécifier le champs (non normalisé) à afficher (parmi notamment authordescriptionparm, depends, alias, etc.) avec un -F:
modinfo ip_tables -F depends.

Les chargement et déchargements de modules s’effectueront via les commandes sudo modprobe -a xxx et sudo modprobe -r xxx.

Il est possible d’empêcher le chargement de certains modules au démarrage du système grâce à un fichier de conf /etc/modprobe.d/blacklist.conf.

doc Ubuntu-fr à propos des modules