所以我认为我有一个用户权利问题。 一直在编写Webserver控制面板的脚本。
在这个脚本的某一点上,我将用户的所有文件夹列入一个数组,这样我就可以将它与用户输入进行比较。 (每个用户都是新客户,每个客户可以拥有多个站点)。 上周五,当我运行这个命令时,直到星期五:
[rjo@WEB ~]$ sudo ls -d /home/hejhej/*/ 2>/dev/null
从我自己的用户(rjo)运行命令一切正常。但是现在当我运行命令时没有任何反应,所以我删除了“2> / dev / null”并再次尝试,现在我得到了这个:
[rjo@WEB ~]$ sudo ls -d /home/hejhej/*/
ls: cannot access /home/hejhej/*/: No such file or directory
但是从root运行它时一切正常:
[root@WEB ~]# ls -d /home/hejhej/*/
/home/hejhej/bumbum.dk/
这是关于我的用户来自visudo文件的行。
rjo ALL=(ALL) NOPASSWD: ALL
如果您需要任何其他信息来帮助请求告诉我,我会发布。
答案 0 :(得分:1)
如果您的用户没有足够的/home/hejhej
权限来列出其内容,就会发生这种情况。
当你跑步时:
sudo ls -d /home/hejhej/*/
你的 shell试图进行文件名通配。如果它无法读取该目录,则无法展开任何内容。因此,文字字符串/home/hejhej/*/
保持原样,并作为参数传递给ls
root
通过sudo
运行的参数。您似乎在该目录中没有名为*
的目录,因此ls
失败。
你需要sudo
启动的shell在这里进行通配。一种选择可能是:
sudo sh -c 'ls -d /home/hejhej/*/'
如果你想让搜索的文件夹包含一个shell变量,那么'
硬引号就不会这样做 - 这可以防止你的shell通常(好)但也可以防止你的shell进行变量扩展(这里不好) )。您应该使用双引号("
),以便您的shell完成变量扩展:
sudo sh -c "ls -d /home/$username/*/"
如果要将该命令的输出捕获到变量中,请使用$()
形式的命令替换而不是反引号(`
) - 更容易引用:
result=$(sudo sh -c "ls -d /home/$username/*/")
现在,如果$username
可以包含空格(比如说username="hello world"
),那么上面的内容将无效 - 根shell会看到两个“标记”(/home/hello
和{{1} })。您可以使用另一层引号来解决这个问题:
world/*/
考虑引号是如何嵌套的,这不会阻止你的shell扩展result=$(sudo sh -c "ls -d /home/'$username'/*/")
,但会使root shell在单一模式$username
上正确地实现。
现在,这仍然不完美。如果glob匹配多个目录,或者匹配的目录包含空格,那么您将很难处理问题。但在这一点上,我建议你:
话虽如此,如果你想要一个来自另一个用户家的目录列表到一个数组,下面的(我认为是bash)应该这样做,没有解析/home/hello world/*/
的问题,并且应该处理空格文件和目录:
ls