Sudo не может видеть исполняемые файлы с символьными связями в пути
На CentOS 7 я установил несколько исполняемых файлов в /opt/app-version/bin/executable
, Эти исполняемые файлы имеют следующие разрешения:
rwxrwxr-x. 500 500
Владение каждым каталогом в пути /opt/app-version/bin/
является 500 500
--Кроме /opt
, который root root
,
Мой первый вопрос: что это 500 500
бизнес? Учитывая, что я установил исполняемые файлы, используя sudo
не должен ли владелец и группа быть root
?
Я выполнил следующую команду от имени пользователя root, чтобы создать символические ссылки на исполняемые файлы в /usr/local/bin/
:
ln /opt/app-version/bin/executable /usr/local/bin/executable --symbolic
Я умею бегать executable
из командной строки как обычный пользователь, но не как обычный пользователь, использующий sudo
,
Бег sudo executable
возвращается sh: executable: command not found
,
Бег sudo echo $PATH
показывает, что /usr/local/bin/
в $PATH
для среды sudo. (Или это? Я вижу содержимое $PATH
для среды суперпользователя, или $PATH
для среды пользователя, который вызвал sudo
? Создает ли CentOS новую среду для команд, запускаемых с sudo
или он просто запускает команду в среде вызывающего?)
Бег sudo ls -la /usr/local/bin/executable
возвращает список для executable
в /usr/local/bin/
с владением lrwxrwxrwx. 1 root root
, (Делает ln --symbolic
действительно создавать глобально редактируемые ссылки по умолчанию? Разве это не ужасная идея?) Насколько я понимаю, это показывает, sudo
должен быть в состоянии бежать executable
,
Что мне не хватает?
1 ответ
Глядя сначала на 500 500
, если вы восстанавливаете из tar
Архив (среди прочего) владелец и группа будут сохранены из системы, в которой был создан архив: я предполагаю, что установщик делает это, и если восстановленный пользователь или группа не существует в вашей системе, отображается числовое значение.
Глядя сейчас на PATH
, Я воспроизвел это на Ubuntu, и кажется, что sudo
модифицирует PATH
: в вашей команде sudo echo $PATH
PATH
переменная была раскрыта в исходной оболочке перед вызовом sudo
, Есть файл /etc/sudoers
с записью "defaults secure_path="..."
и это, кажется, то, что используется.
Если вы используете sudo sh -c 'echo $PATH'
вы получите лучшее представление о PATH
использовался. Обратите внимание, что я сознательно использовал sh
вместо bash
чтобы обойти некоторые из файлов инициализации, которые могут изменить вещи, хотя sh
будет, конечно, иметь свои собственные.
На Ubuntu secure_path
строка содержит /user/local/bin
, но CentOS может отличаться (оба являются производными от Debian, но согласно man sudoers
SELinux может переопределить некоторые записи). Насколько я вижу, у вас есть как минимум четыре варианта:
- изменять
secure_path
включить `/usr/local/bin'. - Поместите ссылку в один из каталогов, определенных в
secure_path
, - использование
su -c "{command} {parameters}"
вместоsudo {command} {parameters}
, - использование
sudo -s
получить рутbash
с тем жеPATH
инициализировать как исходную оболочку, затем вызвать оттуда ваш исполняемый файл и затем выйти.
Я также нашел много обсуждений и некоторых других возможных решений здесь.