Ich arbeite an einem Rechner, auf dem ich keinen Root-Zugriff habe, aber es gibt eine Liste zulässiger sudo
Befehle. Einer dieser Befehle ist /bin/su - foouser
. Ich kann also eingeben sudo su - foouser
und erhalte eine interaktive Shell als foouser. Dann kann ich einige Dinge als ausführen foouser
.
Das Problem ist, dass es foouser
sich um einen gemeinsam genutzten Benutzer/eine gemeinsam genutzte Shell handelt, die zum Starten bestimmter wichtiger Produktionsprozesse verwendet wird. Ich kann sie nicht einfach anpassen oder so einrichten, wie ich es möchte. Und ich sollte nicht konsequent darin arbeiten, was meine Terminals und den Befehlsverlauf zwischen denen aufteilt, bei denen ich als ich selbst angemeldet bin, und denen, bei denen ich angemeldet bin foouser
.
Was ich wirklich gerne hätte, wäre eine Möglichkeit, einen einzelnen Befehl als auszuführen foouser
, ihn zu blockieren, stdout und stderr wie üblich in meine Shell auszugeben und dann zurückzukehren, wobei ich immer noch als ich selbst angemeldet bin (und nicht als foouser
). Dies könnte beispielsweise in einem Skript gekapselt werden, das as_foo bar
den Befehl bar
als ausführt foouser
, stdout und stderr ausgibt, den Rückgabecode von zurückgibt bar
und mich dann wieder in meine Shell zurückbringt.
Ich kann die Systemadministratoren bitten, die Berechtigungen zu ändern. Sie könnten beispielsweise bar
die Sudo-Liste ergänzen, und dann könnte ich (glaube ich) su -c
bar auf die beschriebene Weise ausführen. Aber wenn ich am nächsten Tag ausführen möchte bar2
, muss ich erneut mit ihnen sprechen.
Gibt es einen Ausweg aus diesem Dilemma? Das scheint ziemlich albern, denn ich kann offensichtlich foouser
so viele Befehle ausführen, wie ich will, also sehe ich keinen Unterschied in Bezug auf die Sicherheit. Ich kann einfach keinen offensichtlichen, praktischen Weg finden, dies zu ermöglichen.
Antwort1
sudo su - foouser <command>
erfordert, dass Sie zumindest über eingeschränkten Root-Zugriff verfügen, um su - foouser <command>
als Root ausgeführt zu werden.
sudo -u foouser <command>
sudo
können Sie in einem Schritt alles tun, was Sie möchten. Dafür ist es jedoch erforderlich, dass der Systemadministrator Ihnen auf diese Weise Zugriff auf das Konto gewährt hat foouser
:
ignacio ALL=(foouser) ALL
statt so:
ignacio ALL=(root) su - foouser
Wenn Sie die Konfiguration sudo
auf diese Weise durchführen, können Sie beispielsweise einen Alias wie gewünscht definieren:
as_foo='sudo -u foouser'
Und indem Sie das vermeiden su -
, können Sie möglicherweise weiterhin Ihre eigenen Anpassungen verwenden: Die Verwendung sudo
auf diese Weise ändert nur die Benutzeridentität, behält aber HOME
den vorherigen Wert bei und liest alle Shell-Startskripte und andere Anpassungen ausdeinHome-Verzeichnis anstelle von foouser
's.
(Natürlich müssen diese Skripte dann auch für den anderen Benutzer lesbar sein, und alle gemeinsam genutzten Skripte, die Sie möglicherweise ausführen, sollten besser foouser
ausdrücklich auf das Home-Verzeichnis von verweisen, als /home/foouser
statt nur $HOME
.)
Es gibt jedoch einige sudo
Einstellungen, die verhindern können, dass diese Lösung funktioniert: Wenn die always_set_home
Option „sudo“ in der Datei „sudoers“ festgelegt ist oder wenn env_reset
die Option festgelegt ist, ohne sie HOME
zur env_keep
Liste hinzuzufügen, HOME
wird sie trotzdem zurückgesetzt. Versuchen Sie in einer solchen Situation, die -E
Option zum sudo
Befehl hinzuzufügen, um explizit die Beibehaltung Ihrer Umgebung anzufordern.
Und wenn Sie wirklich etwas mit der Umgebung ausführen möchten, die foouser
genau so eingestellt ist wie bei der Anmeldung als foouser
(also das Äquivalent von sudo su - foouser
), fügen Sie die -i
Option hinzu, dies ausdrücklich anzufordern. Dies sudo -i -u foouser
ist ein 100 % genauer Ersatz für sudo su - foouser
.
Wenn Sie ein System mit einer so alten Version von finden, sudo
dass diese Option nicht vorhanden ist -i
, verwenden Sie stattdessen die -H
Option mit sudo: Dies ist kein perfekter Ersatz, könnte aber ausreichen. Eine so alte Version von sudo
wird wahrscheinlich auch einige bekannte sicherheitsrelevante Fehler aufweisen, sodass es sich trotzdem lohnt, sie zu aktualisieren.
Sie können es sudo -l
als Sie selbst verwenden, um genau zu sehen, wie Ihr Sudo-Zugriff definiert ist und welche Sudo-Optionen (auch als Standardeinträge bezeichnet) für Sie wirksam sind.
Antwort2
Übergeben Sie zusätzliche Argumente an su
.
sudo su - foouser sh -c 'echo $USER'