Run system command as user

I’m in need of running a system command as another user than the user
that is executing the ruby script. Is this possible? Can I execute
su (and somehow supply the correct password), then run the command?

On Nov 30, 7:56 pm, Trey [email protected] wrote:

I’m in need of running a system command as another user than the user
that is executing the ruby script. Is this possible? Can I execute
su (and somehow supply the correct password), then run the command?

Here is a naive version using the built-in pty extension (*nix only,
but since you mention su, I assume that’s not a problem)…

require “pty”
require “expect”

cmd = “sleep 1; sudo -u someuser ls 2>&1”
PTY.spawn(cmd) { | stdin, stdout, pid |
stdin.expect(/Password:|/) { | result, pass |
stdout.write(“secret_password\n”) if pass
}
puts stdin.read
}

Regardsm
Jordan

On Dec 1, 2:41 am, MonkeeSage [email protected] wrote:

require “expect”
Regardsm
Jordan

Oops…

stdout.write("secret_password\n") if pass
stdout.write("secret_password\n") if pass == "Password:"

On Nov 30, 7:56 pm, Trey [email protected] wrote:

I’m in need of running a system command as another user than the user
that is executing the ruby script. Is this possible? Can I execute
su (and somehow supply the correct password), then run the command?

Depending on how much control you have over the system and what’s
available, you might be able to configure sudo to allow your script to
run the command as a different user without a password. If it’s
available and you’re able to configure sudo on the system (or have
someone do it for you), check the sudoers man page for info on the
NOPASSWD tag.

Sweet. It works. Thanks Jordan

On Dec 1, 2:52 am, MonkeeSage [email protected] wrote:

Here is a naive version using the built-in pty extension (*nix only,
puts stdin.read
stdout.write(“secret_password\n”) if pass == “Password:”
Good grief. Third time’s a charm (maybe)…

require “pty”
require “expect”

PTY.spawn(“sleep 1; sudo -u root ls 2>&1”) { | stdin, stdout, pid |
begin
stdin.expect(“Password:”) {
stdout.write(“secret_password\n”)
puts stdin.read.lstrip
}
rescue Errno::EIO
# don’t care
end
}

Sorry about that! Was confusing live code with the version I meant to
post (twice!). I was trying to do fancy stuff and detect when the
password was catched already by sudo, but never got that working.

Regards,
Jordan