由于在root是所有者的环境中进行了重定向,因此无法正确执行bash脚本



我的脚本是可执行的,我将其作为sudo运行。我尝试了许多变通方法和">>"运算符的替代方法,但似乎都无法正常工作。

我的脚本:

#! /bin/bash
if [[ -z "$1" || -z "$2" ]]; then
exit 1
else
root=$1
fileExtension=$2
fi
$(sudo find $root -regex ".*.${fileExtension}") >> /home/mux/Desktop/AllFilesOf${fileExtension}.txt

我试过tee、sed和dd,我也试过用bash-c或sudo-I运行它,但都没用。要么我得到一个空文件,要么权限被拒绝错误。我彻底搜索并阅读了许多命令手册,但我无法使其工作

$()运算符执行命令替换。当整个命令行展开时,将执行括号内的命令,并用命令的输出替换整个构造。执行完所有扩展后,生成的行将作为命令执行。

那么,考虑一下您的命令的简化版本:

$(find /etc -regex ".*.conf") >> /home/mux/Desktop/AllFilesOfconf.txt

在我的系统上,它将扩展到形式的巨大命令

/etc/rsyslog.conf /etc/pnm2ppa.conf ... /etc/updatedb.conf >> /home/mux/Desktop/AllFilesOfconf.txt

请注意,此时重定向与命令替换中的命令是分开的,因此独立于命令。因此,扩展命令替换不会导致任何内容写入目标文件。

但我们还没有结束!这只是一个扩展。Bash现在尝试将结果作为命令执行。特别是,在上面的示例中,它尝试将/etc/rsyslog.conf作为一个命令执行,将所有其他文件名作为参数,并根据指定重定向输出。但是/etc/rsyslog.conf是不可执行的,所以它将失败,生成一条"拒绝权限"消息。我相信你可以从中推断出不同的扩张会产生什么影响。

我认为您根本不想执行命令替换,而只是运行命令并将其输出重定向到给定的文件。简单来说就是:

sudo find $root -regex ".*.${fileExtension}" >> /home/mux/Desktop/AllFilesOf${fileExtension}.txt

更新:

正如@CharlesDuffy所观察到的,在这种情况下,重定向是在运行脚本的用户/进程的权限下执行的,就像在原始示例中一样。我认为这是有意和正确的——即脚本由用户"mux"或另一个有权访问mux的Desktop目录以及脚本可能试图创建或更新的任何现有文件的用户运行。如果不是这样,并且您也需要重定向才能获得特权,那么您可以这样实现:

sudo -s <<END
find $root -regex ".*.${fileExtension}" >> /home/mux/Desktop/AllFilesOf${fileExtension}.txt
END

它通过sudo运行一个交互式shell,其输入从heredoc重定向。变量展开是在执行sudo的宿主shell中执行的。在这种情况下,使用通过sudo获得的身份执行重定向,这会影响访问控制,以及在创建新文件时对文件的所有权。如果不希望输出文件归root所有,可以添加chown命令。

相关内容

  • 没有找到相关文章

最新更新