Perl system ruft beim ausführen als anderer Benutzer mit sudo
Entwickelt ich ein perl-Skript, das bietet eine menügesteuerte Funktionen, um Benutzern zu erlauben die Durchführung ein paar einfache Aufgaben.
Muss ich die Benutzer in der Lage sein, Aufgaben wie das kopieren von Dateien (halten Sie das aktuelle Datum und Berechtigungen), laufen andere Programme (z.B. weniger oder vi) als ein anderer Benutzer. Das Skript verwendet eine Menge von Nutzung der Funktion system (). Ich will, dass die Benutzer das Menü durch Aufruf von:
sudo -u perluser /usr/bin/perl /data/perlscripts/scripta.pl
Dies sollte starten Sie das script als perl-Benutzer, die es tut, und führen Sie dann verschiedene Aufgaben, je nachdem, was der Benutzer auswählt. Das problem ist, dass immer wenn ich mit einem system-call, wie
system("clear");
Bekomme ich die folgende Fehlermeldung
Can't exec "clear": Permission denied at /data/perlscripts/scripta.pl line 3
Wenn ich das Skript ausführen, indem Sie die Anmeldung als perluser dann alles läuft erfolgreich.
Gibt es eine Möglichkeit, damit dies funktioniert? I nicht möchten, dass Benutzer in der Lage sein, sich als perluser, wie ich brauche, um zu kontrollieren, was Sie in der Lage sind zu laufen. Ich will aber auch nicht, um einen Befehl auszuführen wie
system("sudo -u perluser clear");
da würde ich dann benötigen Sie ein anderes team zu setzen, bis alle sudo-Befehle, die ich ausführen wollte (die Sie wahrscheinlich weigern, das zu tun) und dies würde nicht skalierbar, wenn ich haben, fügen Sie zusätzliche Befehle an somepoint.
Dank,
- müssen Sie hinzufügen, sudo-Befehle an das Skript selbst statt? IE
system("sudo -u peluser /bin/to/clear")
- Dies ist, was ich nicht tun wollen, dies zu tun, ich legte extra Ressourcenbedarf auf dem linux-admins setzen sich die verschiedenen sudo-Befehle, die erforderlich wäre, und Sie werden wahrscheinlich nicht wollen, dies zu tun und würde auch änderungen mehr zu implementieren, wie ich requirested diese Arbeit abgeschlossen sein und das jedes mal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Sie wahrscheinlich benötigen, um fügen Sie die
-i
option ("simulate initial login") zusudo
:Die sicherstellen, dass
.profile
oder.login
oder was weiß ich noch alles richtig gelaufen ist, und dass daher$PATH
richtig eingerichtet ist und so weiter. Es wird wirklich sein, in fast jeder Hinsicht, als wennperluser
waren tatsächlich die Protokollierung und Ausführung/usr/bin/perl /data/perlscripts/scripta.pl
an der shell.sudo
version < 1.7 die Sie stoßen werden "cannot execute binary file" Fehler.sudo -u perluser /usr/bin/perl /data/perlscripts/scripta.pl
Weiß ich, dass dies ein etwas anderer Ansatz, aber könnte man nicht einstellen
perluser
's shell/data/perlscripts/scripta.pl
? Dies würde vermeiden, dass die Kopfschmerzen meist in Verbindung mitsudo
Konfiguration, wenn Sie mehrere Maschinen. Die Endnutzer verwenden Sie einfachlogin perluser
stattsudo
. Wenn Sie ein Skript beendet wird, der login-session Weg gehen wird. Keine Notwendigkeit, nicht mehr von einem Gefängnis als dieses Recht?Alternative (und vielleicht auch richtige) Antwort
Ich denke, dass die Wurzel des Problems ist, dass Perl -
exec
nicht Nutzung einer shell in den meisten Fällen. Dies bedeutet, dass"clear"
ist unsinnig, da die shell ist das, was implementiert die Suche durch$PATH
zu finden, der Befehl. Hier ist der entsprechendeperldoc
vonsystem
. Beachten Sie die Betonung.Versuchen
system("clear")
entwedersystem("/usr/bin/clear")
odersystem("clear;")
.