Ausführen eines Befehls ohne Erben der übergeordneten Umgebung

14

Gibt es eine Möglichkeit, einen Befehl "als ob" in einer neuen Anmeldesitzung auszuführen?

Ich habe es schon versucht env -i. Ich möchte mich jedoch nicht mit verschiedenen ENV-Variablen befassen, die ich setzen oder deaktivieren muss.

Ich habe es auch versucht bash -c "some command"und bash -l -c "some commmand", aber alle kopieren die aktuelle Umgebung.

Das nächste, was mir gekommen ist, ist eine Ghettolösung: ssh me@localhost "some command"

dgo.a.
quelle
Verwenden Sie /bin/bash --login, um dieses Verhalten zu erhalten. Ich benutze es zB um ein richtiges zu bekommen $PATH.
Daniel Beck
Das ist das Äquivalent zu dem /bin/bash --l, was ich bereits versucht habe. Es kopiert die ursprüngliche Umgebung. Probieren Sie es aus : export SOME_VAL=something. Dann /bin/bash --login. Dann env | grep SOME_VAL. Der Wert wird da sein.
dgo.a

Antworten:

12

Hier ist eine Antwort, die keine Sudo-Berechtigungen oder das Kennwort des Benutzers erfordert, aber dennoch eine Umgebung bietet, wie Sie sie bei einem neuen Login erhalten würden.

env -i HOME="$HOME" bash -l -c 'your_command'

Beispiel:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Aufschlüsselung zur Erklärung:

  1. env -i HOME="$HOME": Löscht die Umgebung. Das -irichtet eine leere Umgebung ohne jegliche Variablen ein . Dies ist problematisch, da es bedeutet, dass wenn Sie versuchen, naiv zu laufen bash -l, Ihr .bash_profileetc. nicht geladen wird, weil HOMEes nicht eingestellt ist. Um dies zu mildern, übergeben wir explizit HOME="$HOME"eine Umgebung, in der HOME(und nur HOME) festgelegt ist.

  2. bash -l -c ...: Führt den gewünschten Befehl in einer Login-Shell aus. Sie benötigen hierfür eine Login-Shell, da wir von einer sauberen Umgebung ausgehen und alles neu laden müssen.

Vor allem:

  • Dies erfordert keine Sudo-Berechtigungen (die sudoVersion tut dies).
  • Dies erfordert keine Eingabe des Benutzerpassworts (die suVersion tut dies).
  • Dies erfordert nicht den Betrieb eines SSH-Servers und einen kennwortlosen Schlüssel, mit dem Sie sich wieder am Computer anmelden können (die sshVersion tut dies).
Elliott Slaughter
quelle
Danke, Elliott. Es sieht so einfach und offensichtlich aus ... jetzt, wo ich darauf hingewiesen wurde.
dgo.a
12
su -l $USER

sudo -u $USER -i

Für etwas noch aggressiveres versuchen env -i bash, aber das setzt alles außer $ HOME und $ TERM.

user1686
quelle
2
Vielen Dank! Der zweite Befehl gibt mir genau das, was ich will. Ich habe mehr als 2 Stunden gesucht und nichts in der Nähe Ihrer Antwort gefunden. Aufgrund Ihrer Antwort ging ich zurück zu man sudound stellte fest: "Wenn der Zielbenutzer mit dem aufrufenden Benutzer identisch ist, ist kein Kennwort erforderlich." (Der suscheint immer nach einem Passwort zu fragen.) Ich bin so ein Idiot, dass ich im ersten Absatz einer manSeite etwas so Einfaches übersehen habe :( Ich habe Sudo an erster Stelle vermieden, weil ich angenommen habe, dass es immer nach einem Passwort gefragt hat. Danke wieder!
dgo.a
1
Nur ein Hinweis für andere ... Wenn Sie angemeldet $USERsind, müssen Sie sich als root und dann sudo -u ...als Benutzer anmelden . Wenn Sie nur sudo -uals Benutzer tun, werden Sie erben.
Adam Gent
Dies funktioniert natürlich nicht, wenn Sie keinen sudoZugriff haben. Gibt es eine alternative Methode, die kein Sudo erfordert?
user5359531
@ user5359531: Ja - su -l $USER.
user1686
1
das fragt nach einem Passwort; Ich bin über die SSH-Schlüsselauthentifizierung angemeldet, daher weiß ich nicht einmal, wie das Passwort lautet. Und eine Passwortabfrage wird die Skriptfähigkeit beeinträchtigen. Bisher sieht es so aus, als würde ssh $USER@localhost <command>es besser funktionieren
user5359531