Dieser Code kann tun, was Sie wollen. Die Fehlerbehandlung liegt bei Ihnen. ;-)
require 'etc'
def as_user(user, &block)
u = Etc.getpwnam(user)
Process.fork do
Process.uid = u.uid
block.call(user)
end
end
puts("caller PID = #{Process.pid}")
puts("caller UID = #{Process.uid}")
as_user "bmc" do |user|
puts("In block as #{user} (uid=#{Process.uid}), pid is #{Process.pid}")
end
Beachten Sie jedoch, dass es erfordert, dass Sie Rubin als root
oder als setuid-to root
, laufen die einige schwere Auswirkungen auf die Sicherheit hat.
Dies läuft auf einem POSIX-Betriebssystem (Linux oder Mac), oder? Auch, warum willst du das tun? – Maz
Ubuntu Server, ja. Ich habe eine RoR-Anwendung, die mit Git-Repositories für ein paar verschiedene Benutzer arbeitet. Um zu pushen und zu ziehen, möchte ich Git-Skripte als einen bestimmten Benutzer ausführen, damit ich die ssh-Schlüssel dieses Benutzers verwenden kann. – Christoffer