sudo su를 수행한 후 쉘 변수를 사용하는 방법

sudo su를 수행한 후 쉘 변수를 사용하는 방법

메일 로그 파일에 누락된 '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;

답변1

heredoc 구분 기호를 인용했습니다.

sudo su<<'HERE'

구분 기호가 인용된 경우 heredoc의 변수는 확장되지 않습니다.문서에서:

안에 문자가 있으면단어인용되어 있으며,구분 기호에 대한 견적 제거 결과입니다.단어, 여기 문서의 줄은 확장되지 않습니다. 만약에단어가 인용되지 않은 경우 here-document의 모든 행에는 매개변수 확장, 명령 대체 및 산술 확장이 적용되며 문자 순서 \newline는 무시되며 ' ', ' ' 및 ' ' \문자를 인용하려면 ' '를 사용해야 합니다 .\$`

그냥 사용:

sudo su <<HERE

예:

$ a=1; cat <<HERE
> $a
> HERE
1
$ a=1; cat <<'HERE'
> $a
> HERE    
$a

관련 정보