Acceso a variables de shell dentro del bloque 'sudo': la exportación no funciona


0

Estoy escribiendo un script para corregir una letra 'F' que falta en un archivo de registro de correo. El archivo de registro de correo se actualiza continuamente. Recibo un nombre de archivo, después de eso estoy haciendo 'sudo su' para obtener acceso de superusuario. Dentro de sudo, estoy arreglando una 'F' que falta. Sin embargo, no puedo usar ese nombre de archivo dentro del bloque sudo. ¿Alguien puede ayudarme a exportar estas variables de shell dentro de sudo? Intenté usar exportar pero no funciona. El bloque de código que he creado es el siguiente:

 #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;

Debe permitir que se ingrese la contraseña de sudo, lo cual no se permite. ¿Estás seguro de que eres root cuando ejecutas este script?
MariusMatutiae

Sí, estoy seguro de MariusMatutiae. Obtengo acceso root cuando ejecuto este script.
user286009 01 de

@MariusMatutiae ¿Encontró una respuesta?
user286009

No uses comillas HERE. Úselo como:sudo su<<HERE
Anubhava

@anubhava: Gracias Anubhava. Lo intentaré dentro de un minuto. Solo una pequeña consulta: ¿hacer esto me permitirá crear una variable dentro del bloque sudo? por ejemplo, primera línea = head -1 $filename?
user286009

Respuestas:


0

Creo que querías usar las cuerdas aquí de bash :

sudo su <<< HERE

(estás usando en <<lugar de <<<).

De cualquier manera, no es una buena idea tener un sudocomando "auto " dentro de un script, ya que está exponiendo una contraseña delicada como texto sin formato. Simplemente debe ejecutar ese script como root (ya sea con sudoo su -c).

Aún mejor, debe ejecutar el script con los permisos de usuario menos comunes ( mail¿ tal vez ?).


0

Tienes 2 posibilidades simples. El primero es dejar de citar el bloque de texto que se pasa sudo su, eliminando las comillas de la << cadena del terminador (es decir, usar <<HERE). En este caso, todas las ejecuciones $ variable y back-tick (``) dentro del bloque se evaluarán antes de pasar a sudo su, por lo que debe escapar de ellas, \$por ejemplo. El resultado es:

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 segunda posibilidad es más fácil de leer. Simplemente aplique sudo solo cuando sea necesario. Ya no necesita un bloque de código. El resultado es:

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!"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.