Я пишу скрипт для исправления недостающей буквы «F» в файле журнала почты. Файл журнала почты постоянно обновляется. Я получаю имя файла, после чего я делаю sudo su, чтобы получить доступ суперпользователя. Внутри sudo я исправляю пропущенное «F». Однако я не могу использовать это имя файла внутри блока sudo. Кто-нибудь может мне помочь, как я могу экспортировать эти переменные оболочки внутри sudo? Я пытался использовать экспорт, но он не работает. Блок кода, который я создал, выглядит следующим образом:

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

2 ответа2

0

Я думаю, что вы хотели использовать здесь строки bash:

sudo su <<< HERE

(вы используете << вместо <<<).

В любом случае, не рекомендуется использовать команду « sudo » внутри скрипта, поскольку вы предоставляете тонкий пароль в виде простого текста. Вы должны просто запустить этот скрипт от имени пользователя root (либо с помощью sudo либо с помощью su -c).

Более того, вы должны запускать скрипт с меньшими разрешениями для общего пользователя (может быть, mail?).

0

У вас есть 2 простых возможности. Во-первых, нужно прекратить заключать в кавычки блок текста, передаваемый в sudo su , удалив кавычки из строки << terminator (т.е. используйте <<HERE). В этом случае все исполнения $ variable и back-tick (``) внутри блока будут оцениваться перед передачей в sudo su , поэтому вам нужно экранировать их, например, с помощью \$ . Результат:

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

Вторая возможность легче читать. Просто примените sudo только там, где это необходимо. Вам больше не нужен блок кода. Результат:

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!"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .