2

Я запускаю следующую команду на довольно стандартной установке 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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .