Commandes SSH, les fondamentaux

Que vous soyez développeur junior, sénior, ou confirmé, et comme il faut bien commencer quelque part… vous avez sûrement comme moi d’abord appris à utiliser des logiciels FTP (acronyme pour : File Transfert Protocol).

Pour ceux qui se poseraient encore la question, un logiciel FTP a pour principale fonction d’effectuer des téléchargements de fichiers d’une machine locale, potentiellement votre ordinateur, vers un serveur en ligne.

Alors Oui, les logiciels FTP sont pour la plupart relativement fonctionnels, mais aujourd’hui, je vais vous parler d’une autre méthode qui vous fera sûrement gagner énormément de temps sur le long terme. Je vous présente alors… Le terminal !

Si vous êtes junior, le Terminal (mac) ou la console (Windows) peut en effet vous paraître un peu archaïque, moche, voir totalement inutile… pourtant, en apprenant à utiliser votre Terminal vous verrez très rapidement que vous pouvez effectuer quasiment toutes les manipulations dont vous aurez besoin au sein d’un seul et même environnement. Vous ne me croyez pas ? Pourtant, je vais aujourd’hui vous apprendre à effectuer les manipulations suivantes : Vous connecter à votre serveur en ligne, créer un fichier « .tar.gz », naviguer au sein de votre serveur, créer / modifier / dupliquer / renommer / déplacer / transférer / supprimer un dossier, vous connecter à votre base de donnée, interagir avec votre base de données, effectuer des sauvegardes en « .sql ». 

Commençons !

Quelques commandes de base
à connaitre à tout prix !

Se connecter à un serveur SQL

Pour vous connecter c’est très simple, ouvrez votre terminal et tapez la commande ci-dessus. Remplacez « root » par l’identifiant de votre serveur, et « adresse-ip » par l’adresse IP de votre serveur, cela donnera quelque chose de similaire à « ssh laurent@12.34.567.89. Appuyez sur la touche Entrée, vous serez alors invité à saisir le mot de passe du serveur, tapez votre mot de passe (ou copiez/collez-le) puis appuyez une nouvelle fois sur Entrée. Vous êtes maintenant connecté à votre serveur !

Affiche la position actuelle sur le serveur

Affiche le dossier courant dans lequel vous vous trouvez. Cette commande est indispensable car lorsque l’on navigue dans des dossiers / fichiers sur un serveur on peut rapidement se perdre et oublier où l’on se trouve. Cette commande vous retourne le chemin relatif de votre dossier sur le serveur.

Lister les dossiers & fichiers

