Вывод команды Cat необычно различается в отношении символа *

584
Richard Martinez

Я запускаю следующую команду на довольно стандартной установке Ubuntu 11.04, работающей под vSphere:

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 ключевых файла! Два файла для двух ранее показанных пользователей и третий файл, который является пользователем, файл ключа которого я только что посмотрел вручную.

Я могу продолжать играть в эту «игру», и каждый раз, когда я вручную указываю пользователя, а затем запускаю команду *, этот ранее просматриваемый пользователь отображается в выводе с глобусом. Для меня это необычное поведение, особенно для стандартного образа Ubuntu. Есть что-то, чего мне не хватает? Особые свойства * расширения или кота?

Изменить: Забыл упомянуть, что это поведение "сбрасывается", если я оставляю сеанс SSH на сервер. Под этим я подразумеваю, что могу выйти из системы и войти обратно через SSH, и я вернулся к начальным условиям (только две учетные записи пользователя показаны с *).

2

2 ответа на вопрос

3
lornix

Помните, что командная строка анализируется и подстановочные знаки заменяются ДО того, как она будет выполнена.

Если вы укажете имя пользователя, то команда sudo ... сможет увидеть файл, потому что он обращается к нему как root.

Когда вы набираете '*', ваша оболочка USER расширяет ее до путей, которые она может видеть, ну ... путей, которые позволяют вашему текущему пользователю искать в подкаталогах.

Вы можете попытаться заключить строку пути в одиночные кавычки, чтобы предотвратить расширение, я не уверен, что это сработает, так как большинство Unix-программ ожидают, что оболочка будет расширять символы подстановки и, следовательно, сами не выполняют действия по смещению.

РЕДАКТИРОВАТЬ: мысль о том, как достичь своей цели чтения файлов авторизованных ключей для всех пользователей:

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 

Это лучше по количеству процессов, так как он накапливает все имена файлов, а затем «их» ... но мне нравится первое, никаких специальных кавычек не требуется.

Кавычки (одиночные или иные) вокруг всей команды обязательны из-за команды pipe. обе команды find и xargs ДОЛЖНЫ выполняться от имени пользователя root. Да, сложнее, чем первый.

Ваше объяснение причины странного поведения с блеском блестящее, +1, но я не совсем убежден. Почему команда `sudo cat / home / user.name / .ssh / authorized_keys` имеет ** длительный побочный эффект **, влияющий на вывод последующих команд, содержащих glob, когда команда glob не может увидеть содержимое до этого прямого кота? Это потому, что оболочка кэширует файлы, которые видит там? Horn OK Please 12 лет назад 0
Хорошо, 1-е решение в моих знаниях о находке. И я собирался спросить вас, почему один пользователь _would_ появляется (используя *), а другие нет, но я только что обнаружил, что папка ssh для этого пользователя - 755, а другие - 700. Richard Martinez 12 лет назад 1
Add .: Мне просто кажется странным, что `просмотр некоторых файлов, которые может видеть только root;` и `просмотр файлов, которые может видеть мой пользователь`, приводит к тому, что последняя команда" знает "о структуре каталогов благодаря бывшая команда успешно указала этот каталог. ** Особенно **, поскольку «прямой» (не глобальный) метод не включает ЛЮБОГО расширения оболочки, поэтому ** оболочка ** не находит этот каталог; команда `cat` есть! В этом случае sudo! Horn OK Please 12 лет назад 0
Я не могу объяснить длительный побочный эффект, хотя, поскольку он «сбрасывается» при выходе из системы, он может быть связан с окном sudo. Период времени, в течение которого sudo позволит вам сделать что-то до того, как разрешения снова закончатся. Обычно, как 5 минут или 15 минут от последнего действительного sudo, которое вы выполнили. lornix 12 лет назад 0
Основываясь на объяснениях разрешений Ричарда, теперь я понимаю, почему этот гейзенбаг отображается только для некоторых пользователей. Это решает загадку, поэтому нам не нужно задумываться о том, чтобы bash исследовал системные вызовы `fstat () 'его дочерних процессов, чтобы узнать о каталогах, о которых он знает. о_О Horn OK Please 12 лет назад 0
Именно так. Мой ответ был связан с разрешениями, я просто долго обходил кусты ... Спасибо за помощь @allquixotic lornix 12 лет назад 1
Помогите?!?! Я кое-что узнал! Это лучшая часть участия в этой дискуссии! :) Благодарю вас! Horn OK Please 12 лет назад 0
Итак, проблема с разрешением объясняет, почему я всегда получаю одного дополнительного пользователя. И я только что проверил команду * с помощью sudo -K (чтобы сбросить отметку времени), и это действительно решение для второй части. «Длительный» побочный эффект связан с временным окном sudo. Интересная информация, спасибо за помощь! Richard Martinez 12 лет назад 0
0
Horn OK Please

У меня нет прямого объяснения, почему глобализация делает то, что делает, но я знаю, как вы можете переписать свой сценарий, чтобы выполнить то, что вы хотите:

ибо я в / home / *; do if [-d "/ home / $ "]; затем sudo cat "/home/$ndomi‹/.ssh/authorized_keys"; Fi; сделанный

Я не знаю ни одной функции bash, которая вызывала бы его сбои по-разному в зависимости от прошлых команд, поэтому это может быть либо ошибка, либо действительно глубоко скрытая (недокументированная) функция. Я НИКОГДА не использую globs для каталогов; Я всегда использую либо команду поиска для цикла for. Я не доверяю глобусам делать правильные вещи с любым шаблоном, содержащим /*/.