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 инициализировать как исходную оболочку, затем вызвать оттуда ваш исполняемый файл и затем выйти.

Я также нашел много обсуждений и некоторых других возможных решений здесь.

Другие вопросы по тегам