Acessando variáveis do shell dentro do bloco 'sudo': a exportação não funciona

0

Estou escrevendo um script para corrigir uma letra 'F' ausente em um arquivo de log de mensagens. O arquivo de log de mensagens está sendo atualizado continuamente. Eu estou recebendo um nome de arquivo, depois disso eu estou fazendo 'sudo su' para obter acesso de superusuário. Dentro do sudo, estou consertando um 'F' faltando. No entanto, não consigo usar esse nome de arquivo dentro do bloco sudo. Por favor alguém pode me ajudar como eu posso exportar essas variáveis de shell dentro do sudo? Eu tentei usar exportação, mas não está funcionando. 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;
    
por user286009 01.07.2015 / 06:48

2 respostas

0

Acho que você pretendia usar strings de bash: :

sudo su <<< HERE

(você está usando << em vez de <<< ).

De qualquer maneira, não é uma boa ideia ter um comando "auto- sudo " dentro de um script, pois você está expondo uma senha delicada como texto simples. Você deve apenas executar esse script como root (com sudo ou su -c ).

Melhor ainda, você deve executar o script com permissões de usuário menos comuns (talvez mail ?).

    
por 02.07.2015 / 13:58
0

Você tem 2 possibilidades simples. A primeira é parar de citar o bloco de texto sendo passado para sudo su , removendo as aspas do << string terminadora (ou seja, use <<HERE ). Neste caso, todas as variáveis $ e back-tick ('') execuções dentro do bloco serão avaliadas antes de serem passadas para sudo su , então você precisa escapar deles com \$ por exemplo. O resultado é:

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

A segunda possibilidade é mais fácil de ler. Basta aplicar o sudo somente onde necessário. Você não precisa mais de um bloco de código. O resultado é:

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!"
    
por 04.07.2015 / 14:43