DRB: can't run subshell in drb server?

I

Ittay Dror

Hi,


I have a script with

puts %x{echo hi}


When run normally it works.


When run under a drb server that was started with the root user (sudo),
it works.


But when run under a drb server that was started with a normal user, it
doesn't work.


Stracing shows that the subprocess is started, but 'echo' is never
executed (executing '/bin/echo' from a bash shell works). (Below see the
relevant parts of strace as root and as normal user)


Can someone shed some light on this?


Thanks,

Ittay


strace as root:

[pid 27075] stat64("/usr/local/sbin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/bin", {st_mode=S_IFDIR|0755, st_size=77824,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/sbin", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
[pid 27075] stat64("/bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/X11R6/bin", {st_mode=S_IFDIR|0755,
st_size=77824, ...}) = 0
[pid 27075] stat64("/usr/X11R6", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] setitimer(ITIMER_VIRTUAL, {it_interval={0, 0}, it_value={0,
0}}, NULL) = 0
[pid 27075] execve("/bin/echo", ["/bin/echo", "hi"], [/* 17 vars */]) = 0

...


strace as user:

[pid 27093] stat64("/home/ittayd/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home/ittayd", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/home/ittayd/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home/ittayd", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local/sbin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/bin", {st_mode=S_IFDIR|0755, st_size=77824,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/sbin", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
[pid 27093] stat64("/bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/games", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/opt/maven/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/opt/maven", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/opt", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
[pid 27093] clock_gettime(CLOCK_MONOTONIC, {133977, 363841305}) = 0
[pid 27093] clock_gettime(CLOCK_MONOTONIC, {133977, 363869662}) = 0
[pid 27093] select(7, [3 5], [], [], {0, 0}) = -1 EBADF (Bad file
descriptor)
[pid 27093] select(7, [3], [5], [], NULL) = -1 EBADF (Bad file descriptor)
....
 
I

Ittay Dror

Further analysis shows that the reason is that my path contains a
world-writable directory. Ruby tries to complain about this but since
the code runs under DRB this is sent over the network, but apparently
the code is not correct when run in a subprocess and fails resulting in
the whole subprocess failing.


I've opened a bug (22495) in Ruby.


Ittay

Ittay said:
Hi,


I have a script with

puts %x{echo hi}


When run normally it works.


When run under a drb server that was started with the root user
(sudo), it works.


But when run under a drb server that was started with a normal user,
it doesn't work.


Stracing shows that the subprocess is started, but 'echo' is never
executed (executing '/bin/echo' from a bash shell works). (Below see
the relevant parts of strace as root and as normal user)


Can someone shed some light on this?


Thanks,

Ittay


strace as root:

[pid 27075] stat64("/usr/local/sbin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/bin", {st_mode=S_IFDIR|0755, st_size=77824,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27075] stat64("/bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] stat64("/usr/X11R6/bin", {st_mode=S_IFDIR|0755,
st_size=77824, ...}) = 0
[pid 27075] stat64("/usr/X11R6", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27075] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27075] setitimer(ITIMER_VIRTUAL, {it_interval={0, 0},
it_value={0, 0}}, NULL) = 0
[pid 27075] execve("/bin/echo", ["/bin/echo", "hi"], [/* 17 vars */]) = 0

...


strace as user:

[pid 27093] stat64("/home/ittayd/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home/ittayd", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...})
= 0
[pid 27093] stat64("/home/ittayd/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home/ittayd", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...})
= 0
[pid 27093] stat64("/usr/local/sbin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/local", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/bin", {st_mode=S_IFDIR|0755, st_size=77824,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/sbin", {st_mode=S_IFDIR|0755, st_size=12288,
...}) = 0
[pid 27093] stat64("/bin", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/usr/games", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 27093] stat64("/opt/maven/bin", {st_mode=S_IFDIR|0755,
st_size=4096, ...}) = 0
[pid 27093] stat64("/opt/maven", {st_mode=S_IFDIR|0755, st_size=4096,
...}) = 0
[pid 27093] stat64("/opt", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
[pid 27093] clock_gettime(CLOCK_MONOTONIC, {133977, 363841305}) = 0
[pid 27093] clock_gettime(CLOCK_MONOTONIC, {133977, 363869662}) = 0
[pid 27093] select(7, [3 5], [], [], {0, 0}) = -1 EBADF (Bad file
descriptor)
[pid 27093] select(7, [3], [5], [], NULL) = -1 EBADF (Bad file
descriptor)
....
 

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

Forum statistics

Threads
473,968
Messages
2,570,152
Members
46,698
Latest member
LydiaHalle

Latest Threads

Top