Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
su und su - und welche Dateien dabei gesourcet werden
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Sun May 26, 2024 11:20 am    Post subject: su und su - und welche Dateien dabei gesourcet werden Reply with quote

Hallo allerseits!

Mal ne ganz blöde Frage. Ich spiel grad auf meinem alten Raspberry Pi 1 mit Alpine Linux rum (was ja auch OpenRC benutzt und erfreulich minimalistisch ist). Da wird als Shell Busybox-ash benutzt.

So weit so gut, wenn man das Zeug aus ~/.bashrc, also die PS1-Definition, Aliase und sowas in ~/.profile reinschreibt, dann bekommt man das bei einem Login auch.

Aber: Wenn ich "su" ausführe, um root zu werden, dann wird diese Datei nicht gesourcet, und ich bekomme weder meine Aliase, noch mein PS1, sondern das, was vorher definiert war.

Jetzt kann man das umgehen, indem man statt "su" "su -" benutzt, was – sofern ich das richtig verstanden habe – eine "echte" Login-Shell öffnet, die dann so ist, als hätte man sich direkt als root angemeldet.

Jetzt sind mir ein paar Sachen nicht ganz klar:
  • Was genau ist jetzt der Unterschied zwischen "su" und "su -"?
  • Wieso macht es auf Gentoo (augenscheinlich) keinen Unterschied, ob ich "su" oder "su -" ausführe (abgesehen davon, dass ich bei "su -" in ~ rauskomme, statt da, wo ich war)?
  • Kann ich mittels irgend einen Eintrags in irgendeiner Datei dafür sorgen, dass z. B. ~/.profile (oder eine andere Datei) gesourcet wird, wenn ich "su" ausführe?

Vielen Dank für alle Erleuchtung :-)
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Sun May 26, 2024 5:38 pm    Post subject: Reply with quote

Quote:
su - invokes a login shell after switching the user. A login shell resets most environment variables, providing a clean base.

su just switches the user, providing a normal shell with an environment nearly the same as with the old user.

Also du beschreibst ein verhalten das genau anders zum normalen Verhalten ist?

Diese busybox shell, liest diese überhaupt die genannten Dateien, denn diese sollten bash spezifisch sein.
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Sun May 26, 2024 9:31 pm    Post subject: Reply with quote

~/.profile ist denke ich nicht Bash-spezifisch – ist ja nicht ~/.bashrc.

Liegt dann das „passende“ PS1 bei Gentoo nach su an einer globalen Konfiguration (/etc/profile?!), oder warum wird das gesetzt?
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Mon May 27, 2024 6:02 am    Post subject: Reply with quote

https://wiki.gentoo.org/wiki/Login
https://gitweb.gentoo.org/proj/baselayout.git/tree/etc/profile?id=6ad0981792f3f2283141b954db84153ec2b397e3

Schau dir einfach mal die Dateien an, dann sollte man erkennen können was passiert.
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1950
Location: Schweiz

PostPosted: Mon May 27, 2024 8:01 am    Post subject: Reply with quote

So wie ich die Manpage verstehe sollte su ohne "-, -l, --login" immer die bestehenden Umgebung mit dessen Variablen übernehmen, aber vielleicht macht die Shell von BusyBox irgendetwas so sehr anders das su daran gehindert wird. Und mit "-, -l, --login" soll sich su, laut Manpage, wie ein normaler Loginvorgang verhalten was halt ein Verzeichniswechsel beinhaltet.

Was die "/etc/profile" angeht, die ist definitiv BASH spezifisch. Das musste ich als Nutzer der fish auch schon öfters feststellen und es steht ja auch ganz am Anfang der Datei drin.
Wobei der darin enthaltene Satz
Quote:
That this file is used by any Bourne-shell derivative to setup the environment for login shells

aufgrund des Wortes "derivative" nicht ganz so klar definiert ist, denn was genau ist alles ein Derivat der bash?
_________________
Lenovo - ThinkPad P16s Gen 2 - 21K9CTO1WW
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Mon May 27, 2024 8:23 am    Post subject: Reply with quote

Also auf jeden Fall gibt es auch auf dem Alpine-System /etc/profile, und bei einem normalen Login wird ~/.profile gesourcet.

Fragen wir mal umgekehrt:

