LINUX.ORG.RU

Поместил go.sh в /etc/profile.d, а он срабатывает только для root, а не для пользователей. Почему?

 , , ,


0

1

Очередные загадки линукса.

Имеется Debian 11 Stable. В каталог /etc/profile.d добавлен файл go.sh, следующего содержания:

export PATH=/usr/local/go/bin:${PATH}

Права у него такие же как и у других файлов:
# ls -la
итого 44
drwxr-xr-x   2 root root  4096 июн  5 09:33 .
drwxr-xr-x 144 root root 12288 июн  6 08:31 ..
-rw-r--r--   1 root root   726 авг 12  2020 bash_completion.sh
-rw-r--r--   1 root root   831 янв 18  2022 flatpak.sh
-rw-r--r--   1 root root  1107 фев 10  2021 gawk.csh
-rw-r--r--   1 root root   757 фев 10  2021 gawk.sh
-rw-r--r--   1 root root    38 июн  5 09:35 go.sh
-rw-r--r--   1 root root  1384 фев 18  2021 vte-2.91.sh
-rw-r--r--   1 root root   966 фев 18  2021 vte.csh

По идее, это глобальный профиль, и команды во всех этих файлах должны выполняться для всех пользователей. Тем более что в файле /etc/profile я вижу:
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Однако по-факту оказывается, что путь к Go устанавливается только для пользователя root. А у простых пользователей скрипт go.sh почему-то не срабатывает, и в PATH нет пути до директории Go.

Почему так? Как заставить работать скрипт в каталоге /etc/profile.d для каждого пользователя а не только для суперпользователя?

★★★★★
Ответ на: комментарий от firkax

Я проверил, файл /etc/profile выполняется при логине обычного пользователя. Но исполняется он от пользователя root.

Как с таким механизмом предполагается настраивать переменные окружения для всей системы, если они недоступны обычным пользователям, для меня загадка.


Для чего нужен файл /etc/profile?

Если вы используете Linux, то вам наверняка знакомы файлы .profile или .bash_profile, размещенные в вашем домашнем каталоге. Эти файлы используются для задания элементов окружения для оболочки пользователя. Таких элементов, как, например, umask, и таких переменных, как PS1 или PATH.

Файл /etc/profile не очень-то отличается от этих файлов. Он используется для задания общесистемных переменных окружения в оболочках пользователя. Иногда это те же переменные, что и в .bash_profile, но этот файл используется для задания первоначальных PATH или PS1 для всех пользователей оболочек системы.

/etc/profile.d

Помимо задания элементов окружения, файл /etc/profile выполняет сценарии внутри /etc/profile.d/*.sh. Если вы хотите задать свои собственные переменные окружения для всей системы, вам следует поместить свою конфигурацию в сценарий оболочки в /etc/profile.d.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от adn

Как это root не при чем? Если ты через whoami видишь, что ты root, то что сделает команда, дополняющая переменную PATH? Правильно, дополнит PATH для root.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от adn

Но это можно легко проверить, вписав что-нибудь в go.sh типа, echo "Hello World", как предложено выше.

UPD. У меня работает из /etc/profile.d и для user и для root. Но может я задачу как-то не так понял, и что echo это немного не то, а для изменения $PATH нужно все делать не так. )

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 2)

Наверное проще всего добавить в /etc/environment (или где оно в debian):

PATH=/usr/local/go

У меня работает, после перелогина получается /usr/local/go:остальное из $PATH

dmitry237 ★★★★
()
Ответ на: комментарий от krasnh

Но это можно легко проверить, вписав что-нибудь в go.sh типа, echo «Hello World»

А можно вписать

date   >> /tmp/profile_log.txt
whoami >> /tmp/profile_log.txt

и увидеть что выполнение идет от рута а не от логинящегося пользователя.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

Нам это не важно. Важно то, что PATH настраивается в момент, когда пользователь root, а не логинящийся пользователь.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от unDEFER

И что? Ты был пользователем root, настроил PATH для root. Потом переключился на логинещегося пользователя через setreuid(). Это не значит что в другом терминале у тебя PATH рута волшебным образом перетечет в PATH пользователя. Да и не нужно этого, как минимум из соображений безопасности.

Xintrea ★★★★★
() автор топика

В общем, похоже, что специалисты Google написали ахинею на официальном сайте:

Add /usr/local/go/bin to the PATH environment variable.

You can do this by adding the following line to your $HOME/.profile or /etc/profile (for a system-wide installation):

export PATH=$PATH:/usr/local/go/bin


https://go.dev/doc/install

Эта system-wide installation так не заработает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от rupert

Чтобы у тебя не вызывало сомнений, что это должно так работать:

When bash is invoked as an interactive login shell, or as a non- interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

https://www.man7.org/linux/man-pages/man1/bash.1.html

rupert ★★★★★
()
Ответ на: комментарий от rupert

Если бы было так, у меня в tmp-файле было бы сразу 10 сообщений из десяти bash-консолей, которые открываются при входе. А на деле там одно сообщение в момент входа, и то из-под рута.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ты, наверное. не знаешь, что bash может запускаться как login shell, а может как interactive. bash консоли, которые ты открываешь, интерактивные.

Из того же man файла:

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists.

rupert ★★★★★
()

export PATH=/usr/local/go/bin:${PATH}

Попробовал в вирте Debian-xfce LiveCD, не работает ни с root, ни с user.
Графические логины по умолчанию не считывают файлы запуска командной строки (/etc/profile и ~/.profile и т.д.)

У меня-то в арче нет никакого DM.

krasnh ★★★★
()