2012-12-02 130 views
6

我想使用bash进程替换sudo命令。使用bash进程替换sudo命令

例如,这里有一个非sudo命令为我的作品:

$ cat <(echo "installed.txt") 
installed.txt 

而这里的命令的sudo的版本不工作:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

读sudo的手册页,似乎sudo在作为root运行命令之前关闭除stdin/stdout/stderr文件描述符以外的所有文件描述符。这导致我认为bash在运行sudo命令之前创建描述符(并执行进程替换)。

我将root的shell改为bash(而不是sh默认)。我已经测试过,以root用户身份登录时,该命令正常工作。它只能通过sudo命令无效。

什么是合适的技术来实现我在这里要做的事情? Eval,引用,sudo标志,sudoers文件mod,其他?

回答

6

尝试在你的shell这样做:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

最好的办法可能是将所有内容放在一个脚本中,然后用sudo运行该脚本。

+0

一切都是单线的;我想避免需要这样做。 –

+1

@ClaytonStanley然后使用其他(很好)答案中给出的解决方案... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

这也是被接受的答案,但它不是最早发布的答案。 –

+0

我们都在疯狂地同时打字!你无法赢得全部。更重要的是,_I_无法赢得他们! – emrys57

+0

3分钟写一行?哼! =) –

4

在问题中所描述的行为是由于sudo设计。发生

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

此错误的原因sudo具有关闭文件描述符除了标准输入,输出和误差的默认行为。如手册页所述:

默认情况下,执行命令时,sudo将关闭标准输入,标准输出和标准错误以外的所有打开文件描述符。

这种行为可以用指定的文件描述符数低于该文件不应该关闭-C(或--close-from)选项覆盖。然而,使用这个选项必须由管理员被允许:以下需要被添加到/etc/sudoers

Defaults closefrom_override 

有了到位,该命令将工作,如果使用-C

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(这里给出的数字是64,因为它大于错误消息中的63)。