Une connexion SSH n’implique pas d’ouvrir un shell interactif. En passant une commande directement à ssh, vous pouvez interroger, modifier, redémarrer des services ou collecter des informations sur des dizaines de serveurs sans jamais ouvrir un terminal distant.
C’est la base de l’automatisation système et un objectif LFCS (domaine Networking — “Use SSH in automation and scripting”).
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Cette technique s’utilise dès que vous devez agir sur un serveur distant sans ouvrir de session interactive : vérifier l’espace disque après un déploiement, redémarrer un service, collecter des métriques sur plusieurs machines à la fois, ou exécuter un script de provisionnement sans le copier au préalable. C’est aussi le fondement de l’automatisation avec des outils comme Ansible, qui ne fait rien d’autre qu’encapsuler des commandes SSH.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lancer une commande sur un serveur sans session interactive
- Combiner
sshavec des pipes pour traiter les données à la volée - Exécuter des commandes qui demandent sudo à distance
- Écrire une boucle multi-serveurs pour des opérations batch
- Passer des scripts locaux à un serveur distant via stdin
- Diagnostiquer les cas où la commande distante échoue silencieusement
Commande simple sur un serveur distant
Section intitulée « Commande simple sur un serveur distant »La syntaxe de base est ssh [options] user@hôte "commande" :
# Lire les 5 dernières lignes des logs d'authentificationssh bob@192.168.1.10 "tail -5 /var/log/auth.log"
# Vérifier l'espace disquessh bob@192.168.1.10 "df -h /"
# Voir les processus qui tournentssh bob@192.168.1.10 "ps aux | grep nginx"Le résultat s’affiche directement dans votre terminal local. Pas de session, pas de prompt distant.
Pipes entre machine locale et serveur distant
Section intitulée « Pipes entre machine locale et serveur distant »SSH peut s’insérer dans des pipelines shell ordinaires.
Lire un fichier distant et filtrer localement
Section intitulée « Lire un fichier distant et filtrer localement »# Récupérer /etc/hosts distant et filtrer les lignes webssh bob@192.168.1.10 "cat /etc/hosts" | grep webEnvoyer des données locales vers le serveur
Section intitulée « Envoyer des données locales vers le serveur »# Compresser localement et décompresser à distance (alternative à rsync)tar czf - /data/backups | ssh bob@192.168.1.10 "tar xzf - -C /restore/"Lire plusieurs fichiers distants avec des wildcards
Section intitulée « Lire plusieurs fichiers distants avec des wildcards »# Les wildcards doivent être entre guillemets pour être évalués à distancessh bob@192.168.1.10 "cat /var/log/nginx/*.log" | grep "500"Commandes nécessitant sudo
Section intitulée « Commandes nécessitant sudo »Pseudo-TTY avec -t
Section intitulée « Pseudo-TTY avec -t »sudo sur certains systèmes exige un terminal (TTY). L’option -t alloue un pseudo-TTY :
ssh -t bob@192.168.1.10 "sudo systemctl restart nginx"Sans -t, vous obtenez : sudo: a terminal is required to read the password
Lancer une commande root avec entrée standard
Section intitulée « Lancer une commande root avec entrée standard »# Passer un script à exécuter avec sudocat script_local.sh | ssh -t bob@192.168.1.10 "sudo bash"Passer un script local à distance
Section intitulée « Passer un script local à distance »Plutôt que de copier un script sur le serveur, passez-le directement via stdin :
# Exécuter un script local sur le serveur distantssh bob@192.168.1.10 "bash -s" < mon_script.shAvec des arguments :
ssh bob@192.168.1.10 "bash -s" < mon_script.sh -- --env production --dry-runOpérations batch sur plusieurs serveurs
Section intitulée « Opérations batch sur plusieurs serveurs »Boucle simple
Section intitulée « Boucle simple »for host in web1 web2 web3 db1; do echo "=== $host ===" ssh bob@$host "uptime && df -h /"doneBoucle depuis un fichier de liste
Section intitulée « Boucle depuis un fichier de liste »# servers.txt contient un hôte par lignewhile read host; do echo "=== $host ===" ssh bob@$host "free -h | grep Mem"done < servers.txtCollecte système multi-serveurs (format tabulé)
Section intitulée « Collecte système multi-serveurs (format tabulé) »echo "HOST,UPTIME,MEMORY_FREE,DISK_FREE"for host in web1 web2 web3; do ssh bob@$host "echo -n '${host},'; uptime | awk '{print \$(NF-2)}' | tr -d ','; echo -n ','; free -m | awk '/Mem/{print \$4}'; df -h / | awk 'NR==2{print \$4}'"doneCodes de retour et gestion d’erreur
Section intitulée « Codes de retour et gestion d’erreur »ssh transmet le code de retour de la commande distante — exploitable dans vos scripts :
if ssh bob@192.168.1.10 "systemctl is-active nginx" > /dev/null 2>&1; then echo "nginx actif sur 192.168.1.10"else echo "ALERTE : nginx inactif sur 192.168.1.10"fiQuitter immédiatement si une commande échoue dans une boucle :
set -efor host in web1 web2 web3; do ssh bob@$host "test -f /var/lock/deploy.lock && exit 1 || true"doneTunneling + commande distante
Section intitulée « Tunneling + commande distante »Combinaison utile : se connecter à un serveur intermédiaire pour atteindre une cible cachée :
# Via ProxyJump en one-liner — commande sur un serveur de prod accessible via bastionssh -J bob@bastion.example.com bob@10.0.1.15 "systemctl status app"Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Action |
|---|---|---|
sudo: a terminal is required | sudo exige un TTY | Ajouter -t à la commande ssh |
| La commande s’exécute localement | Guillemets oubliés autour de la commande | Entourer la commande de "..." |
bash: commande: not found — hors session | Variables PATH différentes en mode non-interactif | Utiliser le chemin absolu ou bash -l -c "..." |
| Code de retour toujours 0 | ssh retourne 0 même si la commande a échoué | Vérifier la sortie d’erreur ; tester echo $? à distance |
| Commande bloquée sans fin | Programme distant attend une entrée | Ajouter -n pour désactiver stdin : ssh -n ... |
À retenir
Section intitulée « À retenir »ssh user@host "commande"exécute sans ouvrir de session — la commande doit être entre guillemets-talloue un pseudo-TTY nécessaire poursudointeractifbash -s < script.shexécute un script local à distance sans le copier- Le code de retour de la commande distante est transmis par SSH — utilisez-le dans vos scripts
- Pour du batch à grande échelle, ControlMaster ou Ansible sont plus adaptés que les boucles
for