#1 15.06.2019 11:40:07

Commerzpunk
Mitglied

Benutzerwechsel mit sudo und automatische Befehlsausführung

Hallo,

ich möchte mit "sudo -iu" den Benutzer wechseln und anschließend automatisch einen Befehl ausführen.
Der Befehl soll jedoch nicht ausgeführt werden, wenn sich jemand anderes mit diesem Nutzer anmeldet.

Beispiel mit "source .bashrc"

Nutzer A möchte seine eigene .bashrc nach dem Wechsel zu Nutzer B laden. Es sollte also folgendes
ausgeführt werden:

[usera]: sudo -iu userb
[userb]: source .bashrc-usera 

Wenn Nutzer C zu Nutzer B wechselt, soll dies nicht geschehen. Dadurch kommt ein Hinzufügen der
gewünschten Befehle zur ".bashrc" von Nutzer B oder sonstigen Autostart-Möglichkeiten nicht in Frage.

Ein Script mit den genannten Befehlen funktioniert nicht, da es nach "sudo -iu userb" angehalten wird oder
bei "sudo -iu userb source .bashrc-usera" keine interaktive Shell gestartet wird bzw. sofort nach der
Befehlsausführung wieder beendet wird.

Hat jemand eine Idee, wie ich also Befehle nach einem Benutzerwechsel mit "sudo -iu" automatisch
ausführen kann?

Vielen Dank im Voraus.
Commerzpunk

PS.: Ich hoffe das Thema passt in dieses Forum.

Offline

#2 15.06.2019 14:26:59

GerBra
Mitglied

Re: Benutzerwechsel mit sudo und automatische Befehlsausführung

Commerzpunk schrieb:

Nutzer A möchte seine eigene .bashrc nach dem Wechsel zu Nutzer B laden. Es sollte also folgendes
ausgeführt werden:

[usera]: sudo -iu userb
[userb]: source .bashrc-usera 

Wenn Nutzer C zu Nutzer B wechselt, soll dies nicht geschehen. Dadurch kommt ein Hinzufügen der
gewünschten Befehle zur ".bashrc" von Nutzer B oder sonstigen Autostart-Möglichkeiten nicht in Frage.

Du könntest in der .bashrc von userb eine if-Abfrage auf den sudo-User durchführen.
Durch sudo-Nutzung wird im Environment des "neuen" User u.a. die Variablen SUDO_UID und SUDO_USER gesetzt. In deinem Fall die von usera. In der .bashrc von userb dann eine Anweisung wie:
Wenn $SUDO_USER=usera DANN source .bashrc-usera

Dieser Befehl/Block würde dann nur ausgeführt wenn die bash-Shell von userb durch eine usdo-Nutzung von usera erfolgt. Nicht für andere User, und auch nicht für userb wenn dieser sich normal einloggt.
z.B.

if [ "$SUDO_USER" == "usera" ]; then
echo "sudo!!!"
fi

Offline

#3 15.06.2019 15:41:31

Commerzpunk
Mitglied

Re: Benutzerwechsel mit sudo und automatische Befehlsausführung

Hallo GerBra,

vielen Dank für den Hinweis auf die SUDO_*-Variablenabfrage. Diese Variante habe ich bisher nicht bedacht und damit kann ich auch arbeiten.

Besteht denn trotzdem eine Möglichkeit, sudo Befehle mitzugeben, die nach dem Benutzerwechsel ausgeführt werden, ohne .bashrc anzupassen?

Offline

#4 16.06.2019 00:50:12

GerBra
Mitglied

Re: Benutzerwechsel mit sudo und automatische Befehlsausführung

Commerzpunk schrieb:

Besteht denn trotzdem eine Möglichkeit, sudo Befehle mitzugeben, die nach dem Benutzerwechsel ausgeführt werden, ohne .bashrc anzupassen?

