[英]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/hello
和world/*/
)。 您可以用另一层引号解决此问题:
result=$(sudo sh -c "ls -d /home/'$username'/*/")
给定引号的嵌套方式,这不会阻止您的shell扩展$username
,但将使根shell能够在单个模式/home/hello world/*/
上正确地进行glob。
现在,这仍然不完美。 如果该glob匹配多个目录,或者匹配的目录包含空格,您将很难处理问题。 但是在这一点上,我建议您:
话虽这么说,如果您要将另一个用户家中的目录列表放入数组中,则以下内容(我认为是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.