使用bash进程替换sudo命令

Cla*_*ley 10 bash

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

例如,这是一个适用于我的非sudo命令:

$ cat <(echo "installed.txt")
installed.txt
Run Code Online (Sandbox Code Playgroud)

这是命令的sudo版本不起作用:

$ sudo cat <(echo "installed.txt")
cat: /dev/fd/63: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

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

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

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

sta*_*fry 8

问题中描述的行为是由于设计的sudo.

$ sudo cat <(echo "installed.txt")
cat: /dev/fd/63: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

发生此错误的原因是sudo具有默认行为,该行为将关闭除标准输入,输出和错误之外的文件描述符.如手册页所述:

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

可以使用-C(或--close-from)选项覆盖此行为,以指定不应关闭文件的文件描述符编号.但是,管理员必须允许使用此选项:需要添加以下内容/etc/sudoers

 Defaults closefrom_override
Run Code Online (Sandbox Code Playgroud)

有了这个,如果-C使用该命令将起作用:

$ sudo -C64 cat <(echo "installed.txt")
installed.txt
Run Code Online (Sandbox Code Playgroud)

(此处64给出的数字是因为它大于63错误消息中的数字).


Gil*_*not 6

尝试在shell中执行此操作:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")'
installed.txt for UID=0
Run Code Online (Sandbox Code Playgroud)