繁体   English   中英

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

[英]Linux Centos - 'ls -d' command won't list folders

所以我认为我有一个小小的用户权限问题。 已经编写了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@WEB ~]# ls -d /home/hejhej/*/
/home/hejhej/bumbum.dk/

这是有关visudo文件中我的用户的行。

rjo     ALL=(ALL)       NOPASSWD: ALL

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

如果您的用户对/home/hejhej没有足够的权限来列出其内容,则会发生这种情况。

运行时:

sudo ls -d /home/hejhej/*/

您的 shell尝试进行文件名遍历。 如果无法读取该目录,则无法扩展任何内容。 因此,文字字符串/home/hejhej/*/保持原样,并作为参数通过sudo传递给root运行的ls 看来您在该目录中没有名为*的目录,所以ls失败。

您需要以sudo开头的shell在此处进行globing。 一种选择可能是:

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" ),则上面的内容将不起作用-根外壳将看到两个“令牌”( /home/helloworld/*/ )。 您可以用另一层引号解决此问题:

result=$(sudo sh -c "ls -d /home/'$username'/*/")

给定引号的嵌套方式,这不会阻止您的shell扩展$username ,但将使根shell能够在单个模式/home/hello world/*/上正确地进行glob。

现在,这仍然不完美。 如果该glob匹配多个目录,或者匹配的目录包含空格,您将很难处理问题。 但是在这一点上,我建议您:

  • 阅读以下建议: 为什么不应该解析ls的输出?
  • 由root用户运行适当的脚本以处理查找适当的目录-如果单行代码简短且易于阅读,则可以使用单行代码。 一旦事情变得太复杂,从长远来看,编写适当的脚本是一个胜利。

话虽这么说,如果您要将另一个用户家中的目录列表放入数组中,则以下内容(我认为是bash专用)应该做到这一点,而不会解析ls的问题,并且应该处理文件和目录中的空间:

while read -r -d $'\0' dir ; do
  array+=("$dir")
done < <(sudo find "/home/$username" -maxdepth 1 -mindepth 1 -print0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM