Je veux démarrer le fichier suivant appelé test.sh
à partir de Ruby, qui est un superutilisateur, en tant qu'utilisateur spécifique.
#!/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 #Autre chose
end
res = Process.waitpid(pid)
puts 'complete'
p $?
Résultat d'exécution
$ sudo ruby a.rb
test.sh ok
uid=1001(****) gid=1001(****) groups=1001(****),0(root)
complete
#<Process::Status: pid 75202 exit 0>
--spawn
n'a pas de fonction pour changer l'utilisateur, donc fork
puis ʻexec`.
«C'est facile si tout réussit. Je veux réfléchir à la gestion des erreurs en cas d'échec.
est aussi stupide --ʻAbort
Ensuite, il est impossible de le distinguer du cas où l'application a échoué lorsque l'exécution a réussi.
--Donc, signalez l'échec avec le code de fin 127
(c'est-à-dire ʻENOENT`). Je ne peux pas dire si l'application retourne «127» lorsque l'exécution est réussie, mais je vais le laisser de côté.