Ich möchte die folgende Datei mit dem Namen "test.sh" von Ruby, einem Superuser, als bestimmten Benutzer starten.
#!/bin/bash
echo "test.sh ok"
id
gid = 1001
uid = 1001
pid = fork do
exit 127 unless Process::GID.change_privilege(gid) == gid
exit 127 unless Process::UID.change_privilege(uid) == uid
begin
exec './test.sh'
rescue # Errno::ENOENT
exit 127
end
exit 127 #Etwas anderes
end
res = Process.waitpid(pid)
puts 'complete'
p $?
Ausführungsergebnis
$ sudo ruby a.rb
test.sh ok
uid=1001(****) gid=1001(****) groups=1001(****),0(root)
complete
#<Process::Status: pid 75202 exit 0>
--spawn hat keine Funktion zum Ändern des Benutzers, also fork und dann exec.
――Das ist einfach, wenn alles erfolgreich ist. Ich möchte über die Fehlerbehandlung im Fehlerfall nachdenken.
IO.pipe ist auch dumm
--abort ist nicht von dem Fall zu unterscheiden, in dem die Anwendung fehlgeschlagen ist, als die Ausführung erfolgreich war.