我有一个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
。请告诉我,为了正确使用这个脚本,我需要做哪些修改。
感谢。
答案 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
'