
Estou escrevendo um script para corrigir uma letra 'F' ausente em um arquivo de log de e-mail. O arquivo de log de correio é atualizado continuamente. Estou recebendo um nome de arquivo, depois faço 'sudo su' para obter acesso de superusuário. Dentro do sudo, estou consertando aquele 'F' ausente. No entanto, não consigo usar esse nome de arquivo dentro do bloco sudo. Por favor, alguém pode me ajudar como posso exportar essas variáveis do shell dentro do sudo? Tentei usar a exportação, mas não funcionou. O bloco de código que criei é o seguinte:
#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;
Responder1
Você citou o delimitador heredoc:
sudo su<<'HERE'
Variáveis em um heredoc não são expandidas se o delimitador estiver entre aspas.Dos documentos:
Se algum personagem empalavrasão citados, odelimitadoré o resultado da remoção de cotação empalavra, e as linhas no documento aqui não são expandidas. Sepalavranão está entre aspas, todas as linhas do documento aqui estão sujeitas a expansão de parâmetros, substituição de comandos e expansão aritmética, a sequência de caracteres
\newline
é ignorada e '\
' deve ser usado para citar os caracteres '\
', '$
' e '`
'.
Apenas use:
sudo su <<HERE
Exemplo:
$ a=1; cat <<HERE
> $a
> HERE
1
$ a=1; cat <<'HERE'
> $a
> HERE
$a