Linux Centos-&x27;ls-d';司令部赢得';t列出文件夹

Linux Centos-&x27;ls-d';司令部赢得';t列出文件夹,linux,permissions,ls,Linux,Permissions,Ls,所以我想我有一点用户权限问题。 正在编写Web服务器控制面板的脚本 在这个脚本中的某一点上,我将一个用户的所有文件夹列在一个数组中,以便将其与用户输入进行比较。(每个用户都是新客户,每个客户可以有多个站点)。 直到上周星期五我运行此命令时: [rjo@WEB ~]$ sudo ls -d /home/hejhej/*/ 2>/dev/null 从我自己的用户(rjo)运行命令时,一切正常。但是现在,当我运行命令时,什么也没有发生,所以我删除了“2>/dev/null”并重试,现在我得到了

所以我想我有一点用户权限问题。 正在编写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@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
通过
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/hello
world/*/
)。您可以使用另一层引号修复这一问题:

result=$(sudo sh-c“ls-d/home/'$username'/*/”)
考虑到引号是如何嵌套的,这不会阻止shell扩展
$username
,但会使根shell在单个模式
/home/hello world/*/
上正确地全局显示

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

  • 阅读以下建议:
  • 让root用户运行一个合适的脚本来处理找到合适的目录的问题——如果一行代码简短且易于阅读,就可以了。一旦事情变得太复杂,编写一个合适的脚本从长远来看是一个胜利
也就是说,如果您希望将另一个用户家中的目录列表放入一个数组中,那么以下(我认为特定于bash)应该可以做到,而不存在解析
ls
的问题,并且应该处理文件和目录中的空格:

在读取-r-d$'\0'目录时执行
数组+=(“$dir”)

完成<如果您的用户在
/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/hello
world/*/
)。您可以使用另一层引号修复此问题:

result=$(sudo sh-c“ls-d/home/'$username'/*/”)
考虑到引号是如何嵌套的,这不会阻止shell扩展
$username
,但会使根shell在单个模式
/home/hello world/*/
上正确地全局显示

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

  • 阅读以下建议:
  • 让root用户运行一个合适的脚本来处理找到合适的目录的问题——如果一行程序简短且易于阅读,那么它就可以了。一旦事情变得太复杂,从长远来看,写一个合适的脚本是一个胜利
这就是说,如果您想要从另一个用户的家中获得一个目录列表到一个数组中,那么下面的(我认为特定于bash)应该可以做到,wi