Wie aktiviere ich „sudo“ mit benutzerdefinierten Funktionen?

Wie aktiviere ich „sudo“ mit benutzerdefinierten Funktionen?

sudoKürzlich habe ich erfahren, dass Sie benutzerdefinierte Aliase wie folgt aktivieren können :

alias sudo='sudo ' # note: the space is required!

Der Grund, warum das funktioniertist das Folgende:

Wenn das letzte Zeichen des Alias-Wertes ein Leerzeichen oder ein Tabulatorzeichen ist, wird auch das nächste Befehlswort nach dem Alias ​​auf Alias-Erweiterung überprüft.

Meine Frage lautet: Gibt es eine Möglichkeit, dies sudoauch mit benutzerdefinierten Funktionen zu aktivieren?

Antwort1

Im Allgemeinen funktioniert das, was Sie versuchen, nicht wirklich.

Bei Aliasnamen erfolgt im Wesentlichen lediglich eine Umschreibung der Zeichenfolge, bevor die Zeile zur Ausführung übergeben wird.

Wenn Sie beispielsweise

alias sudo='sudo '
alias foo='bar baz'

dann, wenn Sie sudo foodie Befehlszeile eingeben wird umgeschrieben sudo bar bazundDaswird dann ausgeführt. Dies ist eine einfache Umschreibung der Befehlszeile.

Jetzt sind Funktionen schwieriger. Sie sind keine einfachen Umschreibungen, sondern eine vollständige Auswertung; sie können Variablen setzen, Verzeichnisse ändern, Dateien öffnen... so ziemlich allesirgendetwasdie Shell kann. Und, was wichtig ist, sie werden im Kontext der aktuellen Shell ausgeführt. Wenn Sie ausführen, sudo myfunctionist nichts davon möglich; insbesondere sudowerden Befehle als Unterprozess ausgeführt und können daher die aktuelle Shell nicht beeinflussen.

Die Problemumgehung für Dinge wie die sudowrapoben genannten besteht darin, zu versuchen, automatisch zu arbeiten sudo bash -c 'myfunction() {...} ; myfunction'. Dies ruft explizit eine neue bashSubshell auf und führt dann die Funktion in dieser Subshell aus. Der explizite Aufruf macht deutlich, dass Dinge wie das Setzen von Variablen und dergleichen nicht funktionieren :-) Es ermöglicht eine begrenzte Teilmenge der Funktionalität.

Die Art von Funktionen, die Sie auf diese Weise aufrufen können, lassen sich besser als Shell-Skripte statt als Funktionen umschreiben. Dann sudokönnen Sie sie direkt aufrufen. Das Beispiel unterhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlwäre einfacher, wenn man dukes in eine ausführbare Datei konvertiert hätte

#!/bin/bash
exec du -k "$@" | sort -n

Dann klappt es wie erwartet!

verwandte Informationen