Linux Centos-&x27;ls-d';司令部赢得';t列出文件夹
所以我想我有一点用户权限问题。 正在编写Web服务器控制面板的脚本 在这个脚本中的某一点上,我将一个用户的所有文件夹列在一个数组中,以便将其与用户输入进行比较。(每个用户都是新客户,每个客户可以有多个站点)。 直到上周星期五我运行此命令时: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”并重试,现在我得到了
[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用户运行一个合适的脚本来处理找到合适的目录的问题——如果一行代码简短且易于阅读,就可以了。一旦事情变得太复杂,编写一个合适的脚本从长远来看是一个胜利
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