Page 1 sur 1

[tty] .bashrc de root ne se charge pas (résolu)

Publié : lun. 29 sept. 2014, 21:11
par bobo
Bonjour,

Un comportement surprenant en root en tty : le .bashrc semble ne pas se charger. Symptômes : pas de coloration du prompt, alias usuels non opérationnels

Cas testés :
— tty + root : .bashrc semble ne pas être chargé
— tty + user : prompt coloré + alias ok
— X + user : prompt coloré + alias ok
— X + user + su pour se connecter en root : prompt coloré + alias ok
— ssh sur le RPi en tant qu'user : prompt coloré + alias ok
— ssh sur le RPi en tant qu'user, puis su pour se connecter en root : prompt coloré + alias ok
— ssh sur le RPi en tant que root¹ : .bashrc semble ne pas être chargé

(le comportement tty est valable sur mon PC fixe/archlinux et mon RPi/archlinuxarm)

C'est tout de même curieux ce comportement. Quelqu'un pourait-il m'éclairer sur ce comportement ?

______________________________________________________
¹ : il faut que je configure ssh pour interdire cela

Re: [tty] .bashrc de root ne se charge pas

Publié : lun. 29 sept. 2014, 21:27
par benjarobin
Depuis le tty en root :

Code : Tout sélectionner

echo $SHELL
echo $HOME
cat /root/.bash_profile
head /root/.bashrc

Re: [tty] .bashrc de root ne se charge pas

Publié : lun. 29 sept. 2014, 21:45
par bobo

Code : Tout sélectionner

[root@rpi etc]# echo $SHELL
/bin/bash
[root@rpi etc]# echo $HOME
/root
[root@rpi etc]# cat /root/.bash
.bash_history  .bashrc        
[root@rpi etc]# cat /root/.bash_profile 
cat: /root/.bash_profile: No such file or directory
[root@rpi etc]# head /root/.bashrc
#  Gestion du ls : couleur + touche pas aux accents
alias ls='ls --classify --tabsize=0 --literal --color=auto --show-control-chars --human-readable'
alias la="ls -a --color"
alias ll="ls -l --color"
alias lla="ls -al --color"

# bridage du rm
alias rm='rm -i'

# Quelques alias pratiques
Fichier .bash_profile manquant… Je ne trouve pas de smiley qui se gratte la tête, ah si :zarb:

Édition :

En copiant celui du compte utilisateur dans /root, .bashrc est chargé. Maintenant j'aurais plusieurs questions :
— je n'ai jamais créé de .bash_profile, comment se fait-il que mon profil utilisateur en soit doté ?
— comment se fait-il que ce mécanisme ne fonctionne pas pour root ?
— c'est quoi un fichier .bash_profile ?
(je vais un peu lire le « man bash »)

Édition 2 : (après lecture de « man bash »)
Au vu de l'importance du fichier .bash_profile, et de ce que dit la section INVOCATION, il s'agit d'un shell interactif. Premièrement /etc/profile est chargé, ensuite bash recherche dans l'ordre les fichiers ~/.bash_profile, ~/.bash_login, ~/.profile. Le premier accessible en lecture est utilisé.

Code : Tout sélectionner

cat ~/.bash_profile 
#
# ~/.bash_profile
#

[[ -f ~/.bashrc ]] && . ~/.bashrc
Si je comprends bien, là se trouve la référence à .bashrc, la syntaxe est obscure « [-f ~/.bashrc] » ressemblant à une condition de if

:zarb: Il me reste mes 2 questions :
— je n'ai jamais créé de .bash_profile, comment se fait-il que mon profil utilisateur en soit doté ?
— comment se fait-il que ce mécanisme ne fonctionne pas pour root ?

Re: [tty] .bashrc de root ne se charge pas

Publié : lun. 29 sept. 2014, 23:14
par benjarobin
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists.
En gros c'est normal que ~/.bashrc ne soit pas lu pour un shell de login (la connexion via un tty est un shell de login)
bobo a écrit :je n'ai jamais créé de .bash_profile, comment se fait-il que mon profil utilisateur en soit doté ?
Lors de la création d'un utilisateur, le contenu de ce dossier est copié :

Code : Tout sélectionner

ls -a /etc/skel
bobo a écrit :comment se fait-il que ce mécanisme ne fonctionne pas pour root ?
Je ne comprends pas ta question. Tout fonctionne comme cela devrait fonctionner.
bobo a écrit :la syntaxe est obscure « [-f ~/.bashrc] » ressemblant à une condition de if
Rien d'obscure. Ceci : "[[ -f ~/.bashrc ]]" est une condition qui exprime : si le fichier suivant existe alors retourne "vrai". La partie suivante : "&&", est un opérateur conditionnel, si la partie à gauche est vrai alors on exécute la partie à droite. Et finalement : ". ~/.bashrc", ceci exprime tout simplement l'inclusion/la lecture du fichier .bashrc

Bref, il suffit de faire en root :

Code : Tout sélectionner

cp /etc/skel/.bash_profile /root/

Re: [tty] .bashrc de root ne se charge pas

Publié : lun. 29 sept. 2014, 23:35
par bobo
Merci pour les explications ! :chinois: je n'avais pas pensé au /etc/skel.
benjarobin a écrit :
bobo a écrit :comment se fait-il que ce mécanisme ne fonctionne pas pour root ?
Je ne comprends pas ta question. Tout fonctionne comme cela devrait fonctionner.
Voici ce que je comprends de tes explications : l'« utilisateur » root existe après l'installation, le contenu de /etc/skel n'est donc pas utilisé pour générer le contenu de /root, donc pas de /root/.bash_profile. Ma question paraît alors absurde :mrgreen:

Dernier point :
benjarobin a écrit :En gros c'est normal que ~/.bashrc ne soit pas lu pour un shell de login (la connexion via un tty est un shell de login)
Il se trouve qu'en faisant une copie de .bash_profile dans /root, en me logguant en root par tty j'ai la coloration du prompt et les alias. J'en déduirais que la connection via un tty est un shell interactif.

Re: [tty] .bashrc de root ne se charge pas (résolu)

Publié : mar. 30 sept. 2014, 00:11
par benjarobin
Depuis un tty tu as un shell de login. Et en effet le fichier .bashrc n'est pas lu, mais à la place c'est le .bash_profile. Ici l'astuce est d'inclure le fichier .bashrc quand on lit le .bash_profile. Ainsi le comportement est le même quelque soit la façon dont est lancé bash.