run system command as user

T

Trey

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?
 
M

MonkeeSage

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
 
M

MonkeeSage

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

stdout.write("secret_password\n") if pass

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

yermej

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

MonkeeSage

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
 
T

Trey

Sweet. It works. Thanks Jordan

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top