Accéder aux variables du shell dans le bloc 'sudo': l'exportation ne fonctionne pas

0

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;
utilisateur286009
la source
Vous devez autoriser la saisie du mot de passe sudo, ce que vous ne faites pas. Êtes-vous sûr d’être root lorsque vous exécutez ce script?
MariusMatutiae
Oui. Je suis sûr que Marius Matutiae. Je reçois un accès root lorsque je lance ce script.
user286009
@MariusMatutiae Avez-vous trouvé une réponse?
user286009
Ne pas utiliser la citation autour HERE. Utilisez-le comme:sudo su<<HERE
anubhava
@anubhava: Merci Anubhava. Je vais l'essayer dans une minute. Juste une petite requête- Cela me permettra de créer une variable dans le bloc sudo? par exemple, firstline = head -1 $filename?
user286009

Réponses:

0

Je pense que vous vouliez utiliser les chaînes de bash :

sudo su <<< HERE

(vous utilisez <<au lieu de <<<).

Quoi qu'il en soit, ce n'est pas une bonne idée d'avoir une sudocommande "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 (avec sudoou su -c).

Mieux encore, vous devriez exécuter le script avec les autorisations utilisateur communes les moins importantes (peut mail- être ?).

Felipe Lema
la source
0

Vous avez 2 possibilités simples. La première consiste à cesser de citer le bloc de texte transmis danssudo 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:

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

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:

echo "First line of the file is as below :"
sudo head -1 $filename
echo "---------------------------------------"
firstline=`sudo head -1 $filename`
echo "Repeat : $firstline"
echo $firstline | grep ^"rom" >/dev/null
if test $? -eq 0
then
sudo ex -s $filename <<'EOF'
1s/^/F/
:wq
EOF
echo "F issue fixed!"
meuh
la source