Alles, was ich gern hätte, ist: Ich möchte mein schickes root-PS1 auch dann bekommen, wenn ich einfach nur "su" mache, so wie bei Gentoo. Wie stelle ich das an?!
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Mon May 27, 2024 1:00 pm    Post subject: Reply with quote

Dann musste schauen woher deine aktuelle Prompt kommt.

Wenn ich das richtige deute, da ich das selbst nicht verwende:
https://andidittrich.com/2019/10/busybox-fancy-cli-color-prompt-ps1.html

Ein wenig hintergrund dazu: https://gitlab.alpinelinux.org/alpine/aports/-/issues/12398

busybox hat dash "drinne":
https://linux.die.net/man/1/dash
https://www.in-ulm.de/~mascheck/various/ash/#busybox

Somit sollte einem angepasst PS1 nichts im Wege stehen
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Mon May 27, 2024 5:47 pm    Post subject: Reply with quote

Offensichtlich kennst du dich da sehr viel besser aus als ich …

Auch nach einigem Rumprobieren hab ich es nicht hinbekommen.
Wohin muss ich denn meine PS1-Definition schreiben, damit ich sie als root nach einem einfachen "su" bekomme?

Wie gesagt, die Definition in ~/.profile zu speichern funktioniert, aber eben nur bei einem richtigen Login oder "su -". Die Definition in /etc/profile zu ändern hat nicht funktioniert.
Back to top
View user's profile Send private message
Christian99
Veteran
Veteran


Joined: 28 May 2009
Posts: 1682

PostPosted: Tue May 28, 2024 9:37 am    Post subject: Reply with quote

schmidicom wrote:
So wie ich die Manpage verstehe sollte su ohne "-, -l, --login" immer die bestehenden Umgebung mit dessen Variablen übernehmen, aber vielleicht macht die Shell von BusyBox irgendetwas so sehr anders das su daran gehindert wird. Und mit "-, -l, --login" soll sich su, laut Manpage, wie ein normaler Loginvorgang verhalten was halt ein Verzeichniswechsel beinhaltet.

Was die "/etc/profile" angeht, die ist definitiv BASH spezifisch. Das musste ich als Nutzer der fish auch schon öfters feststellen und es steht ja auch ganz am Anfang der Datei drin.
Wobei der darin enthaltene Satz
Quote:
That this file is used by any Bourne-shell derivative to setup the environment for login shells

aufgrund des Wortes "derivative" nicht ganz so klar definiert ist, denn was genau ist alles ein Derivat der bash?


So als Nebenbemerkung: die "Bourne-shell" ist nicht bash, bash selbst ist ein derivative der Bourne-shell (bash bedeutet bourne-again-shell), die mir bekannten derivatives der Bourne-shell sind bash, dash, ash
Back to top
View user's profile Send private message
firefly
Watchman
Watchman


Joined: 31 Oct 2002
Posts: 5243

PostPosted: Tue May 28, 2024 9:48 am    Post subject: Reply with quote

Christian99 wrote:
schmidicom wrote:
So wie ich die Manpage verstehe sollte su ohne "-, -l, --login" immer die bestehenden Umgebung mit dessen Variablen übernehmen, aber vielleicht macht die Shell von BusyBox irgendetwas so sehr anders das su daran gehindert wird. Und mit "-, -l, --login" soll sich su, laut Manpage, wie ein normaler Loginvorgang verhalten was halt ein Verzeichniswechsel beinhaltet.

Was die "/etc/profile" angeht, die ist definitiv BASH spezifisch. Das musste ich als Nutzer der fish auch schon öfters feststellen und es steht ja auch ganz am Anfang der Datei drin.
Wobei der darin enthaltene Satz
Quote:
That this file is used by any Bourne-shell derivative to setup the environment for login shells

aufgrund des Wortes "derivative" nicht ganz so klar definiert ist, denn was genau ist alles ein Derivat der bash?


So als Nebenbemerkung: die "Bourne-shell" ist nicht bash, bash selbst ist ein derivative der Bourne-shell (bash bedeutet bourne-again-shell), die mir bekannten derivatives der Bourne-shell sind bash, dash, ash


