我有一些我不明白的奇怪行为。我只是想列出目录中的一些文件:
sudo find /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root
产生:
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/trustdb.gpg
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/private-keys-v1.d
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.extra
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/pubring.kbx~
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.browser
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/pubring.kbx
/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/S.gpg-agent.ssh
所以我知道 .gnupg 目录存在,并且其中有文件。
sudo ls -la /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root
产生:
total 12
drwx------ 3 root root 4096 Sep 21 14:54 .
drwxr-xr-x 3 root root 4096 Aug 24 18:30 ..
drwxr-xr-x 3 root root 4096 Sep 21 14:54 .gnupg
所以该目录本身具有rwx权限。
但该命令sudo ls -la /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*
给出:
ls: cannot access '/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*': No such file or directory
我一遍又一遍地检查了这条路,没有发现任何问题。我有 rwx 权限和 root 级别访问权限。还有什么可以阻止我列出这个目录?
我的最终目标是做一个chmod 600 /home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*
,但也失败了。但现在我宁愿选择 ls。
编辑:它刚刚击中了我。这是否与文件通配有关。 * 是否在 sudo 之前扩展,因此没有 root 访问权限?
答案1
正如您正确指出的那样,扩展顺序是问题的根源。与文件名全局相关的步骤是“文件名扩展”。尽管按扩展顺序来说它是相当晚的(参见这里例如),它被执行前该命令实际上被调用。这意味着例如ls *
在包含 , 的目录中file1.txt
,file2.txt
并且file3.txt
实际上被称为ls file1.txt file2.txt file3.txt
.
现在的问题是调用用户没有进入该.gnupg
目录所需的权限。因此,文件名 glob 的扩展*
将失败。在这种情况下,除非设置特定的 shell 选项,*
将保留文字在命令行上,以便 shell 尝试ls
在文件上执行命令字面意思是*
。因此出现错误消息
cannot access '/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/*'
*
如您所见,它尝试访问名为inside 的文件/home/vsts/work/_temp/tmp.Q8K2bSeNVV/root/home/root/.gnupg/
。
相反,您可以编写一个执行相关操作的 shell 脚本,然后将其称为root
using sudo
。您需要将脚本放置在可从任何地方访问的路径下,例如/usr/local/bin
.