Liste les fichiers & dossiers en affichant ses permissions, le nombre de fichiers, l’utilisateur (et son groupe), le poids, la date de modification, ainsi que le nom des fichiers. Cette commande a la particularité d’afficher les fichiers masqués (ex. les fichiers « htaccess ». Si vous ne souhaitez lister que les fichiers sans informations en particulier, vous pouvez simplement taper « ls ».

Naviguer entre les dossiers

Se déplacer dans les dossiers. Par exemple pour rentrer en profondeur dans : dossier1 > dossier2 > dossier3 vous taperiez alors :

Une fois dans votre dossier « dossier3 » qui serait dans cet exemple votre dernier niveau de profondeur, pour revenir à votre dossier « dossier1 » vous n’aurez qu’à taper :

Petite astuce, en tapant les premières lettres de votre dossier et en appuyant sur Tab, votre terminal devrait vous proposer un auto remplissage.

Créer un dossier

Pour créer un dossier, entrez la commande ci-dessus suivie du nom de votre dossier. Si vous aviez par exemple l’arborescence suivante : dossier1 > dossier2 > dossier3, que vous êtes dans votre dossier1, et que vous voulez créer un dossier4 dans votre dossier3 vous pourriez taper la commande suivante :

Déplacer / renommer un dossier

Déplacer votre dossier ne prend que quelques secondes avec la commande ci-dessus. Pour renommer votre dossier, la commande est identique cependant au lieu de taper la destination de votre dossier vous taperez le nouveau nom du dossier.

Pour l’exemple reprenons notre arborescence de base : dossier1 > dossier2 > dossier3.
Maintenant disons que vous voulez déplacer votre dossier3 dans dossier1, vous taperez la commande suivante :

Toujours sur la même arborescence, disons maintenant que vous souhaitez renommer le dossier3 en nouveauDossier3. Pour cela tentez de saisir la commande suivante : 

Voilà ! Vous savez maintenant naviguer dans votre arborescence de dossier comme un chef !

supprimer un dossier

Attention, manipulez cette commande avec la plus grande des précautions ! En effet, si vous pouvez en un claquement de doigts (clin d’œil à Thanos!) supprimer un dossier, il est tout aussi simple de supprimer la totalité des dossiers & fichiers de votre serveur ! Soyez donc relativement prudent avec cette commande.
Pour supprimer la totalité des fichiers & dossiers contenus dans notre dossier3 (pour reprendre l’exemple d’une arborescence type : dossier1 > dossier2 > dossier3). Vous feriez :

Sur la commande ci-dessus si je devais traduire en Français cela donnerait : Retourne au dossier racine, và dans dossier1, trouve le dossier3 s’il existe, et supprime-le. Gardez en tête que si vous précédez le nom de votre dossier par un slash « / » vous indiquez à votre commande « ton point de départ c’est la racine du serveur ».

Je vous disais plus haut de faire attention car vous pouviez supprimer la totalité de vos fichiers et dossiers, une commande relativement dangereuse ressemblerait à ceci :

Dans la commande ci-dessus on indique au serveur : Retourne à la racine du dossier, et supprime tout ce que tu y trouveras. Une telle commande sur un serveur de production serait vraiment critique… Soyez donc relativement prudent avant d’appuyez sur Entrée, et prenez l’habitude de relire vos commandes et vous renseigner si vous n’êtes pas sûr de ce que vous faites.

Copier un fichier ou un dossier

La commande « cp » vous permet de copier simplement un fichier dans le même répertoire, ou dans un répertoire secondaire ! 

Par exemple, disons que vous avez un fichier de log nommé error.log dans votre dossier /var/log/ et que vous souhaitiez le copier pour en faire un backup avant de le vider.

Pour cela nous allons copier ce fichier et le nommer « backup_error.log » en effectuant la commande ci-dessous :

En gros, la commande ci-dessus dit au serveur : Và à la racine du serveur, puis rends-toi dans le dossier « var » puis le sous-dossier « log », dans ce dossier « log » trouve-nous le fichier error.log puis copie-le (avec la commande cp du coup) et tu l’appelles « backup_error.log ». Voilà, maintenant vous avez faire une copie de fichier relativement simplement !

Notez que pour copier un dossier la manipulation est identique, vous rajouterez simplement l’argument « -r » en minuscules pour indiquer qu’il s’agit d’un dossier.

Créer une archive .tar.gz

Zipper un dossier au format « .tar.gz ». Voici le détail des arguments de cette commande :

  • tar : indique que l’on compresse un fichier de type tar
  • c : indique que l’on crée une archive
  • z : permet d’activer la compression « gzip » pour un taux de compression plus important (donc optimisé)
  • v : mode verbeux, permet d’afficher dans le détail les fichiers compressés
  • f : indique la donnée à compresser

Pour l’exemple ci-dessous, je compresse le dossier « backup » et je lui nomme mon fichier compressé « monBackupServeur.tar.gz ». Dans la pratique, voici le résultat :

Décompresser UNE ARCHIVE .TAR.GZ

La commande pour extraire un fichier « .tar.gz » est un peu similaire à celle que nous utilisons pour compresser, les arguments changent légèrement :

  • x : indique que l’on extrait une archive
  • v : mode verbeux qui affiche le détail des fichiers décompressés
  • z : permet de décompresser le « gzip »
  • f : indique la donnée à compresser

transferer des dossiers entre deux serveurs

C’est une problématique connue de tous les développeurs… le transfert de fichiers/dossiers entre les serveurs ! Vous travailliez sur une version de préproduction sur un serveur A et vous devez la transférer sur un serveur B ? Figurez-vous qu’avec la commande SCP cette problématique est totalement résolue ! Voyons ça ensemble.

transférer un dossier d’un serveur 1 vers un serveur 2

Dans l’exemple ci-dessus les arguments sont rangés de la manière suivante :

  • scp : indique que l’on và effectuer un transfert d’une machine à l’autre
  • -r : indique que l’on copie un dossier (si il ne s’agit que d’un fichier vous pouvez retirer cet argument)
  • cheminDuDossier1 : correspond au chemin absolu de votre dossier sur le serveur
  • utilisateur : correspond à l’identifiant SSH du serveur sur lequel vous allez transférer le dossier
  • serveur : adresse IP du serveur sur lequel vous allez transférer le dossier
  • cheminDeDestination : correspond au chemin absolu du serveur sur lequel vous allez transférer le dossier. En gros, le chemin dans lequel vous placez votre dossier copié.

En appuyant sur Entrée vous serez alors invité à saisir le mot de passe utilisateur du serveur sur lequel vous effectuez la copie. Dans un cas concret voici un exemple de la copie complète.

Dans mon exemple je vais copier un dossier « medias » qui se trouve dans « /httpdocs/ » sur mon Serveur n°1 à l’intérieur d’un dossier qui se nommera « assets » et qui se trouvera dans « /httpdocs/ » sur mon Serveur n°2 :

En validant cette commande, mon dossier « assets » sur le Serveur n°2 qui était vide jusque là, se remplira avec un sous-dossier nommé « medias » provenant de mon Serveur n°1. 

Vous me direz alors : « Super, je sais copier un dossier d’un serveur à l’autre, mais à quoi ça peut me servir de savoir faire ça ? ».

Eh bien c’est simple. Disons que vous aviez une version de Préprod sur votre Serveur n°1, et que vous avez besoin de mettre cette version en ligne sur le serveur de votre client ? Vous avez compris la suite… Vous allez pouvoir le faire de façon relativement simple, en gagnant un temps fou parce que la copie s’effectue de serveur à serveur, le temps de transfert est donc relativement court ! Et le pire, c’est que c’est valable pour des fichiers comme des dossiers !

On peut donc imaginer que vous avez fait un export de votre base de donnée de Préprod, que vous la copiez ainsi que votre dossier de travail sur le serveur de Prod de votre client et que maintenant vous n’avez plus qu’à tout dézipper….

Par expérience, je peux vous affirmer que c’est une optimisation de votre productivité qui n’a clairement pas d’égal ! Adieu les transferts lourds en FTP sur votre ordinateur pour les renvoyer 3 heures plus tard sur le serveur de votre client. Maintenant vous lancez votre commande et attendez que le serveur travaille pour vous. Ça mérite bien un café tout ça !

Consulter les fichiers log de votre serveur pour débugger

Lorsque vous rencontrez des erreurs sur votre serveur, ces erreurs sont automatiquement (pour la plupart) stockées dans des fichiers de type « .log » contenant la liste des erreurs que votre serveur a rencontré. 

Les fichiers logs sont plus ou moins spécifiques à l’environnement sur lequel vous travaillez et effectuez des requêtes. En fonction de votre serveur vous pourez donc trouver des fichiers logs relatifs à MySQL, PHP-FPM, Nginx, Varnish, etc.

Conventionnellement, dans la plupart des cas vous trouverez vos fichiers de logs en tapant la commande suivante :

De manière conventionnelle, ces fichiers logs sont habituellement stockés à la racine de votre serveur dans « /var/log » mais cela peut varier selon votre environnement. Dans le cas de certains frameworks comme Magento 2 par exemple, vous aurez également un dossier de logs directement dans votre application. Ces logs seront alors liés à l’utilisation de Magento 2 et son fonctionnement et vous seront très pratique pour comprendre les erreurs que vous rencontrez en front-office comme en backoffice ou simplement pour mieux comprendre les appels qui peuvent être faits par votre framework.

consulter un fichier de log

Cette commande sera forcément incontournable pour débugger puisqu’elle vous permettra de lister le contenu de votre fichier log. Dans la commande ci-dessus voici le détail des arguments :

  • tail : indique que l’on affiche le contenu du fichier
  • -n200 : permet de préciser le nombre de lignes que l’on souhaite afficher (changez le 200 par le nombre de lignes que vous souhaitez avoir)
  • En cas concret, si vous souhaitiez afficher par exemple les 50 dernières lignes d’un fichier log qui s’appelle error et se trouve dans le dossier de log général de votre serveur vous taperiez la commande suivante :

Astuce : Si vous faites du debug en temps réel et que vous avez besoin de visualiser en temps réel si un élément est retourné dans votre fichier de log, vous pouvez rajouter l’argument « -f » qui affichera le contenu de votre fichier en temps réel dans votre terminal. Votre commande serait donc : 

Pour sortir de ce mode « watch » faites simplement CTRL + C

Vider les fichiers de log

Dans certains cas, vous aurez peut-être besoin de vider vos fichiers de logs pour mieux comprendre les erreurs qui remontent, il existe la commande suivante pour cela :

Attention cependant ! Même si cela peut être très tentant de vider vos fichiers logs, gardez en tête qu’ils sont une source d’informations pour remonter vos erreurs. À ce titre si vous les videz vous n’aurez alors plus connaissance des erreurs qui ont pu remonter dans vos fichiers logs. Vous agissez donc en connaissance de cause. Comme ma maman dit toujours, un homme averti en vaut deux !

Vider tous les fichiers de log simultanément

Par le biais de la commande précédente nous avons vu comment vider un fichier log spécifique en lui passant comme argument le nom du fichier de log que l’on souhaite vider. Sachez cependant qu’il est possible de vider tous vos fichiers logs de façon simultanée ! Pour cela nous utilisons le fameux slash-étoile « /* » qui s’avérait dangereux pour la suppression. Dans la commande ci-dessous, nous allons tous les vider d’un seul coup !

Cette commande donne l’information suivante au serveur : « Và à la racine de mon serveur, dans le dossier var/log puis effectue la commande truncate -s0 sur tous les fichiers qui ont l’extension en .log. ». 

De cette manière on cible tous les fichiers qui ont une extension en « .log » donc pas de risque de vider un fichier autre qu’un fichier avec l’extension « .log ».

Je le rappelle une dernière fois, cette commande sert pour la connaissance, mais vider intégralement vos fichiers logs peut s’avérer problématique si vous avez besoin de visualiser une erreur serveur antérieure.

Sachez cependant qu’une fois vidé, votre fichier log se remplira de nouveau tout seul si de nouvelles erreurs ou de nouveaux évènements sont inscrits dans les logs. D’une manière plus générale, en les vidant cela servira à ne remonter que les erreurs réelles. Je vous invite tout de même à effectuer une copie de votre fichier log avec la commande « cp » que vous trouverez plus haut dans cette page.

Trouver quels fichiers comportent une chaine de caractère précise dans tous vos dossiers

Dans ce point, je vous propose de découvrir une commande qui est INDISPENSABLE et relativement simple à utiliser. Il s’agit de la commande « grep ». Cette commande permet d’effectuer une recherche dans des fichiers. Voyons tout de suite comment l’utiliser !

Sur la commande ci-dessous je pars du principe que vous avez lu le chapitre précédent concernant les logs ou que vous êtes déjà familier à l’utilisation des logs.

Cette commande en français donnerait l’indication suivante à notre serveur : « Trouve dans quels fichiers il y à la chaine de caractères « texte » dans le dossier « /var/log/ ». Comme vous le voyez cette commande s’accompagne de trois arguments dont voici le détail :

  • -r : indique que notre opération s’effectue de façon récursive
  • -i : on précise que notre commande est insensible à la casse
  • -l : affiche les résultats sous forme de liste

J’ai pris volontairement l’exemple des fichiers de logs mais gardez en tête que la commande « grep » peut s’utiliser dans n’importe quel type de fichiers.

Effectuer une recherche avancée avec grep

La commande « grep » s’accompagne de plusieurs fonctionnalités qui peuvent s’avérer réellement utiles ! Il est par exemple possible de faire un comptage du nombre de fois ou une chaine de caractères apparait dans une liste de fichiers, et sortir des résultats plus précis en fonction de certains critères.

Comme je suis quelqu’un de très pragmatique, commençons !
Dans l’exemple ci-dessous, nous allons prendre un cas concret. Disons que je travaille sur wordpress et que j’ai besoin de connaître tous les fichiers qui contiennent un lien dans lequel se trouve « /images ». Pour cela j’utiliserais la commande ci-dessous :

Bon, parlons-en parce que si vous êtes débutant, vous allez vite comprendre que cette commande bien qu’utile, n’est pas suffisante. En tapant cette commande, mon terminal me retourne la liste des fichiers (oui oui, tous les fichiers…) dans lequel il a trouvé la chaine de caractères que je lui ai demandé de chercher. C’est bien mais regardons le résultat de plus près :

Si on regarde de plus près les résultats de ma commande qu’est-ce que l’on peu y voir ? Non ? Toujours pas ? Allez je vous aide, ça ne vous dit rien ce petit numéro en fin de ligne ? Eh bien ce numéro correspond au nombre de fois où la chaine de caractère à été trouvée dans chaque fichier… « Super ! Mais ça change quoi ? ». 

Si vous êtes un peu curieux comme moi vous avez probablement dû tenter de taper cette commande dans votre terminal, dans le contexte qui vous intéresse, et vous avez dû avoir une liste interminable de réponses qui ressemblent vaguement à du Chinois ! Eh bien c’est normal ! Pourquoi ? (pourquoi pas ?!) Parce que on a dit en Français « Trouve « /images » dans tous les fichiers » donc logiquement, il affiche la réponse pour tous les fichiers…

La problématique c’est que cette liste à rallonge comporte les fichiers qui contiennent notre chaine de caractère, et les fichiers qui ont été testés, mais qui ne contiennent pas cette même chaîne, d’où le « :0 » à la fin de nos lignes. Cela signifie que le fichier à été testé, mais qu’il ne contient pas notre chaine de caractère.

Soyons alors un peu plus précis dans notre requête et filtrons nos résultats :

Voilà ! D’un coup notre liste est beaucoup plus utile puisque nous n’avons dans nos résultats que les fichiers qui contiennent notre chaine de caractères au minimum une fois. 

Voilà le résultat que j’obtiens grâce à cette commande :

Alors une dernière fois un peu plus loins ! Je veux que ma liste de résultats ne m’affiche que les fichiers contenus dans « /post » et dans « /header » … 

Avec cette commande je retourne donc le résultat suivant :

Voilà ! Vous venez d’apprendre à effectuer des recherches plus où moins précises en fonction de vos besoins, mais parlons un peu de tout ça car au fil de mes exemples je ne suis volontairement pas revenu sur le détail de mes arguments :

  • –color=always : permet de coloriser un peu vos résultats
  • -r : indique que notre opération s’effectue de façon récursive
  • -i : on précise que notre commande est insensible à la casse
  • -c : retourne le nombre de fois où la chaîne est trouvée
  • -v : exclu la chaîne de caractère passée avec cet argument
  • -E : fait passer un regex contenant plusieurs résultats sous la forme « « (chaine1|chaine2|chaine3) » » et ainsi de suite avec autant de chaînes que vous le souhaitez. De cette façon on dit à la requête que l’on veut tous les résultats qui contiennent « chaine1 », « chaine2 » et « chaine3 ». Le caractère pipe « | » sert de séparateur dans ce contexte. Vous écrirez donc « « (chaine1|chaine2|chaine3) » ».

Si vous avez lu la totalité de ce tutoriel, alors bravo, vous avez fait un énorme pas en avant. Pour ma part j’utilise tous les jours le terminal pour effectuer divers opérations de maintenance ou pour m’aider dans mes phases d’intégration & développement.

Ce tutoriel est un condensé de tout ce que j’ai eu l’occasion d’apprendre au cours de ces dernières années et dites-vous que je n’ai saisi que très récemment l’intérêt de maîtriser ces commandes pour gagner en productivité et en efficacité.

Pour aller plus loin,
et gagner en productivité

Comme vous l’avez vu, certaines opérations sont un peu redondantes. Maintenant que vous vous êtes familiarisé avec votre terminal et que nous avons démystifié cette grosse boîte noire que sont les lignes de commande (CLI) vous êtes maintenant prêts pour une des meilleures astuces que j’ai pu découvrir.

Rendez-vous sur l’article Gagner en productivité avec Bashrc  pour découvrir les alias de commande ! Vous y gagnerez à coup sûr en productivité.

Articles en lien