Cat命令输出在*字符方面异常变化


2

我在vSphere下运行的相当标准的Ubuntu 11.04安装上运行以下命令:

sudo cat /home/*/.ssh/authorized_keys

基本上,我使用puppet进行ssh密钥管理,并希望确保密钥存在。这个简单命令的不寻常之处在于,只有两个用户(如果相关的话,在用户上创建的第一个和第三个用户)才会显示密钥,而*应该捕获7或8个用户的家。

有趣的是,如果我跑了

sudo cat /home/user.name/.ssh/authorized_keys

其中user.name是随机用户的名称(不是已经显示的两个中的一个),我不仅从cat获得正确的输出,而且还在下次运行时

sudo cat /home/*/.ssh/authorized_keys

输出显示3个关键文件!前面显示的两个用户有两个文件,第三个文件是我手动查看的密钥文件的用户。

我可以继续玩这个“游戏”,每次我手动指定一个用户,然后运行*命令,之前查看过的用户就会显示在globbed输出中。对我来说,这是不寻常的行为,特别是对于沼泽标准的Ubuntu图像。有什么我想念的吗?*扩展或猫的特殊属性?

编辑:如果我将ssh会话留给服务器,忘记提及此行为“重置”。我的意思是我可以通过SSH注销并重新登录,然后我回到起始条件(只有两个用户帐户带*)。

Answers:


3

请记住,在执行命令行之前,将解析命令行并替换通配符。

如果指定用户名,那么sudo ...命令可以查看该文件,因为它以root身份访问它。

当您键入“*”时,您的USER shell会将其扩展为它可以看到的路径,以及允许当前用户搜索子目录的路径。

您可以尝试在SINGLE引号中包含路径字符串以防止扩展,我不确定这是否可行,因为大多数unix程序都希望shell扩展通配符,因此不会自己执行globbing操作。

编辑:考虑如何实现为所有用户阅读授权密钥文件的目标:

sudo find /home -name "authorized_keys" -exec cat "{}" \; > all_the_data

也许粗糙,但它会工作,因为你以root用户而不是你的用户执行文件搜索。

我想另一种方式:

sudo 'find /home -name "authorized_keys" -print0 | xargs -0 cat' > all_the_data

那个过程计数更好,因为它累积了所有的文件名,然后'cat's他们......但我喜欢第一个,不需要特殊的引用。

由于管道命令,需要围绕整个命令的引号(单个或其他)。find和xargs命令必须以root身份执行。是的,比第一个更复杂。


你对奇怪的整体行为的原因的解释是辉煌的,+ 1,但我并不完全相信。当glob命令无法在直接cat之前看到内容时,为什么sudo cat /home/user.name/.ssh/authorized_keys命令会产生影响包含glob的后续命令输出的持久副作用?是因为shell缓存了它在那里看到的文件吗?
allquixotic

1
好的,第一个解决方案是我对find的了解。我正要问你为什么一个用户出现(使用*),而其他用户则不会,但我发现该用户的ssh文件夹是755而不是其他用户的700.
Richard Martinez

添加:对我来说这似乎很奇怪,look at some files that only root can see;后面的look at files that my user can see命令导致后面的命令“知道”目录结构,因为前一个命令成功地说明了该目录。特别是因为“直接”(非全局)方法不涉及任何shell扩展,所以shell没有找到该目录; 该cat命令是!在一个sudo实例中!
allquixotic

我不能解释持久的副作用,虽然因为它在你注销时'重置',它可能与sudo窗口有关。在权限再次运行之前,sudo将允许您执行操作的那段时间。通常比你执行的最后有效sudo早5分钟或15分钟。
lornix

1
究竟。我的答案确实涉及权限,我只是绕着丛林击败了很长的路...感谢帮助@allquixotic
lornix

0

我没有直接解释为什么globbing正在做它正在做的事情,但我知道如何重写你的脚本来完成你想要的:

我在/ home / *; 如果[-d“/ home / $ {i}”]; 那么sudo cat“/home/${i}/.ssh/authorized_keys”; 网络连接; DONE

我不知道bash的任何功能会导致它以不同的方式根据过去的命令运行,所以它可能是一个错误或一个真正深埋(未记录)的功能。我从不使用globs作为目录; 我总是使用for命令进行for循环。我不相信globs用任何包含的模式做正确的事情/*/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.