gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:31 24 4
gpt4 key购买 nike

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

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

最佳答案

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

当你运行时:

sudo ls -d /home/hejhej/*/

您的 shell 试图进行文件名匹配。如果它无法读取该目录,则无法展开任何内容。所以文字字符串 /home/hejhej/*/ 保持原样,并作为参数传递给 root 运行的 ls 通过 须藤。您似乎在该目录中没有名为 * 的目录,因此 ls 失败。

您需要由 sudo 启动的 shell 才能在此处进行 globbing。一种选择可能是:

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"),上面的内容将不起作用 - root shell 将看到两个“ token ” "(/home/helloworld/*/)。你可以用另一层引号来解决这个问题:

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

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

现在,这还不够完美。如果该 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 Centos - 'ls -d' 命令不会列出文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com