
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. Obtengo un nombre de archivo, luego hago 'sudo su' para obtener acceso de superusuario. Dentro de sudo, estoy arreglando la '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;
Respuesta1
Usted citó el delimitador heredoc:
sudo su<<'HERE'
Las variables en un heredoc no se expanden si se cita el delimitador.De los documentos:
Si algún personaje enpalabrase citan, eldelimitadores el resultado de la eliminación de la cotización enpalabra, y las líneas del documento aquí no están expandidas. Sipalabrano está entre comillas, todas las líneas del documento aquí están sujetas a expansión de parámetros, sustitución de comandos y expansión aritmética, la secuencia de caracteres
\newline
se ignora y '\
' debe usarse para citar los caracteres '\
', '$
' y '`
'.
Solo usa:
sudo su <<HERE
Ejemplo:
$ a=1; cat <<HERE
> $a
> HERE
1
$ a=1; cat <<'HERE'
> $a
> HERE
$a