OVH Cloud OVH Cloud

script bash de débutant

5 réponses
Avatar
thierry.rouillon
Bonsoir.
Mon but est de récupéréer le user and grouup d'un fichier avant écrasement
pour le réinstaller après.
Voici une partie test de mon invention épurée:

#!/bin/bash
echo "test de variable"

FILE=/mnt/lin_e/asselec/facturation/facturation.webprj
user=$(stat -c %U -- "$FILE") groupe=$(stat -c %G -- "$FILE")

echo "user= $user et groupe= $groupe"
echo "est-ce correct? "
read reponse
if ($reponse = "O" |$reponse = "o")
then
echo "poursuite"
chown -R $user:$groupe /mnt/lin_e/asselec/facturation
else
echo "anulation "
fi


le probleme est le suivant
le user est "531" donc ma réponse est:
user= UNKNOWN et groupe= saned

Avec un resultat pareil le chown ne peut pas fonctionner.
Comment corriger de truc? Je voyage depuis des jours sur google pour trouver
une solution mais rien à faire.

Merci de toute aide
--
Thierry de Champagne... pour me repondre remplacer 9 par 9online

5 réponses

Avatar
Stephane Chazelas
2004-12-19, 23:04(+01), thierry.rouillon:
[...]
user=$(stat -c %U -- "$FILE") groupe=$(stat -c %G -- "$FILE")

echo "user= $user et groupe= $groupe"
echo "est-ce correct? "
read reponse
if ($reponse = "O" |$reponse = "o")


if [ "$response" = O ] || [ "$response" = o ]; then

ou

case $response in
o|O) ...
esac

then
echo "poursuite"
chown -R $user:$groupe /mnt/lin_e/asselec/facturation


Ne jamais laisser de variable hors des guillemets a moins
d'avoir une bonne raison de le faire.

chown -R "$user:$groupe" ...

Attention au chown -R sans -P ou le resultat est "unspecified"
pour les liens symboliques.

[...]
le probleme est le suivant
le user est "531" donc ma réponse est:
user= UNKNOWN et groupe= saned

Avec un resultat pareil le chown ne peut pas fonctionner.
Comment corriger de truc? Je voyage depuis des jours sur google pour trouver
une solution mais rien à faire.
[...]


Utilise les uid au lieu des user names.

eval "$(stat -c 'user=%u group=%g')"

--
Stephane

Avatar
thierry.rouillon
Stephane Chazelas nous a gentiment écrit:

2004-12-19, 23:04(+01), thierry.rouillon:
[...]
user=$(stat -c %U -- "$FILE") groupe=$(stat -c %G -- "$FILE")

echo "user= $user et groupe= $groupe"
echo "est-ce correct? "
read reponse
if ($reponse = "O" |$reponse = "o")


if [ "$response" = O ] || [ "$response" = o ]; then

ou

case $response in
o|O) ...
esac

then
echo "poursuite"
chown -R $user:$groupe /mnt/lin_e/asselec/facturation


Ne jamais laisser de variable hors des guillemets a moins
d'avoir une bonne raison de le faire.

chown -R "$user:$groupe" ...

Attention au chown -R sans -P ou le resultat est "unspecified"
pour les liens symboliques.

[...]
le probleme est le suivant
le user est "531" donc ma réponse est:
user= UNKNOWN et groupe= saned

Avec un resultat pareil le chown ne peut pas fonctionner.
Comment corriger de truc? Je voyage depuis des jours sur google pour
trouver une solution mais rien à faire.
[...]


Utilise les uid au lieu des user names.

eval "$(stat -c 'user=%u group=%g')"

He bé.... Ya pas à dire, je suis vraiment un débutant. Merci pour tout...

--
Thierry de Champagne... pour me repondre remplacer 9 par 9online


Avatar
Stephane Chazelas
2004-12-20, 09:02(+00), Stephane Chazelas:
[...]
eval "$(stat -c 'user=%u group=%g')"


stat_output=$(stat -c 'user=%u group=%g' -- "$FILE") || die ...
eval "$stat_output"

devrait aller mieux.

Note que stat est une commande recente de GNU coreutils qui
n'est pas du tout portable.

Les alternatives sont de parser l'output de ls -l mais ce n'est
pas portable ni fiable non plus (tous les ls n'affichent pas le
groupe par defaut et des champs peuvent se retrouver collés).

Sinon, tu as perl ou zsh ou GNU find.

#! /bin/zsh -
die() {
print -ru2 -- "${0:t}:" "$@"
exit 1
}
zmodload -i zsh/stat || die need stat module
stat -H st -- "$FILE" || exit

chown "$st[uid]:$st[gid]" -- ... || die ...

--
Stephane

Avatar
Stephane Chazelas
2004-12-20, 13:03(+01), Etienne de Tocqueville:
Stephane Chazelas writes:

chown -R "$user:$groupe" ...

Attention au chown -R sans -P ou le resultat est "unspecified"
pour les liens symboliques.


Logiquement, le comportement de chown avec "-R" est précisé dans le
man.


Tout a fait. C'etait pour le cas ou on veuille ecrire un script
qui doive marcher sur d'autres machines que la sienne.


Et s'il s'agit de faire un script portable, alors l'argument "-P"
ne convient pas. C'est "-h" sur les différents unix que je pratique.


D'apres la Single Unix Specification, version 3:

-h
If the system supports user IDs for symbolic links, for
each file operand that names a file of type symbolic
link, chown shall attempt to set the user ID of the
symbolic link. If the system supports group IDs for
symbolic links, and a group ID was specified, for each
file operand that names a file of type symbolic link,
chown shall attempt to set the group ID of the symbolic
link. If the system does not support user or group IDs
for symbolic links, for each file operand that names a
file of type symbolic link, chown shall do nothing more
with the current file and shall go on to any remaining
files.
[...]
-P
If the -R option is specified and a symbolic link is
specified on the command line or encountered during the
traversal of a file hierarchy, chown shall change the
owner ID (and group ID, if specified) of the symbolic
link if the system supports this operation. The chown
utility shall not follow the symbolic link to any other
part of the file hierarchy.
-R
Recursively change file user and group IDs. For each
file operand that names a directory, chown shall change
the user ID (and group ID, if specified) of the
directory and all files in the file hierarchy below it.
Unless a -H, -L, or -P option is specified, it is
unspecified which of these options will be used as the
default.


Donc, pour etre POSIX/SUS conformant, il faut utiliser -P. -h ne
garantit pas que les liens symboliques (trouvés lors de la
descente recursive) ne seront pas suivis.

--
Stephane


Avatar
Etienne de Tocqueville
Stephane Chazelas a écrit sur fr.comp.os.unix :

Donc, pour etre POSIX/SUS conformant, il faut utiliser -P. -h ne
garantit pas que les liens symboliques (trouvés lors de la
descente recursive) ne seront pas suivis.


Possible. Mais ce que je voulais dire, c'est qu'avec une telle option
-P, on aura beau être compatible avec la norme, on ne sera plus
compatible avec beaucoup de machines ;-) J'ai regardé sur la dernière
version (dispo ici) de Solaris, de Irix et de HP-UX, aucun des 3 ne
connais ce -P

Et comme moi je suis assez terre à terre, quand je cherche à faire un
script qui portable, avant de vérifier si ça respecte la norme, je
verifie que ça marche sur tous les OS qui sont autour de moi !