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;
HERE
. Úselo como:sudo su<<HERE
head -1 $filename
?Respuestas:
Creo que querías usar las cuerdas aquí de bash :
(estás usando en
<<
lugar de<<<
).De cualquier manera, no es una buena idea tener un
sudo
comando "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 consudo
osu -c
).Aún mejor, debe ejecutar el script con los permisos de usuario menos comunes (
mail
¿ tal vez ?).fuente
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 asudo su
, por lo que debe escapar de ellas,\$
por ejemplo. El resultado es: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:
fuente