[LINUX] [Ruby] Führen Sie einen externen Befehl als anderer Benutzer aus

Annahme

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

Implementierung

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>

wichtiger Punkt

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

Recommended Posts

[Ruby] Führen Sie einen externen Befehl als anderer Benutzer aus
Führen Sie externe Befehle mit Python aus
'pip' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt.