Вопрос или проблема
Если я нахожусь в корневом терминале 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, и он вел себя точно так же.
Автозаполнение имен файлов не выполняется путем запроса “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
, что вызывает остановку автозаполнения во время ввода команды.
Вот подробное объяснение и решение проблемы:
-
Автозаполнение в Bash: Когда вы нажимаете клавишу Tab для автозаполнения, Bash обращается к файловой системе, чтобы получить список файлов и директорий в пути, который вы вводите. Если вы находитесь в директории
/root
, простая командаls /root
с обычными правами даст вам ошибку доступа, так как/root
доступна только пользователю root. -
Работа sudo: Когда вы вводите
sudo cat /root/.selected_editor
, Bash сначала обрабатывает команду, и только потом она передается программе sudo. Таким образом, механизм автозаполнения не имеет прав для доступа к/root
в момент, когда вы пытаетесь завершить имя файла. -
Почему это происходит: Это поведение связано с тем, что утилита sudo запускается отдельно и получает права суперпользователя только для выполнения команды, указанной после sudo. Она не влияет на то, что происходит перед ее запуском, включая автозаполнение.
Решение:
Если вы хотите получить доступ к файлам в директории /root
, вы можете воспользоваться следующими подходами:
-
Смените пользователя: Для работы с файлами в
/root
вам придется сначала войти в систему как пользователь root или воспользоваться командойsu
:su -
После этого вы получите доступ к файловой системе от имени root и сможете использовать автозаполнение как обычно.
-
Используйте полный путь с правами root: Если вы хотите использовать команду с sudo, но также хотите использовать автозаполнение, вы можете сначала выполнить:
sudo -i
Это откроет новый сеанс оболочки как root, где автозаполнение будет работать.
-
Автокомплитация через специальный механизм: Некоторые утилиты имеют специальные скрипты для автозаполнения, но они не всегда применимы. В вашем случае, если Bash не инициирует этот механизм через sudo, вы просто не сможете использовать автозаполнение для файлов в
/root
, так как на обычного пользователя наложены ограничения доступа.
Заключение:
В конце концов, проблема сводится к механизмам доступа и ограничениям прав пользователей в Linux. Стандартное поведение оболочки Bash делает невозможным использование автозаполнения для файлов и директорий, к которым у вас нет прав доступа. Рекомендуется либо войти в систему как root, либо использовать sudo -i
для доступа к командной строке с правами суперпользователя.