Linux Centos - ' ls -d'命令不会列出文件夹

时间:2013-05-22 10:13:27

标签: linux permissions ls

所以我认为我有一个用户权利问题。 一直在编写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

如果您需要任何其他信息来帮助请求告诉我,我会发布。

1 个答案:

答案 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匹配多个目录,或者匹配的目录包含空格,那么您将很难处理问题。但在这一点上,我建议你:

  • 阅读此建议:Why you shouldn't parse the output of ls?
  • 通过root运行一个正确的脚本来处理找到合适的目录 - 如果它们很短且易于阅读,则单行可以正常运行。一旦事情变得太复杂,从长远来看,编写一个合适的脚本是一个胜利。

话虽如此,如果你想要一个来自另一个用户家的目录列表到一个数组,下面的(我认为是bash)应该这样做,没有解析/home/hello world/*/的问题,并且应该处理空格文件和目录:

ls