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.