home *** CD-ROM | disk | FTP | other *** search
/ Freelog 9 / Freelog009.iso / BAS / Systeme / ShellUnix / FCHOWN.SH < prev    next >
Linux/UNIX/POSIX Shell Script  |  1998-07-09  |  12KB  |  380 lines

  1. #!/bin/sh
  2. #---------------------------------------------------------------------- 
  3. # NOM                                        
  4. #    fchown = Changement recursif des droits de fichiers particuliers.
  5. # SYNTAXE                                    
  6. #    fchown -h|H          (aide)   
  7. #    fchown [-v] [-o old_user] [-u new_user] [fichiers]
  8. #---------------------------------------------------------------------- 
  9. # VERSION
  10. #    1.0
  11. # DESCRIPTION
  12. #    * Changement recursif des droits (propietes) pour un utilisateur
  13. #    particulier. A la difference de la commande Chown -R, cette
  14. #    procedure peut effectuer le changement de proprietes a partir de la
  15. #    designation d'un nom precis d'utilisateur. Dans le cas ou pour une
  16. #    meme arborescence, il existe des fichiers d'utilisateurs differents,
  17. #    la procedure modifie uniquement les fichiers designes par
  18. #    l'option -u
  19. #    * Cette procedure est pratique via une utilisation en tant que
  20. #    super utilisateur (root).
  21. # OPTIONS
  22. #    -h|H        aide courte ou longue.        
  23. #                                            
  24. #    -v          Mode verbose, par defaut la procedure n'affiche pas les
  25. #                informations d'execution sur la sortie standard.
  26. #                Cette option permet de valider cet affichage.
  27. #                                            
  28. #    -o user     Effectue les modifications pour un utilisateur bien
  29. #                precis. Seul les fichiers appartenant a cet utilisateur
  30. #                sont concernes par la modification. Option tres
  31. #                importante puisqu'elle justifie l'existance de la
  32. #                procedure vis a vis de : chown -R
  33. #                Sauf si desormais cette possibilite est integree
  34. #                a la commande chown(1M), mais peu importe la
  35. #                procedure fait bien son travail !
  36. #    -u user     Le nom du nouveau utilisateur a affecte aux fichiers
  37. #                et aux repertoires.
  38. #    fichiers    Les noms des repertoires et/ou fichiers de depart des
  39. #                modifications. Par defaut, lLa procedure utilise le 
  40. #                repertoire courant (.).
  41. # EXEMPLE(S)
  42. #    * Lancement de l'application avec affichage de l'aide longue:
  43. #        $ fchown -H
  44. #    * Liste l'ensemble des fichiers appartenant a l'utilisateur
  45. #      courant, sans l'option -u aucune modification n'est effectuee,
  46. #      la procedure se transforme alors en commande ls(1M) un peu
  47. #      particuliere :
  48. #        $ fchown /home 
  49. #    * Modifie tous les fichiers du repertoire courant de l'utilisateur
  50. #      other vers l'utilisateur root :
  51. #        $ fchown -u root -o other
  52. # DEPENDANCE(S)
  53. #    find(1M), ls(1M), chown(1M), awk(1M) ou nawk(1M).
  54. #                                            
  55. # VOIR AUSSI
  56. #    chown(1M).
  57. #                                            
  58. # AUTEUR
  59. #    Copyright (c) 1998 Bertrand LE QUELLEC, All Rigths Reserved.
  60. # CONTACT
  61. #   eMail : blq@mygale.org ou blq@wanadoo.fr
  62. #   Url   : http://www.mygale.org/09/blq/ ou http://perso.wanadoo.fr/blq/
  63. #
  64. # Cree : 24/03/98
  65. #---------------------------------------------------------------------- 
  66. # Permission to use, copy, modify, distribute, and sell this software
  67. # and its documentation for any purpose is hereby granted without fee,
  68. # provided that the above copyright notice appear in all copies and
  69. # that both that copyright notice and this permission notice appear in
  70. # supporting documentation, and that the name of Bertrand LE QUELLEC    
  71. # not be used in advertising or publicity pertaining to distribution 
  72. # of the software without specific, written prior permission. Bertrand 
  73. # LE QUELLEC makes no representations about the suitability of
  74. # this software for any purpose. It is provided "as is" without
  75. # express or implied warranty.
  76. #
  77. # THIS SOFTWARE IS PROVIDED BY Bertrand LE QUELLEC `AS IS' AND ANY
  78. # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  79. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  80. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Bertrand LE QUELLEC BE
  81. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  82. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  83. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  84. # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  85. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  86. # OR OTHERWISE)     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  87. # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  88. #---------------------------------------------------------------------- 
  89.  
  90. # ------------------------------------------ 
  91. # ZONE DE DEFINITION DES VARIABLES GLOBALES:
  92. # ------------------------------------------
  93. NOM_PROCEDURE=`basename $0`
  94. LA_PROCEDURE=$0
  95. CD=`pwd`
  96. AWK=`[ -f /usr/bin/nawk ] && echo "nawk" || echo "awk" `
  97.  
  98.  
  99. ##
  100. ## Variables particulieres:
  101. ##
  102. DATE=`date "+%d/%m/%y"`
  103. MODE_COULEUR=0
  104. VISU_HTML=netscape
  105.  
  106.  
  107. ##
  108. ## Les variables concernant l'utilisateur:
  109. ##
  110. DEFAUT_AUTEUR=`whoami`
  111. DEFAUT_EDITEUR=${EDITOR}
  112. DEFAUT_SHELL=${SHELL}
  113.  
  114.  
  115. #---------------------------------------------------------------------- 
  116. # ----------------------------------------- 
  117. # ZONE DE DEFINITION DES FONCTIONS LOCALES:
  118. # -----------------------------------------
  119. # La fonction doit etre precedee d'un commentaire avec en debut de ligne
  120. # le caractere # (diese) repete deux fois.
  121.  
  122. ##
  123. ## En cas d'une interruption la fonction suivante est executee.
  124. ## Les interruptions sont des signaux envoyes au processus du script,
  125. ## par la commande Unix: kill(1). La "capture" de ces signaux est
  126. ## identifiee par la commande Shell: trap definie apres la zone des
  127. ## options.
  128. ##
  129. TrapInterrup()
  130. {
  131.     # Vous pouvez executer des instructions avant une sortie 
  132.     # par signal (ou brutale!).
  133.     exit 1
  134. }
  135.  
  136.  
  137. ##
  138. ## Renvoie le PATH et nom d'un ou plusieurs executables.
  139. ## Si le ou les executables sont introuvables la fonction ne renvoie rien.
  140. ## Dans le cas d'un alias la fonction ne renvoie rien, car le PATH n'est
  141. ## pas recuperable.
  142. ##
  143. Type()
  144. {
  145.     [ $# -ne 0 ] && type $* | ${AWK} '$2=="is" && $4!="alias" {print $NF}'
  146. }
  147.  
  148.  
  149. ##
  150. ## Affiche l'aide indiquee en en-tete du script shell.
  151. ## Ne pas supprimer car cette fonction est utilisee a l'appel de la
  152. ## procedure avec les options -H ou -H
  153. ##
  154. AideProc()
  155. {
  156.     fichier=$1
  157.     niveau=$2
  158.  
  159.     [ -z "$fichier" ] && {
  160.         Erreur "AideProc(): nombre d'argument incorect."
  161.         return 0
  162.     }
  163.  
  164.     [ ! -f "$fichier" ] && {
  165.         [ -f "`basename $fichier`" ] && fichier=`basename $fichier` || {
  166.             Erreur "AideProc(): impossible d'atteindre le fichier $fichier."
  167.             return 0
  168.         }
  169.     }
  170.  
  171.     [ ${niveau:=2} = 2 ] && {
  172.         ${AWK} 'BEGIN {i=2}
  173.             /^#[-]+/{
  174.                 if(--i<=0)exit
  175.                 next
  176.             }
  177.             /^#[     ]*[A-Z]*[     ]*$/{
  178.                 next
  179.             }
  180.             /^#[^!]/{
  181.                 print substr($0,1,80)
  182.             }
  183.             /^#[ \t]*$/{
  184.                 print ""
  185.             }
  186.         ' $fichier | sed -e 's/^#[     ]*//'
  187.     } || {
  188.         ${AWK} '\
  189.             /^#[-]+/{
  190.                 if(--i<=0) exit
  191.                 next
  192.             }
  193.             /^#[^!]/{
  194.                 print substr($0,2,80)
  195.             }
  196.             /^#[ \t]*$/{
  197.                 print ""
  198.             }
  199.         ' i=$niveau $fichier | pg -e
  200.     }
  201. }
  202.  
  203. ##
  204. ## Renvoie le type de la machine ou l'on se trouve et surtout le
  205. ## systeme d'exploitation en cours. La fonction renvoie un des numero
  206. ## suivant en reponse:
  207. ##
  208. ##    inconue            0
  209. ##
  210. ##    SunOs            1
  211. ##    Sun Solaris        2
  212. ##    HP s700            3
  213. ##    HP s800            4
  214. ##    HP s300            5
  215. ##    Silicon Graphic     6
  216. ##    IBM AIX            7
  217. ##
  218. ## Pour recuperer le code retour de la fonction, utilisez la variable $?
  219. ##
  220. Machine()
  221. {
  222.     os=`uname`
  223.  
  224.     [ "$os" = "Solaris" ] && return 2
  225.  
  226.     [ "$os" = "SunOS" ] && {
  227.         [ -f /vmunix ] && return 1 || return 2
  228.     }
  229.     
  230.     [ "$os" = "HP-UX" ] && {
  231.         if uname -a | grep "PA-RISC" 1> /dev/null
  232.         then
  233.             return 3
  234.         elif uname -a | grep "HP-PA" 1> /dev/null
  235.             return 4
  236.         then
  237.             return 5
  238.         fi
  239.     }
  240.  
  241.     [ "$os" = "IRIX" ] && return 6
  242.  
  243.     [ "$os" = "AIX" ] && return 7
  244.  
  245.     return 0
  246. }
  247.  
  248.  
  249. ##
  250. ## Affiche un message en rouge si l'on se trouve dans une fenetre hpterm
  251. ## et se met en attente de 2 secondes.
  252. ## Il est possible de recuperer le code retour de la fonction.
  253. ##
  254. Erreur()
  255. {
  256.     [ $# -eq 0 ] && return -1
  257.  
  258.     echo "\n\t${ROUGE}$*${NORMAL}"
  259.     sleep 2
  260.  
  261.     return 0
  262. }
  263.  
  264.  
  265. ##
  266. ## Permet de visualiser un fichier HTML avec le bon executable:
  267. ##    netscape ou mosaic
  268. ##
  269. VoirHTML ()
  270. {
  271.     fichier="$*"
  272.  
  273.     [ -z "$VISU_HTML" ] && VISU_HTML=mosaic
  274.  
  275.     chemin=`Type $VISU_HTML`
  276.     [ -z "$chemin" ] && VISU_HTML=netscape
  277.  
  278.     chemin=`Type $VISU_HTML`
  279.     [ -z "$chemin" ] && {
  280.         Erreur "Executable du visualiseur HTML non accessible !"
  281.         return 0
  282.     }
  283.  
  284.     $VISU_HTML $fichier &
  285.     return 1
  286. }
  287.  
  288.  
  289. #---------------------------------------------------------------------- 
  290. # ---------------------------------------------- 
  291. # DEFENITION DES VARIABLES LOCALES AU PROGRAMME:
  292. # ----------------------------------------------
  293.  
  294. LE_USER=${DEFAUT_AUTEUR}
  295. OLD_USER=
  296. LE_GROUP=
  297. LE_DIR="."
  298. VERBOSE=0
  299.  
  300.  
  301. #---------------------------------------------------------------------- 
  302. # ---------------------------------------------- 
  303. # DEFENITION DES FONCTIONS LOCALES AU PROGRAMME:
  304. # ----------------------------------------------
  305.  
  306.  
  307.  
  308. #---------------------------------------------------------------------- 
  309. # ------------------------- 
  310. # RECUPERATION DES OPTIONS:
  311. # -------------------------
  312. set -- `getopt hHxvu:o: $*`                
  313. for opt in $*                                            
  314. do                                                             
  315.     case $opt in                                           
  316.         -h) AideProc $LA_PROCEDURE    ; exit 0 ;;
  317.         -H) AideProc $LA_PROCEDURE 3  ; exit 0 ;;
  318.  
  319.         -x) set -x ; shift ;;
  320.  
  321.         -u)    LE_USER="$2" ; shift ; shift ;;
  322.         -o)    OLD_USER="-user $2" ; shift ; shift ;;
  323.         -v)    VERBOSE=1 ; shift ;;
  324.  
  325.         --) shift ; LE_DIR="$*" ; break ;;
  326.     esac                                                        
  327. done                                                          
  328.  
  329.  
  330. #----------------------------------------------------------------------
  331. # AUTRES DEFINITIONS:
  332. # -------------------
  333. trap TrapInterrup 3 2 15    # Recuperation des interruptions 3, 2 et 15
  334.  
  335.  
  336. #----------------------------------------------------------------------
  337. # DEBUT ZONE DU PROGRAMME:
  338. # ------------------------
  339. for un_dir in `echo $LE_DIR`
  340. do
  341.     [ $un_dir != "--" ] && {
  342.         # Traitement recursif sur un repertoire/fichier.
  343.         # Le awk permet de traiter les noms de fichiers avec des espaces, ils sont
  344.         # quelques fois utilises et autorises par certaines applications.
  345.         find $un_dir $OLD_USER -print | awk '{ 
  346.             gsub(/ /, "\\\\ ", $0)
  347.             print $0
  348.         }' | while read file        # L'utilisation du While et non du For est ici importante !
  349.         do
  350.             [ $VERBOSE -eq 1 ] && {
  351.                 echo ""
  352.                 echo ">> `ls -ld "$file" | ${AWK} '{ printf(\"%s %s %s\", $1, $3, $4) }'`\t$file"
  353.             }
  354.  
  355.             [ ! -z "$LE_USER" ] && {
  356.                 chown $LE_USER "$file"
  357.  
  358.                 [ $VERBOSE -eq 1 ] && {
  359.                     echo "<< `ls -ld "$file" | ${AWK} '{ printf(\"%s %s %s\", $1, $3, $4) }'`\t$file"
  360.                 }
  361.             }
  362.         done
  363.     }
  364. done
  365.  
  366.