Laut wikipedia ist die original bourne-shell das binary welches als "sh" bezeichnet wird. (https://en.wikipedia.org/wiki/Bourne_shell)
_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
Back to top
View user's profile Send private message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1950
Location: Schweiz

PostPosted: Tue May 28, 2024 12:47 pm    Post subject: Reply with quote

Christian99 wrote:
So als Nebenbemerkung: die "Bourne-shell" ist nicht bash, bash selbst ist ein derivative der Bourne-shell (bash bedeutet bourne-again-shell), die mir bekannten derivatives der Bourne-shell sind bash, dash, ash

So macht der Satz in der Datei "/etc/profile" natürlich Sinn, Danke.

l3u wrote:
Offensichtlich kennst du dich da sehr viel besser aus als ich …

Auch nach einigem Rumprobieren hab ich es nicht hinbekommen.
Wohin muss ich denn meine PS1-Definition schreiben, damit ich sie als root nach einem einfachen "su" bekomme?

Wie gesagt, die Definition in ~/.profile zu speichern funktioniert, aber eben nur bei einem richtigen Login oder "su -". Die Definition in /etc/profile zu ändern hat nicht funktioniert.

Das könnte halt wirklich Absicht sein...
Ohne "-, -l, --login" geht "su" gemäß Manpage davon aus das es sich nicht um ein interaktives Login handelt und wenn ich die Manpage der bash richtig verstehe wirkt sich das auch darauf aus ob und welche profile-Dateien ausgelesen werden. Daran lässt sich vermutlich also kaum etwas ändern.

EDIT:
Vielleicht erreichst du das was du haben willst mit einer anderen Shell die sich anders verhält.
Die "app-shells/fish" Beispielweise schaut sich immer erst die globale Konfiguration (üblicherweise "/etc/fish/config.fish") an bevor es dann die benutzerspezifische (also "~/.config/fish/config.fish") ausließt.

EDIT2:
Habe ganz vergessen das es dir ja um die BusyBox-Shell geht und es sich um ein Embedded-System handelt, damit dürfte einiges von gerade eben nicht auf deinen Fall passen, Sorry...
_________________
Lenovo - ThinkPad P16s Gen 2 - 21K9CTO1WW
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Tue May 28, 2024 5:30 pm    Post subject: Reply with quote

@l3u

Wie sieht denn deine /etc/profile aus?
Wie sieht denn deine (nicht root) ~/.profile aus?
Wie sieht denn deine (root) ~/.profile aus?

Du kannst auch ein wenig experimentieren. Habe sicherheitshalber mehrere logins/shells offen. Machte dann in einer Schrittweise Fehler in die Dateien um herauszufinden ab wann es knallt. Ohne sich neu anmelden zu müssen soltle ein source . ausreichen
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Tue May 28, 2024 7:50 pm    Post subject: Reply with quote

/etc/profile ist unangetastet von Alpine:
Code:
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

export PAGER=less
umask 022

# use nicer PS1 for bash and busybox ash
if [ -n "$BASH_VERSION" -o "$BB_ASH_VERSION" ]; then
        PS1='\h:\w\$ '
# use nicer PS1 for zsh
elif [ -n "$ZSH_VERSION" ]; then
        PS1='%m:%~%# '
# set up fallback default PS1
else
        : "${HOSTNAME:=$(hostname)}"
        PS1='${HOSTNAME%%.*}:$PWD'
        [ "$(id -u)" -eq 0 ] && PS1="${PS1}# " || PS1="${PS1}\$ "
fi

for script in /etc/profile.d/*.sh ; do
        if [ -r "$script" ] ; then
                . "$script"
        fi
done
unset script

Mein User-.profile ist:
Code:
PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \W \$\[\033[00m\] "
alias ls="ls -h --color=auto"
alias ll="ls -l"
alias la="ls -a"
alias vi="vim"

Und mein root-.profile ist – ziemlich analog, bis aus PS1:
Code:
PS1="\[\033]0;\u@\h:\W\007\]\[\033[01;31m\]\h\[\033[01;34m\] \W #\[\033[00m\] "
alias ls="ls --color=auto -h"
alias ll="ls -l"
alias la="ls -a"
alias vi="vim"

Alles in allem ist mir nach wie vor nicht klar, wo das Environment gesetzt wird, was ich sehe, wenn ich einfach nur "su" mache …
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Wed May 29, 2024 7:36 am    Post subject: Reply with quote

hmm. Was mich stört ist das fehlende export vor den PS1 variablen. Kann auch overkill sein, mache ich aber immer so.

Da ich leider kein alpine verwende sind das aktuell nur Mutmaßungen:
Ich vermute da Einstellungen in Alpine selbst. Wenn man sich diesen beiden Einträge mal anschaue ist in alpine das Verhalten der shell genau anders wie erwartet. (bezieht sich allerdings immer auf Docker, aber eventuell hilft es)
https://stackoverflow.com/questions/38024160/how-to-get-etc-profile-to-run-automatically-in-alpine-docker/
https://stackoverflow.com/questions/35325856/where-to-set-system-default-environment-variables-in-alpine-linux/

Wenn du dir die drei Dateien anschaust, welche PS1 pro Szenario passt denn zu welcher?
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Wed May 29, 2024 10:33 am    Post subject: Reply with quote

Das ist das, was ich nicht so ganz verstehe: Wenn ich mich direkt als User oder root einlogge, dann bekomme ich das jeweils via ~/.profile definierte Prompt.

Wenn ich su mache, dann bekomme ich aber keines davon, und auch keines, was zu der PS1-Definition in /etc/profile passt – z. B. "/etc/profile.d #", ohne Farben. Das dürfte ja dann eigentlich einfach nur PS="\w #" sein, oder?
Back to top
View user's profile Send private message
schmidicom
Veteran
Veteran


Joined: 09 Mar 2006
Posts: 1950
Location: Schweiz

PostPosted: Wed May 29, 2024 11:01 am    Post subject: Reply with quote

Auch auf meinem System ignoriert die BusyBox-Shell vollständig den Inhalt der "/etc/profile", siehe hier:
Von meiner fish-Shell per pkexec die BusyBox-Shell gestartet:
schmidicom@hq10pc150 ~> pkexec ash
~ # echo $PS1
\w \$
~ # exit
Von meiner fish-Shell per pkexec die BASH-Shell gestartet:
schmidicom@hq10pc150 ~> pkexec bash
hq10pc150 ~ # echo $PS1
\[\033]0;\u@\h:\w\007\]\[\033[01;31m\]\h\[\033[01;34m\] \w \$\[\033[00m\]
hq10pc150 ~ # exit

Da kann man davon ausgehen das es für die BusyBox-Shell normal ist die PS1-Variable aus "/etc/profile" oder "~/.profile" zu ignorieren.

EDIT:
Wenn man sich den SourceCode ansieht wird klar das die BusyBox-Shell die Dateien "/etc/profile" und "~/.profile" immer dann ignoriert wenn sie nicht als Teil eines normalen Loginvorgang (was bei su ohne ein "-, -l, --login" und auch bei pkexec halt der Fall ist) gestartet wurde.
_________________
Lenovo - ThinkPad P16s Gen 2 - 21K9CTO1WW
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Wed May 29, 2024 6:27 pm    Post subject: Reply with quote

So, jetzt hab ich's rausgefunden. Man muss die ENV-Umgebungsvariable setzen.

Ich hab jetzt eine Datei namens /etc/profile.d/99local.sh erstellt, mit folgendem Inhalt:
Code:
export ENV="/etc/local-env"

und dann noch besagte Datei /etc/local-env, mit meinen Aliasen und der PS1-Definition:
Code:
if [[ "$(whoami)" == "root" ]]; then
    PS1="\[\033]0;\u@\h:\W\007\]\[\033[01;31m\]\h\[\033[01;34m\] \W #\[\033[00m\] "
else
    PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \W \$\[\033[00m\] "
fi

alias ls="ls -h --color=auto"
alias ll="ls -l"
alias vi="vim"

Und siehe da: Die Datei wird jetzt sowohl bei einem normalen Login gesourcet, als auch bei einem "nackten" su, und ich bekomme ich beiden Fällen sowohl meine Aliase und mein schickes PS1.

Geht doch ;-)
Back to top
View user's profile Send private message
Banana
Moderator
Moderator


Joined: 21 May 2004
Posts: 1480
Location: Germany

PostPosted: Thu May 30, 2024 12:36 pm    Post subject: Reply with quote

aha, dann macht alpine da sein eigenes Ding.
_________________
My personal space
My delta-labs.org snippets do expire

PFL - Portage file list - find which package a file or command belongs to.
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2559
Location: Konradsreuth (Germany)

PostPosted: Thu May 30, 2024 5:10 pm    Post subject: Reply with quote

Soweit ich das verstanden habe liegt das weniger an Alpine, sondern an Busybox/ash.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum