"sudo" -Sitzungsverhalten in grafischer Umgebung

1052
isamert

Ich habe diese beiden Skripte geschrieben und sie sind in meinem $PATH:

gsudo :

#! /bin/bash sudo -n true &> /dev/null if [ $? -eq 0 ] then sudo "$@" else upass=$(zenity --password --title "Enter your password" 2> /dev/null) [[ ! -z "$upass" ]] && echo $upass | sudo -S -p "" "$@" fi 

Dieses Skript macht im Wesentlichen das Gleiche was es gksutut. Es wird geprüft, ob ein sudoKennwort erforderlich ist oder nicht, und je nach Ergebnis wird das Kennwort abgefragt oder nicht.

etwas laufen :

gsudo command1 gsudo command2 

Wenn ich das zweite Skript von einem Terminalfenster aus laufe, erhalte ich das erwartete Verhalten. Es fragt nur einmal nach meinem Passwort. Aber wenn ich es aus einer grafischen Umgebung heraus anrufe, wie ein Task Runner (ich habe i3wm dmenu und den rofi launcher ausprobiert), fragt es zweimal nach meinem Passwort. Warum passiert das, wie kann ich das beheben? Ich glaube, es sudo -n truesollte beide Male dasselbe zurückgegeben werden, da es im selben Skript aufgerufen wird, sodass die sudoSitzung bestehen bleiben sollte. Ich versuche nicht, die sudoSitzung zwischen verschiedenen Skriptaufrufen zu speichern, es reicht aus, dass sie nur in einem Aufruf bestehen bleibt.

3
Haben Sie in Betracht gezogen, $ SUDO_ASKPASS dafür zu verwenden? grawity vor 6 Jahren 0
@grawity Ja, aber es passiert immer noch dasselbe. Ich dachte, diese Lösung ist vielleicht näher an der Lösung. isamert vor 6 Jahren 0
@ KamilMaciorowski Oh, danke. Das habe ich übersehen. Der Beitrag wird aktualisiert. isamert vor 6 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

Ich habe ein paar Tests gemacht. Es ist mir (noch) nicht völlig klar, wie sudodie Fähigkeit des Caches, zu erhöhen, besteht. Wahrscheinlich hat es etwas damit zu tun, dass Pseudoterminal zugewiesen wurde oder nicht.

Wenn ich Sie wäre, würde ich implementieren, was Sie in dieser Frage lesen können: Wie führe ich einen sudoBefehl in einem Skript aus? Besonders aus einer der Antworten :

Es ist selten eine gute Idee, sudoin Skripten zu arbeiten. Entfernen Sie stattdessen das sudoaus dem Skript und führen Sie das Skript selbst mit aussudo

außer in Ihrem Fall gsudosprechen wir von Ihnen . Zusätzlich würde ich $SUDO_USERggf. (aus dieser anderen Antwort ) verwenden.

Beispiel run-something:

#!/path/to/my/gsudo /bin/bash  # The shebang ensures the below code is for sure run with gsudo bash; # gsudo runs sudo, which sets $SUDO_USER (see `man sudo').  command1 # This is run with gsudo because the entire script is.  # Get back to the invoking (possibly regular) user for just one command sudo -u "$SUDO_USER" command_whatever  # Again as root command2 command3  # Get back to the invoking user for many commands sudo -u "$SUDO_USER" bash << EOF  foo bar baz  EOF 

Mein gsudowäre sehr einfach:

#!/bin/bash SUDO_ASKPASS='/path/to/my/gsudo_helper' sudo "$@" 

Und gsudo_helper:

#!/bin/bash zenity --password --title "Enter your password" 2> /dev/null 

Anmerkungen:

  • Ich benutze nicht absichtlich sudo -Ain gsudoCode. Auf diese Weise gsudowird, falls verfügbar, ein Terminal verwendet, zenityandernfalls.
  • Die Syntax sudo "$@"erlaubt gsudoes, Befehlszeilenoptionen (wie die erwähnten -A) an zu übergeben sudo. Dies ist eher eine gute Idee, aber wenn Sie es nicht wollen, dann überlegen Sie sudo -- "$@".
Das Shebang löst so ziemlich mein Problem. Mir fällt so etwas nicht ein. Da ich versucht habe, "run-something" von einer grafischen Benutzeroberfläche aus aufzurufen, brauchte ich eine weitere Ebene der Indirektion, wie ein anderes Skript, das "gsudo run-something" aufgerufen hat, um das Skript selbst mit "gsudo" aufzurufen. isamert vor 6 Jahren 0