[Ruby] Exécuter une commande externe en tant qu’autre utilisateur

supposition

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

la mise en oeuvre

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>

point important

--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.

Recommended Posts

[Ruby] Exécuter une commande externe en tant qu’autre utilisateur
Exécuter des commandes externes avec python
«pip» n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.