【问题标题】:Execute Shell script without sudo password在没有 sudo 密码的情况下执行 Shell 脚本
【发布时间】:2013-07-29 08:35:46
【问题描述】:

我有一个如下所示的 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

它并没有在/usr/local 内创建目录testdir。请告诉我我需要做哪些修改才能使这个脚本正常工作。

谢谢。

【问题讨论】:

  • 好的,据我所知,这与 sudo 无关。只是用户无权创建目录。你熟悉 unix 文件权限吗?
  • 但是,我可以使用命令sudo mkdir /usr/local/testdir 在该位置创建目录,即无需提示密码!
  • 请注意,您应该限制NOPASSWD sudo 仅访问单个脚本,否则任何访问该用户帐户的人基本上都会成为 root...
  • 这个问题说明了sudo make-me-a-sandwichsudo -u honey make-me-a-sandwich之间的区别;前者永远成功;后者可能会也可能不会。

标签: shell sudo


【解决方案1】:

两个问题:

1.) 你说:

sudo -u testuser -H ...

什么意思:以testuser运行命令,他没有写入/usr/local的权限,因此你得到permission denied

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

看来,您只是误解了sudo/etc/sudoers 的工作原理。 -u user 的意思是

-u user' -u (user) 选项使 sudo 以用户身份运行指定的命令 除了根。要指定 uid 而不是用户名,#uid。 当以 uid 形式运行命令时,许多 shell 要求使用 '#' 转义 反斜杠 ('\')。安全策略可能会限制 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
'

并使用下一个作为解决方案:

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

【讨论】:

  • 非常感谢。这对我有用。我是 shell 脚本的初学者。需要多多学习。再次感谢。
猜你喜欢
  • 2016-07-22
  • 2017-04-03
  • 2021-12-15
  • 1970-01-01
  • 2021-09-06
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多