Завершение не работает в директории /root

Вопрос или проблема

Если я нахожусь в корневом терминале su -, то все в порядке: автозаполнение работает нормально.

Проблема возникает, если, будучи обычным пользователем, я пытаюсь использовать sudo, чтобы добраться до директории /root/, например, если я хочу открыть файл, такой как /root/.selected_editor.

Когда я начинаю с /ro, автозаполнение все еще работает и показывает /root/, но потом перестает работать. Если я завершаю написание команды Linux Bash вручную, то эта команда работает нормально.

root@Xfce:~# cat .se(lected_editor) ---> автозаполнение работает нормально
xxx@Xfce:~$ sudo cat /ro(ot/)  --->  автозаполнение все еще работает
xxx@Xfce:~$ sudo cat /root/.se(   ) --->  автозаполнение перестало работать

Чтобы проверить, могу ли я увидеть содержимое /root/, я попробовал sudo ls -a /root/ и получил список. Затем я попробовал на другом ноутбуке с установленным Debian 11, и он вел себя точно так же.

Система: Ноутбук с Debian 11 (Bullseye) и Xfce

Автозаполнение имен файлов не выполняется путем запроса “sudo cat” на предоставление предложений; это выполняется непосредственно оболочкой, в которую вы в данный момент вводите команды. И поскольку это еще не запущено под “sudo”, у него нет привилегий для доступа к содержимому /root, так же как ls /root или echo /root/* не смогут его увидеть.

Всегда имейте в виду, что sudo — это не просто специальное ключевое слово оболочки, которое говорит ей выполнять действия от имени root. Это целая отдельная программа, которую нужно запускать так же, как ps или что-либо другое. (Например, запуск sudo cat something заставит оболочку выполнить /bin/sudo; затем sudo получает привилегии root и запускает фактический /bin/cat.)

Поэтому его эффекты видны только тогда, когда команда выполняется, и он может повлиять только на ту часть командной строки, которая была предоставлена sudo. Он не видит остальную часть пайплайна в “sudo this | that” (это разбивается оболочкой), не может повлиять на перенаправления файлов (они выполняются оболочкой до запуска ‘sudo’), и не может повлиять на автозаполнение (тоже выполняется оболочкой до запуска ‘sudo’).

(Хотя для некоторых команд Bash может иметь специальные скрипты ‘bash-completion’, которые могут пытаться, например, получить список файлов или служб или процессов, запуская какого-то помощника через sudo, но такие скрипты в данном примере не используются. Вы имеете дело только со встроенным автозаполнением имен файлов Bash.)

Ответ или решение

Проблема завершения команд (комплитации) в директории /root возникает из-за того, что механизм автозаполнения в Bash работает на уровне оболочки, а не на уровне утилиты sudo.

Когда вы вводите команду в терминале, например:

sudo cat /root/.se

сначала Bash занимается автозаполнением пути. Однако, поскольку вы работаете как обычный пользователь, Bash не имеет прав доступа к содержимому директории /root, что вызывает остановку автозаполнения во время ввода команды.

Вот подробное объяснение и решение проблемы:

  1. Автозаполнение в Bash: Когда вы нажимаете клавишу Tab для автозаполнения, Bash обращается к файловой системе, чтобы получить список файлов и директорий в пути, который вы вводите. Если вы находитесь в директории /root, простая команда ls /root с обычными правами даст вам ошибку доступа, так как /root доступна только пользователю root.

  2. Работа sudo: Когда вы вводите sudo cat /root/.selected_editor, Bash сначала обрабатывает команду, и только потом она передается программе sudo. Таким образом, механизм автозаполнения не имеет прав для доступа к /root в момент, когда вы пытаетесь завершить имя файла.

  3. Почему это происходит: Это поведение связано с тем, что утилита sudo запускается отдельно и получает права суперпользователя только для выполнения команды, указанной после sudo. Она не влияет на то, что происходит перед ее запуском, включая автозаполнение.

Решение:

Если вы хотите получить доступ к файлам в директории /root, вы можете воспользоваться следующими подходами:

  • Смените пользователя: Для работы с файлами в /root вам придется сначала войти в систему как пользователь root или воспользоваться командой su:

    su -

    После этого вы получите доступ к файловой системе от имени root и сможете использовать автозаполнение как обычно.

  • Используйте полный путь с правами root: Если вы хотите использовать команду с sudo, но также хотите использовать автозаполнение, вы можете сначала выполнить:

    sudo -i

    Это откроет новый сеанс оболочки как root, где автозаполнение будет работать.

  • Автокомплитация через специальный механизм: Некоторые утилиты имеют специальные скрипты для автозаполнения, но они не всегда применимы. В вашем случае, если Bash не инициирует этот механизм через sudo, вы просто не сможете использовать автозаполнение для файлов в /root, так как на обычного пользователя наложены ограничения доступа.

Заключение:

В конце концов, проблема сводится к механизмам доступа и ограничениям прав пользователей в Linux. Стандартное поведение оболочки Bash делает невозможным использование автозаполнения для файлов и директорий, к которым у вас нет прав доступа. Рекомендуется либо войти в систему как root, либо использовать sudo -i для доступа к командной строке с правами суперпользователя.

Оцените материал
Добавить комментарий

Капча загружается...