Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
elearning:workbooks:redhat:rh134:l101 [2024/10/21 09:53] – admin | elearning:workbooks:redhat:rh134:l101 [2024/10/21 15:02] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | * **RH13401 - Les Scripts Shell** | + | ~~PDF: |
- | * LAB #1 - Les Scripts Shell | + | |
- | * 1.1 - Exécution | + | |
- | * 1.2 - La commande read | + | |
- | * Code de retour | + | |
- | * La variable IFS | + | |
- | * 1.3 - La commande test | + | |
- | * Tests de Fichiers | + | |
- | * Tests de chaînes de caractère | + | |
- | * Tests sur des nombres | + | |
- | * Les opérateurs | + | |
- | * Tests d' | + | |
- | * 1.4 - La commande %%[[ expression ]]%% | + | |
- | * 1.5 - Opérateurs du shell | + | |
- | * 1.6 - L' | + | |
- | * La commande expr | + | |
- | * Opérateurs Arithmétiques | + | |
- | * Opérateurs de Comparaison | + | |
- | * Opérateurs Logiques | + | |
- | * La commande let | + | |
- | * Opérateurs Arithmétiques | + | |
- | * Opérateurs de comparaison | + | |
- | * Opérateurs Logiques | + | |
- | * Opérateurs travaillant sur les bits | + | |
- | * 1.7 - Structures de contrôle | + | |
- | * If | + | |
- | * case | + | |
- | * Exemple | + | |
- | * Boucles | + | |
- | * for | + | |
- | * while | + | |
- | * Exemple | + | |
- | * 1.8 - Scripts de Démarrage | + | |
- | * ~/ | + | |
- | * ~/ | + | |
+ | Version : **2024.01** | ||
- | ===== LAB #2 - Les Scripts Shell ===== | + | Dernière mise-à-jour : ~~LASTMOD~~ |
- | Le but de la suite de cette unité est de vous amener au point où vous êtes capable de comprendre et de déchiffrer les scripts, notamment les scripts de démarrage ainsi que les scripts de contrôle | + | ======RH13402 - Gestion |
- | Écrire des scripts compliqués est en dehors de la portée de cette unité car il nécessite une approche programmation qui ne peut être adressée que lors d'une formation dédiée à l' | + | =====Contenu du Module===== |
- | ==== 2.1 - Exécution ==== | + | * **RH13402 - Gestion des Tâches** |
+ | * Contenu du Module | ||
+ | * LAB #1 - cron | ||
+ | * 1.1 - Le Fichier / | ||
+ | * 1.2 - Les Champs Temporels | ||
+ | * 1.3 - Les crontabs Utilisateurs | ||
+ | * LAB #2 - anacron | ||
+ | * 2.1 - Le Fichier / | ||
+ | * 2.2 - Les Champs Temporels | ||
+ | * 2.3 - Le Fichier / | ||
+ | * LAB #3 - at | ||
+ | * 3.1 - Le Répertoire / | ||
+ | * LAB #4 - Timers systemd | ||
+ | * 4.1 - systemd-tmpfiles-clean.timer | ||
+ | * 4.2 - Configurer le systemd-tmpfiles-clean.service | ||
- | Un script shell est un fichier dont le contenu est lu en entrée standard par le shell. Le contenu du fichier est lu et exécuté d'une manière séquentielle. Afin qu'un script soit exécuté, il suffit qu'il puisse être lu au quel cas le script est exécuté par un shell fils soit en l' | + | =====cron===== |
- | **/bin/bash myscript** | + | <WRAP center round important 60%> |
+ | **Important** : Le service crond présume que la machine est allumée en permanence. | ||
+ | </ | ||
- | soit en redirigeant son entrée standard : | + | Le service crond est normalement lancé au démarrage de la machine. Ce service est chargé de faire exécuter des tâches ( commandes et scripts ) à des moments précis. Le service crond présume que la machine est allumée |
- | **/bin/bash < myscript** | + | Le service crond lit toutes les minutes le fichier |
- | Dans le cas où le droit d' | + | Si une commande produit une sortie, celle-ci est dirigée vers la messagerie. |
- | **myscript** | + | L' |
- | Pour lancer le script sans qu'il soit dans un répertoire du PATH, il convient | + | Sous Red Hat 9, les crontabs des utilisateurs ont comme nom, le nom de l' |
- | **./myscript** | + | ====1.1 - Le Fichier |
- | Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l' | + | Sous Red Hat 9 le fichier |
- | + | ||
- | **. myscript** | + | |
- | + | ||
- | Dans un script il est fortement conseillé d' | + | |
- | + | ||
- | Il existe aussi un **pseudo commentaire** qui est placé au début du script. Ce pseudo commentaire permet de stipuler quel shell doit être utilisé pour l' | + | |
- | + | ||
- | #!/bin/sh | + | |
- | + | ||
- | Puisque un script contient des lignes de commandes qui peuvent être saisies en shell intéractif, | + | |
< | < | ||
- | [trainee@redhat9 | + | [trainee@redhat9 |
- | Script started, output log file is ' | + | SHELL=/ |
- | [trainee@redhat9 ~]$ pwd | + | PATH=/sbin:/bin:/ |
- | /home/trainee | + | MAILTO=root |
- | [trainee@redhat9 ~]$ ls | + | |
- | aac bca Desktop | + | |
- | abc codes Documents | + | |
- | [trainee@redhat9 ~]$ exit | + | |
- | exit | + | |
- | Script done. | + | |
- | [trainee@redhat9 ~]$ cat typescript | + | # For details see man 4 crontabs |
- | Script started on 2024-09-26 13: | + | |
- | [trainee@redhat9 ~]$ pwd | + | |
- | / | + | |
- | [trainee@redhat9 ~]$ ls | + | |
- | aac bca Desktop | + | |
- | abc codes Documents | + | |
- | [trainee@redhat9 ~]$ exit | + | |
- | exit | + | |
- | Script done on 2024-09-26 13: | + | # Example of job definition: |
+ | # .---------------- minute (0 - 59) | ||
+ | # | .------------- hour (0 - 23) | ||
+ | # | | .---------- day of month (1 - 31) | ||
+ | # | | | .------- month (1 - 12) OR jan, | ||
+ | # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun, | ||
+ | # | | | | | | ||
+ | # * * * * * user-name | ||
</ | </ | ||
- | Cette procédure | + | <WRAP center round important 60%> |
+ | **Important** - Dans le fichier / | ||
+ | </ | ||
- | Pour illustrer l' | + | ====1.2 - Les Champs Temporels==== |
- | < | + | Chaque ligne dans un fichier |
- | [trainee@redhat9 ~]$ vi myscript | + | |
- | [trainee@redhat9 ~]$ cat myscript | + | |
- | pwd | + | |
- | ls | + | |
- | </code> | + | |
- | Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à / | + | Les 5 champs sont : |
- | < | + | ^ Minutes ^ Heures ^ Jour du mois ^ Mois de l' |
- | [trainee@redhat9 ~]$ /bin/bash myscript | + | | (0-59) |
- | / | + | |
- | aac bca Desktop | + | |
- | abc codes Documents | + | |
- | </ | + | |
- | Lancez ensuite | + | * le 0 correspond à dimanche. |
- | < | + | Les champs temporels peuvent contenir des valeurs différentes : |
- | [trainee@redhat9 ~]$ /bin/bash < myscript | + | |
- | / | + | |
- | aac bca Desktop | + | |
- | abc codes Documents | + | |
- | </ | + | |
- | Pour lancer | + | ^ Exemple ^ Description ^ |
+ | | Une valeur absolue telle 10 | Dans le champs minutes = 10 minutes après | ||
+ | | Une série de valeurs telle 2,6,8 | Dans le champs mois = février, juin et août | | ||
+ | | Une intervalle telle 1-5 | Dans le champs Jour de la Semaine = du lundi au vendredi | | ||
+ | | Le joker * | Dans le champs minutes = toutes les minutes | | ||
+ | | Une périodicité telle 0-23/2 | Dans le champs heures = toutes les deux heures | | ||
- | < | + | Par exemple, voici le fichier **/etc/cron.d/0hourly** |
- | [trainee@redhat9 ~]$ echo $PATH | + | |
- | /home/ | + | |
- | </ | + | |
- | + | ||
- | Dans le cas de RHEL 9, même si PATH contient $HOME/bin, le répertoire n' | + | |
< | < | ||
- | [trainee@redhat9 | + | [trainee@redhat9 |
- | aac bca Desktop | + | # Run the hourly jobs |
- | abc codes Documents | + | SHELL=/ |
+ | PATH=/ | ||
+ | MAILTO=root | ||
+ | 01 * * * * root run-parts / | ||
</ | </ | ||
- | Créez donc ce répertoire : | + | ====1.3 - Les crontabs Utilisateurs==== |
- | < | + | Chaque utilisateur peut avoir sa propre version d'un fichier crontab. Pour vérifier s'il existe une version de crontab |
- | [trainee@redhat9 ~]$ mkdir bin | + | |
- | </ | + | |
- | + | ||
- | Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable | + | |
< | < | ||
- | [trainee@redhat9 | + | [trainee@redhat9 |
- | [trainee@redhat9 ~]$ chmod u+x ~/ | + | no crontab for trainee |
</ | </ | ||
- | Exécutez maintenant | + | Afin de créer |
< | < | ||
- | [trainee@redhat9 | + | [trainee@centos8 |
- | [trainee@redhat9 tmp]$ myscript | + | |
- | /tmp | + | |
- | dbus-G7skg3Wlpv | + | |
- | dbus-s2vBGtxTHi | + | |
- | expand | + | |
- | expand1 | + | |
- | expand2 | + | |
- | filepartaa | + | |
- | filepartab | + | |
- | filepartac | + | |
- | filepartad | + | |
</ | </ | ||
- | Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes | + | Cette commande lance l' |
- | <code> | + | <file> |
- | [trainee@redhat9 tmp]$ cd ~/bin | + | * * * * * /bin/pwd > pwd.txt |
- | [trainee@redhat9 bin]$ ./myscript | + | </file> |
- | / | + | |
- | myscript | + | |
- | [trainee@redhat9 bin]$ . myscript | + | |
- | / | + | |
- | myscript | + | |
- | </code> | + | |
- | + | ||
- | <WRAP center round todo 60%> | + | |
- | **A faire** : Notez bien la différence entre les sorties de cette dernière commande et la précédente. Expliquez pourquoi. | + | |
- | </WRAP> | + | |
- | ====2.2 - La commande read==== | + | Sauvegardez et quittez vi. |
- | La commande **read** lit son entrée standard et affecte les mots saisis dans la ou les variable(s) passée(s) en argument. La séparation entre le contenu des variables est l' | + | Vous obtiendrez un résultat similaire à celui-ci |
< | < | ||
- | [trainee@redhat9 | + | [trainee@redhat9 |
- | fenestros edu is great! | + | no crontab for trainee |
- | [trainee@redhat9 bin]$ echo $var1 | + | crontab: installing new crontab |
- | fenestros | + | |
- | [trainee@redhat9 bin]$ echo $var2 | + | |
- | edu | + | |
- | [trainee@redhat9 bin]$ echo $var3 | + | |
- | is | + | |
- | [trainee@redhat9 bin]$ echo $var4 | + | |
- | great! | + | |
</ | </ | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important**: | + | **Important** : Ce fichier crontab va être exécuté toutes les minutes. La commande va inscrire le répertoire courant |
</ | </ | ||
- | < | + | Le fichier crontab que vous venez de créer, au nom de votre utilisateur, |
- | [trainee@redhat9 bin]$ read var1 var2 | + | |
- | fenestros edu is great! | + | |
- | [trainee@redhat9 bin]$ echo $var1 | + | |
- | fenestros | + | |
- | [trainee@redhat9 bin]$ echo $var2 | + | |
- | edu is great! | + | |
- | </code> | + | |
- | <WRAP center round important 60%> | + | Malgré |
- | **Important** : Notez que dans le deuxième cas, le reste de la ligne après le mot // | + | |
- | </ | + | |
- | ===Code de retour=== | + | Passez donc en mode super-utilisateur et visualisez |
- | + | ||
- | La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l' | + | |
< | < | ||
- | [trainee@redhat9 | + | [trainee@redhat9 |
+ | Password: fenestros | ||
+ | [root@redhat9 ~]# cat /var/ | ||
+ | * * * * * /bin/pwd > pwd.txt | ||
</ | </ | ||
- | < | ||
- | < | ||
- | [trainee@redhat9 bin]$ echo $? | ||
- | 0 | ||
- | [trainee@redhat9 bin]$ echo $var | ||
- | [trainee@redhat9 bin]$ | + | Afin d' |
- | </ | + | |
- | Le contenu de la variable | + | |
+ | | ||
- | < | + | Par contre, si root inscrit le nom d'un utilisateur dans /etc/cron.deny et cet utilisateur a déjà planifié des tâches avec son propre fichier crontab, les tâches seront exécutées. Pour détruire les tâches planifiées de l' |
- | [trainee@redhat9 bin]$ read var1 | + | |
- | </ | + | |
- | < | + | |
- | < | + | |
- | [trainee@redhat9 bin]$ echo $? | + | |
- | 1 | + | |
- | [trainee@redhat9 bin]$ echo $var1 | + | |
- | [trainee@redhat9 bin]$ | + | =====LAB #2 - anacron===== |
- | </ | + | |
- | ===La variable IFS=== | + | L' |
- | La variable IFS contient par défaut les caractères < | + | Il existe un alternatif très efficace pour des machines qui ne sont pas constamment allumée. Cette solution est le logiciel Anacron. Sous Red Hat 9, l' |
- | < | + | ====2.1 |
- | [trainee@redhat9 bin]$ echo " | + | |
- | 0000000 | + | |
- | 0000004 | + | |
- | </code> | + | |
- | <WRAP center round important 60%> | + | Ouvrez donc le fichier /etc/ |
- | **Important** : La commande **od** (//Octal Dump//) renvoie | + | |
- | </WRAP> | + | |
- | + | ||
- | La valeur de cette variable définit donc le séparateur de mots lors de la saisie des contenus des variables avec la commande **read**. La valeur de la variable **IFS** peut être modifiée | + | |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 bin]$ IFS=":" | + | # / |
- | [trainee@redhat9 bin]$ echo " | + | |
- | 0000000 | + | |
- | 0000002 | + | |
- | </ | + | |
- | De cette façon l' | + | # See anacron(8) and anacrontab(5) for details. |
- | < | + | SHELL=/bin/sh |
- | [trainee@redhat9 | + | PATH=/sbin:/bin:/ |
- | fenestros:edu is:great! | + | MAILTO=root |
- | [trainee@redhat9 | + | # the maximal random delay added to the base delay of the jobs |
- | fenestros | + | RANDOM_DELAY=45 |
- | [trainee@redhat9 bin]$ echo $var2 | + | # the jobs will be started during the following hours only |
- | edu is | + | START_HOURS_RANGE=3-22 |
- | [trainee@redhat9 bin]$ echo $var3 | + | |
- | great! | + | |
- | </ | + | |
- | Restaurez l' | + | #period in days delay in minutes |
- | + | 1 | |
- | < | + | 7 |
- | [trainee@redhat9 bin]$ IFS=" | + | @monthly 45 |
- | [trainee@redhat9 bin]$ echo " | + | |
- | 0000000 | + | |
- | 0000004 | + | |
</ | </ | ||
- | ====2.3 - La commande test==== | + | Vous noterez que ce fichier fait référence aux répertoires **/ |
- | La commande **test** peut être utilisée avec deux syntaxes : | + | ====2.2 - Les Champs Temporels==== |
- | **test** // | + | Les deux premiers champs sont des champs temporels. Dans le cas d' |
- | ou | + | ^ Période ^ Délai ^ |
+ | | La périodicité en jours | Le délai en minutes, après le **démarrage d' | ||
- | **[**< | + | Anacron mémorise dans les fichiers qui se trouvent dans **/var/spool/anacron/** la date à laquelle il a exécuté les commandes qui se trouvent dans anacrontab pour la dernière fois. Ces fichiers sont appelés cron.daily, cron.weekly et cron.monthly. |
- | + | ||
- | ===Tests de Fichiers=== | + | |
- | + | ||
- | ^ Test ^ Description ^ | + | |
- | | -f fichier | Retourne vrai si fichier est d'un type standard | | + | |
- | | -d fichier | Retourne vrai si fichier est d'un type répertoire | | + | |
- | | -r fichier | Retourne vrai si l' | + | |
- | | -w fichier | Retourne vrai si l' | + | |
- | | -x fichier | Retourne vrai si l' | + | |
- | | -e fichier | Retourne vrai si fichier existe | | + | |
- | | -s fichier | Retourne vrai si fichier n'est pas vide | | + | |
- | | fichier1 -nt fichier2 | Retourne vrai si fichier1 est plus récent que fichier2 | | + | |
- | | fichier1 -ot fichier2 | Retourne vrai si fichier1 est plus ancien que fichier2 | | + | |
- | | fichier1 -ef fichier2 | Retourne vrai si fichier1 est identique | + | |
- | + | ||
- | + | ||
- | Testez si le fichier **a100** est un fichier ordinaire : | + | |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 training]$ test -f a100 | + | cron.daily |
- | [trainee@redhat9 | + | [root@redhat9 |
- | 0 | + | 20241021 |
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 | + | 20241021 |
- | 0 | + | [root@redhat9 |
+ | 20240925 | ||
</ | </ | ||
- | Testez si le fichier a101 existe : | + | ====2.3 - Le Fichier / |
- | < | + | Sous Red Hat 9, anacron consulte le fichier **/var/ |
- | [trainee@redhat9 training]$ [ -f a101 ] | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 1 | + | |
- | </code> | + | |
- | Testez si /home/trainee/training est un répertoire | + | Voici le script **/etc/cron.hourly/0anacron** |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 training]$ echo $? | + | # |
+ | # Check whether 0anacron was run today already | ||
+ | if test -r /var/spool/anacron/ | ||
+ | day=`cat / | ||
+ | fi | ||
+ | if [ `date +%Y%m%d` = " | ||
+ | exit 0 | ||
+ | fi | ||
+ | |||
+ | # Do not run jobs when on battery power | ||
+ | online=1 | ||
+ | for psupply in / | ||
+ | if [ `cat " | ||
+ | if [ `cat "$psupply/ | ||
+ | | ||
+ | break | ||
+ | else | ||
+ | online=0 | ||
+ | fi | ||
+ | fi | ||
+ | done | ||
+ | if [ $online = 0 ]; then | ||
+ | exit 0 | ||
+ | fi | ||
+ | / | ||
</ | </ | ||
- | ===Tests de chaînes de caractère=== | + | Ce script a pour but d' |
- | ^ Test ^ Description ^ | + | =====LAB #3 - at===== |
- | | -n chaîne | Retourne vrai si chaîne n'est pas de longueur 0 | | + | |
- | | -z chaîne | Retourne vrai si chaîne est de longueur 0 | | + | |
- | | string1 | + | |
- | | string1 != string2 | Retourne vrai si string1 est différente de string2 | | + | |
- | | string1 | Retourne vrai si string1 n'est pas vide | | + | |
- | Testez si les deux chaînes sont égales | + | Tout comme avec la commande cron, root a la possibilité d' |
- | < | + | * **/ |
- | [trainee@redhat9 training]$ string1=" | + | * **/etc/at.deny** |
- | [trainee@redhat9 training]$ string2=" | + | |
- | [trainee@redhat9 training]$ [ $string1 = $string2 ] | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 1 | + | |
- | </code> | + | |
- | Testez si la string1 n'a pas de longueur 0 : | + | Si le fichier at.allow existe, seuls les utilisateurs dans ce fichier pourront exécuter at. |
- | < | + | En tant que root, mettez en place maintenant deux tâches pour le 31/12/2042 à 13h00 et 14h00 respectivement |
- | [trainee@redhat9 training]$ [ -n $string1 ] | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 0 | + | |
- | </code> | + | |
- | + | ||
- | Testez si la string1 a une longueur de 0 : | + | |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 training]$ echo $? | + | warning: commands will be executed using /bin/sh |
- | 1 | + | at> pwd > / |
- | </code> | + | at> |
+ | at> | ||
+ | job 1 at Wed Dec 31 13:00:00 2042 | ||
- | ===Tests sur des nombres=== | + | [root@redhat9 |
- | + | warning: commands will be executed using /bin/sh | |
- | ^ Test ^ Description ^ | + | at> free > / |
- | | value1 -eq value2 | Retourne vrai si value1 est égale à value2 | | + | at> |
- | | value1 -ne value2 | Retourne vrai si value1 n'est pas égale à value2 | | + | at> <EOT> |
- | | value1 -lt value2 | Retourne vrai si value1 est inférieure à value2 | | + | job 2 at Wed Dec 31 14:00:00 2042 |
- | | value1 -le value2 | Retourne vrai si value1 est inférieur ou égale à value2 | | + | |
- | | value1 -gt value2 | Retourne vrai si value1 est supérieure à value2 | | + | |
- | | value1 -ge value2 | Retourne vrai si value1 est supérieure ou égale à value2 | | + | |
- | + | ||
- | Comparez les deux nombres **value1** et **value2** : | + | |
- | + | ||
- | < | + | |
- | [trainee@redhat9 | + | |
- | 35 | + | |
- | [trainee@redhat9 training]$ read value2 | + | |
- | 23 | + | |
- | [trainee@redhat9 training]$ [ $value1 -lt $value2 | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 1 | + | |
- | [trainee@redhat9 training]$ [ $value2 -lt $value1 ] | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 0 | + | |
- | [trainee@redhat9 training]$ [ $value2 -eq $value1 ] | + | |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 1 | + | |
</ | </ | ||
- | ===Les opérateurs=== | + | ====3.1 - Le Répertoire / |
- | ^ Test ^ Description ^ | + | Sous Red Hat 9, les fichiers concernant ces deux tâches sont stockés dans le répertoire |
- | | !expression | Retourne vrai si expression est fausse | | + | |
- | | expression1 -a expression2 | Représente un et logique entre expression1 et expression2 | | + | |
- | | expression1 -o expression2 | Représente un ou logique entre expression1 et expression2 | | + | |
- | | \(expression\) | Les parenthèses permettent de regrouper des expressions | + | |
- | + | ||
- | Testez si $file n'est pas un répertoire : | + | |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 training]$ [ ! -d $file ] | + | a000010249d890 |
- | [trainee@redhat9 training]$ echo $? | + | |
- | 0 | + | |
</ | </ | ||
- | Testez si $directory est un répertoire **et** si l'utilisateur | + | A l'examen du deuxième fichier, vous constaterez un résultat similaire |
< | < | ||
- | [trainee@redhat9 | + | [root@redhat9 |
- | [trainee@redhat9 | + | #!/bin/sh |
- | [trainee@redhat9 training]$ | + | # atrun uid=0 gid=0 |
- | 0 | + | # mail trainee |
- | </code> | + | umask 22 |
+ | SHELL=/ | ||
+ | HISTCONTROL=ignoredups; | ||
+ | HISTSIZE=1000; | ||
+ | HOSTNAME=redhat9.ittraining.loc; | ||
+ | PWD=/root; export PWD | ||
+ | LOGNAME=root; | ||
+ | HOME=/root; export HOME | ||
+ | LANG=en_US.UTF-8; export LANG | ||
+ | LS_COLORS=rs=0: |