【问题标题】:Linux Centos - 'ls -d' command won't list foldersLinux Centos - 'ls -d' 命令不会列出文件夹
【发布时间】:2013-05-22 10:13:26
【问题描述】:

所以我认为我有一点用户权限问题。 一直在编写 Web 服务器控制面板的脚本。

在此脚本中,我将用户的所有文件夹都列在一个数组中,以便将其与用户输入进行比较。 (每个用户都是一个新客户,每个客户可以有多个站点)。 直到上周五我运行这个命令:

[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

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

【问题讨论】:

    标签: linux permissions ls


    【解决方案1】:

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

    当你运行时:

    sudo ls -d /home/hejhej/*/
    

    你的 shell 试图进行文件名通配。如果它不能读取那个目录,它就不能展开任何东西。所以文字字符串/home/hejhej/*/ 保持原样,并作为参数传递给root 通过sudo 运行的ls。看来您在该目录中没有名为 * 的目录,因此 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/helloworld/*/)。你可以用另一层引号来解决这个问题:

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

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

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

    • 阅读此建议:Why you shouldn't parse the output of ls?
    • 制作一个由 root 运行的适当脚本来处理查找适当的目录 - 如果单行代码简短且易于阅读,则可以。一旦事情变得过于复杂,从长远来看,编写一个合适的脚本是一种胜利。

    话虽如此,如果您想要将另一个用户家中的目录列表放入一个数组中,以下(我认为特定于 bash)应该这样做,没有解析 ls 的问题,并且应该处理文件中的空格和目录:

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

    【讨论】:

    • 谢谢你,它修复了它,你给像我这样的初学者一个很好的解释。已经使用 linux 编写脚本和工作 2 周了,因此非常感谢您提供的信息。
    • 好吧,我已经尝试了一切(我认为),但我无法让它工作。 domainFolders=`sudo sh -c 'ls -d /home/$username/*/ 2>/dev/null'` 它不能调用 VAR $username,而且我找不到一个好的网站来解释不同要使用的符号
    • @Rasmus J.:添加更多信息。
    • 我正在尝试将用户主目录中的所有文件夹列出到一个数组中(没有子文件夹)。我想从我自己的帐户中执行此操作,因为我使用它来管理此服务器上的所有用户和站点。当我现在这样做时,我得到所有文件夹,但都在索引 0 中。我希望它找到的所有文件夹都有单独的索引号。因此,当我回显索引 0 时,它将显示第一个文件夹,回显索引 1 显示第二个文件夹,依此类推。
    猜你喜欢
    • 2014-12-26
    • 2022-01-08
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多