View previous topic :: View next topic |
Author |
Message |
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Sun May 26, 2024 11:20 am Post subject: su und su - und welche Dateien dabei gesourcet werden |
|
|
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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
Posted: Sun May 26, 2024 5:38 pm Post subject: |
|
|
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. _________________ Forum Guidelines
PFL - Portage file list - find which package a file or command belongs to.
My delta-labs.org snippets do expire |
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Sun May 26, 2024 9:31 pm Post subject: |
|
|
~/.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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
|
Back to top |
|
|
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1972 Location: Schweiz
|
Posted: Mon May 27, 2024 8:01 am Post subject: |
|
|
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 |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Mon May 27, 2024 8:23 am Post subject: |
|
|
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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Mon May 27, 2024 5:47 pm Post subject: |
|
|
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 |
|
|
Christian99 Veteran
Joined: 28 May 2009 Posts: 1713
|
Posted: Tue May 28, 2024 9:37 am Post subject: |
|
|
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 |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5320
|
Posted: Tue May 28, 2024 9:48 am Post subject: |
|
|
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 |
|
|
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1972 Location: Schweiz
|
Posted: Tue May 28, 2024 12:47 pm Post subject: |
|
|
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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
Posted: Tue May 28, 2024 5:30 pm Post subject: |
|
|
@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 _________________ Forum Guidelines
PFL - Portage file list - find which package a file or command belongs to.
My delta-labs.org snippets do expire |
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Tue May 28, 2024 7:50 pm Post subject: |
|
|
/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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Wed May 29, 2024 10:33 am Post subject: |
|
|
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 |
|
|
schmidicom Veteran
Joined: 09 Mar 2006 Posts: 1972 Location: Schweiz
|
Posted: Wed May 29, 2024 11:01 am Post subject: |
|
|
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 |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Wed May 29, 2024 6:27 pm Post subject: |
|
|
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 |
|
|
Banana Moderator
Joined: 21 May 2004 Posts: 1747 Location: Germany
|
|
Back to top |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2610 Location: Konradsreuth (Germany)
|
Posted: Thu May 30, 2024 5:10 pm Post subject: |
|
|
Soweit ich das verstanden habe liegt das weniger an Alpine, sondern an Busybox/ash. |
|
Back to top |
|
|
|