Dafür ist sudo eigentlich da (das "do" für "Switch User and DO" im Gegensatz zu z.B. dem su-Programm.

sudo -iu user_b id

führt den Befehl 'id' als user_b aus. Du kannst allerdings immer nur *einen* Befehl/Kommando als anderer User ausführen , oder du mußt ein Skript starten welches mehrere Kommandos enthält. Oder eben eine Sub-Shell starten, wobei da nur eine interaktive Subshell eine andere .rc-Initdatei zuläßt (siehe unten).

Das funktioniert z.B. *nicht* wie ggf. erwartet:

sudo -iu user_b id;id
(oder)
sudo -iu user_b 'id;id'
(oder)
sudo -iu user_b 'id && id'
(daß aber schon)
sudo -iu user_b sh -c " id ; id"

Ich weiß nur nicht, ob du das so meinst.

Sudo hat (zum Glück) einige Security-Mechanismen, die von seiner speziellen Art und Möglichkeiten herrühren.
Da es dir ja evtl. um die Nutzung einer anderen .rc-Datei als der (bei bash) normalen .bashrc geht, einige Beispiele was geht und was meines Wissens aus nachvollziehbarem Grund nicht so geht:

Ich nutze hier den root-Account als Beispiel für deinen user_b:
Gegeben sei diese /root/.bashrc_a

# cat .bashrc_a 
alias kontrolle='echo kontrolle ist gut'

Als User(bei dir user_a) könnte man das gewünschte rc-File jetzt der interaktiven Shell des anderen Users mitgeben:

[gerhard@ws01 ~]$ sudo -iu root /usr/bin/bash --rcfile .bashrc_a
[sudo] Passwort für gerhard:
[root@ws01 ~]# kontrolle 
kontrolle ist gut

Mit --rcfile kann also für die Bash eine andere Datei als die normale .bashrc als Init-File mitgegeben werden. Interaktiv wird das auch so funktionieren.

Was nicht funktioniert ist die nicht-interaktive Nutzung eines Befehls/Kommandos welche Teile der anderen rc-Datei nutzen will. Z.B. funktioniert sowas nicht:

gerhard@ws01 ~]$ sudo -iu root /usr/bin/bash --rcfile .bashrc_a -c 'id ; kontrolle'
uid=0(root) gid=0(root) Gruppen=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(log)
/usr/bin/bash: kontrolle: Kommando nicht gefunden.

(oder durch explizites sourcen)

gerhard@ws01 ~]$ sudo -iu root /usr/bin/bash --rcfile .bashrc_a -c 'source .bashrc_a && id && kontrolle'
uid=0(root) gid=0(root) Gruppen=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(log)
/usr/bin/bash: kontrolle: Kommando nicht gefunden.

D.h. daß das neue/andere rc-File zwar verwendet(--rcfile) und auch gesourced wird, aber in der Subshell die gestartet wird trotzdem nicht verfügbar/aktiv sind.

Sudo ist sehr restriktiv bzgl der Umgebung (Environment) in dem "Befehl" ausgeführt werden darf/kann.
Siehe z.B. für Infos und ggf. weitere Ideen: man sudoers -> Command environment
Weiterhin besteht ebenfalls über die sudoers-Kontrolldatei die Möglichkeit bestimmte Befehlsketten als z.B. neues Kommando zu definieren, dies aber eben nur zu erlauben wenn user_a die sudo-Sitzung startet.

Das sind jetzt so ein paar Gedanken, die ich denke (sic!) das sie mit deinem Problem/Aufgabe zutun haben *könnten* oder die du ausprobieren kannst.
Ansonsten zeige am Besten mal ein konkretes Beispiel was du lösen möchtest, also was du machst und was du eigentlich erwartest als Ergebniss. Evtl. kann man dann andere/bessere Möglichkeiten finden.
(Mich verwirrt z.B. warum du unbedingt ein anderes .rc-Initskript verwenden möchtest bei dem was du "vorhast"...)

Beitrag geändert von GerBra (16.06.2019 00:56:33)

Offline

#5 16.06.2019 11:49:10

Commerzpunk
Mitglied

Re: Benutzerwechsel mit sudo und automatische Befehlsausführung

Der Hintergrund für mein "Vorhaben" ist, dass ich ein Admin von vielen bin, der nur für einzelne Anwendungen auf unseren Servern verantwortlich ist.
Für die verschiedenen Anwendungen sind jeweils einzelne "ServiceUser" angelegt, die von den Admins genutzt werden. Außerdem wird sich demnächst
meine Arbeit dahin verändern, dass ich öfter auf neuen Systemen arbeiten muss. Daher will ich also keine "größeren" permanenten Änderungen
an den ServiceUsern durchführen, die ich ggf. nach kurzer Zeit wieder aufräumen muss.

Daher suche jetzt eine Möglichkeit bei dem Benutzerwechsel ein eigenes .rc-Initskript und ggf. "cd/mc/..." zum Start auszuführen, ohne dass sich die
Subshell nach der Ausführung wieder beendet.

Ich werde mit den neuen Erkenntnissen noch etwas testen, denke aber gerade an ungefähr folgendes:

# cat changeUser.sh
inhaltRcFile="alias kontrolle='echo kontrolle ist gut'"
echo ${inhaltRcFile} > /tmp/.bashrc_a 
echo ${UebergabeBefehl} >> /tmp/.bashrc_a 

sudo -iu userb /usr/bin/bash --rcfile /tmp/.bashrc_a

rm /tmp/.bashrc_a

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums