Je veux obtenir le répertoire personnel de tout utilisateur avec l'écho.
echo ~puchuu
>> /home/puchuu
Mais je ne peux pas utiliser la variable
echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
Je veux obtenir le répertoire personnel de tout utilisateur avec l'écho.
echo ~puchuu
>> /home/puchuu
Mais je ne peux pas utiliser la variable
echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
user=pi
user_home=$(bash -c "cd ~$(printf %q "$user") && pwd")
HINWEIS: La raison pour laquelle cela est sûr est que bash (même les versions antérieures à 4.4) possède son propre fichier printf
qui comprend :
%q quote the argument in a way that can be reused as shell input
Voir : help printf
# "ls /" is not dangerous so you can try this on your machine
# But, it could just as easily be "sudo rm -rf /*"
$ user="root; ls /"
$ printf "%q" "$user"
root\;\ ls\ /
# This is what you get when you are PROTECTED from code injection
$ user_home=$(bash -c "cd ~$(printf "%q" "$user") && pwd"); echo $user_home
bash: line 0: cd: ~root; ls /: No such file or directory
# This is what you get when you ARE NOT PROTECTED from code injection
$ user_home=$(bash -c "cd ~$user && pwd"); echo $user_home
bin boot dev etc home lib lib64 media mnt ono opt proc root run sbin srv sys tmp usr var /root
$ user_home=$(eval "echo ~$user"); echo $user_home
/root bin boot dev etc home lib lib64 media mnt ono opt proc root run sbin srv sys tmp usr var
Si vous faites cela parce que vous exécutez quelque chose comme root
alors vous pouvez utiliser la puissance de sudo :
user=pi
user_home=$(sudo -u "$user" sh -c 'echo $HOME')
Si ce n'est pas le cas, vous pouvez l'obtenir auprès de /etc/passwd
. Il existe déjà de nombreux exemples d'utilisation de eval
et getent
alors je vais donner une autre option :
user=pi
user_home=$(awk -v u="$user" -v FS=':' '$1==u {print $6}' /etc/passwd)
Je ne l'utiliserais vraiment que si j'avais un script bash avec beaucoup d'autres oneliners awk et aucune utilisation de cut
. Alors que beaucoup de gens aiment faire du "code golf" pour utiliser le moins de caractères possible pour accomplir une tâche, je préfère le "tool golf" parce qu'utiliser moins d'outils donne à votre script une plus petite "empreinte de compatibilité". De plus, cela représente moins de pages de manuel à lire par votre collègue ou votre futur vous-même pour y comprendre quelque chose.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.