Получение правильной символической ссылки в sudo

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

$ ls -l
total 10
drwxrwx--x 22 www-data www-data 79 Mar  1 17:53 symlink
lrwxrwxrwx  1 root     root      1 Mar  1 17:59 folder -> symlink
  1. Я нахожусь в /home/user/symlink, если я выполняю pwd -L, я получаю /home/user/symlink
  2. Если я выполняю sudo pwd -L, я получаю /home/user/folder
  3. Как я могу всё равно получить /home/user/symlink, когда выполняю с sudo?

Обратите внимание, что когда вы используете sudo pwd -L, вы получаете независимый исполняемый файл /usr/bin/pwd, тогда как когда вы вводите pwd -L в вашей интерактивной оболочке, вы почти наверняка получаете встроенную команду оболочки pwd.

Тем не менее, они в основном делают то же самое: выводят значение переменной окружения PWD дословно (т.е. без разрешения символических ссылок).

Таким образом, действительно происходит следующее: sudo настроено на очистку окружения – и это включает сброс значения PWD:

 ~$ cd /bin
:/bin$ printenv | grep '^PWD'
PWD=/bin
:/bin$ pwd -L
/bin

:/bin$ sudo printenv | grep '^PWD'
----> (нет вывода)
:/bin$ sudo pwd -L
/usr/bin

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

:/bin$ sudo --preserve-env=PWD pwd -L
/bin

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

Чтобы понять, как получить корректный путь символической ссылки при использовании sudo, сначала нужно разобраться в том, как работает pwd с символическими ссылками, а также какое влияние на это оказывает sudo. Имея критически важную информацию из вашего вопроса, мы можем разобрать поведение системы и предложить решение.

Теория

Команда pwd (print working directory) служит для вывода текущего рабочего каталога. Важным аспектом является то, как она работает с символическими ссылками.

Когда вы используете pwd -L, она отображает путь как символическую ссылку, вместо реального физического пути. Это поведение управляется значением переменной окружения PWD, которая хранит текущий каталог, в котором находится пользователь, что может быть отличным от фактического местоположения из-за символических ссылок.

С другой стороны, когда вы запускаете sudo pwd -L, sudo сбрасывает определенные переменные окружения, включая PWD, что приводит к тому, что вызываемая исполняемая программа /usr/bin/pwd сбрасывает её значение.

Пример

Ваш пример показывает, что при обычном использовании pwd -L, возвращаемое значение — /home/user/symlink. Однако при использовании sudo, вы получаете /home/user/folder, потому что sudo сбрасывает настройки окружения, и программа уже не имеет доступа к первоначальному значению PWD.

Применение

Если необходимо сохранить значение PWD, когда вы работаете с sudo, можно воспользоваться флагом --preserve-env. Например:

sudo --preserve-env=PWD pwd -L

Этот флаг позволяет сберечь значение указанной переменной окружения при вызове через sudo.

Вы также можете настроить sudoers файл, чтобы разрешить сохранение всех или только определённых переменных окружения для некоторого пользователя. Этот метод может быть использован, если вам нужно часто использовать такие переменные при работе с sudo.

Чтобы настроить sudoers, выполните команду visudo и добавьте строку:

Defaults env_keep += "PWD"

Это позволит sudo сохранять значение PWD, что даст вам возможность получать ожидаемое значение при вызове pwd -L с sudo.

Заключение

Работа с символическими ссылками и командами, вызываемыми от имени суперпользователя или с повышенными правами, может быть сложной задачей, особенно когда речь идет о переменных окружения. Правильная настройка и использование флага --preserve-env позволяет более гибко управлять поведением команды и получать требуемый результат.

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

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