访问“sudo”块内的 shell 变量:导出不起作用

访问“sudo”块内的 shell 变量:导出不起作用

我正在编写一个脚本来修复邮件日志文件中缺失的“F”字母。邮件日志文件不断更新。我得到了一个文件名,然后我执行“sudo su”来获得超级用户访问权限。在 sudo 中,我正在修复缺失的“F”。但是,我无法在 sudo 块中使用该文件名。请问有人能帮我如何在 sudo 中导出这些 shell 变量吗?我试过使用 export,但没有用。我创建的代码块如下-

 #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

我认为你的意思是使用 bash 的这里的字符串

sudo su <<< HERE

(您使用的是<<而不是<<<)。

无论如何,sudo在脚本中使用“auto-”命令都不是好主意,因为您会将敏感密码以纯文本形式暴露。您应该以 root 身份运行该脚本(使用sudosu -c)。

更好的是,您应该使用不太常见的用户权限来运行脚本(也许mail?)。

答案2

您有两种简单的可能性。第一种是停止引用传递给 的文本块sudo su,方法是从<< 终止符字符串中删除引号(即使用<<HERE)。在这种情况下,块内的所有 $variable 和反引号(“”)执行都将在传递给 之前进行评估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!"

相关内容