执行没有sudo密码的Shell脚本

时间:2013-07-29 08:35:47

标签: shell sudo

我有一个shell脚本,如下所示。

#!/bin/bash
sudo -u testuser -H sh -c "
mkdir /usr/local/testdir;
if [ $? -eq 0 ];then
    echo "Successfull";
else
    echo "Unsuccessfull";
fi
"

我已经授权用户testuser使用sudo执行shell脚本,但是没有询问密码。为此,我在/etc/sudoers文件中添加以下行,

testuser ALL=(ALL) NOPASSWD: ALL

它运行正常,我可以使用sudo运行命令,但不需要密码。但是上面的shell脚本总是发出put ass,

mkdir: cannot create directory `/usr/local/testdir': Permission denied
Successfull

并没有在testdir内创建目录/usr/local。请告诉我,为了正确使用这个脚本,我需要做哪些修改。

感谢。

1 个答案:

答案 0 :(得分:4)

两个问题:

1。)你告诉:

sudo -u testuser -H ...

是什么意思:以testuser运行命令,他无权写入/usr/local,因此您获得permission denied

当您删除-u testuser时,该命令将以root身份运行(默认情况下)(没有testuser的密码)并将创建目录。

似乎,您只是误解了sudo/etc/sudoers的工作原理。 -u user意味着

  

-u user'-u(user)选项使sudo以用户身份运行指定的命令   除了root之外。要指定uid而不是用户名,请注意#uid。   当将命令作为uid运行时,许多shell要求使用a来转义'#'   反斜杠('\')。安全策略可能会限制uid   到密码数据库中列出的那些。 sudoers政策允许   只要targetpw,不在密码数据库中的uid   选项未设置。其他安全策略可能不支持此功能。

2。)Successfull消息的第二个问题。

您对sh -c使用双引号Variable expansion已完成 sh -c甚至开始。因此,请使用单引号,并获得正确的Unsuccessfull消息:

sudo -u testuser -H sh -c '
mkdir /usr/local/testdir
if [ $? -eq 0 ];then
    echo "Successfull";
else
    echo "Unsuccessfull";
fi
'

并使用next作为解决方案:

sudo -H sh -c '
mkdir /usr/local/testdir
if [ $? -eq 0 ];then
    echo "Successfull";
else
    echo "Unsuccessfull";
fi
'