J'écris un script pour corriger une lettre "F" manquante dans un fichier journal de courrier. Le fichier journal de messagerie est mis à jour en permanence. Je reçois un nom de fichier, après cela, je fais 'sudo su' pour obtenir un accès superutilisateur. Dans sudo, je répare un 'F' manquant. Cependant, je ne peux pas utiliser ce nom de fichier dans le bloc sudo. S'il vous plaît, est-ce que quelqu'un peut m'aider à exporter ces variables shell à l'intérieur de sudo? J'ai essayé d'utiliser export mais cela ne fonctionne pas. Le bloc de code que j'ai créé est le suivant-
#Script to solve F issue
#----------------------------------------
#By Kapil Shirsath
#----------------------------------------
cd /var/spool/mail #mail files reside in mail folder
echo "Entered in mail folder"
filename=`ls -lrt 99999*| sort -k 5 -rn | head -1 | tr -s " " "," | cut -d "," -f "8"` # this will list the file with maximum size`
echo "File with maximum size is $filename"
echo "----------------------------------------------------"
echo "Is it the file expected?(y/n)"
read choice
if test $choice == "n"
then
echo "Exiting...."
exit;
fi;
c=1
while [ $c -le 5 ]
do
ls -lrt $filename
echo $filename
sleep 3
c=`expr $c + 1`
done
echo "---------------------------------------------------"
sudo su<<'HERE' #this will give you super user permissions
echo "Got root access"
echo "First line of the file is as below :"
head -1 $filename
echo "---------------------------------------"
firstline=`head -1 $filename`
echo "Repeat : $firstline"
echo $firstline | grep ^"rom" >/dev/null
if test $? -eq 0
then
ex -s $filename <<'EOF'
1s/^/F/
:wq
EOF
echo "F issue fixed!"
HERE
c=1
while [ $c -le 5 ]
do
ls -lrt $filename
sleep 3
c=`expr $c + 1`
done
echo "---------------------------------------------------"
else
echo "Not finding the missing 'F' ! !! Kindly check with your system "
exit;
fi;
HERE
. Utilisez-le comme:sudo su<<HERE
head -1 $filename
?Réponses:
Je pense que vous vouliez utiliser les chaînes de bash :
(vous utilisez
<<
au lieu de<<<
).Quoi qu'il en soit, ce n'est pas une bonne idée d'avoir une
sudo
commande "auto " dans un script, car vous exposez un mot de passe délicat sous forme de texte brut. Vous devriez juste exécuter ce script en tant que root (avecsudo
ousu -c
).Mieux encore, vous devriez exécuter le script avec les autorisations utilisateur communes les moins importantes (peut
mail
- être ?).la source
Vous avez 2 possibilités simples. La première consiste à cesser de citer le bloc de texte transmis dans
sudo su
, en supprimant les guillemets de la<<
chaîne de terminaison (c'est-à-dire utilisation<<HERE
). Dans ce cas, toutes les exécutions $ variable et back-tick (``) à l'intérieur du bloc seront évaluées avant d'être passées àsudo su
, vous devez donc leur échapper, par\$
exemple. Le résultat est:La 2ème possibilité est plus facile à lire. Il suffit d'appliquer sudo que si nécessaire. Vous n'avez plus besoin d'un bloc de code. Le résultat est:
la source