即使使用 sudo,也无法读取 /root 目录

即使使用 sudo,也无法读取 /root 目录

我有一个类似这样的 bash 脚本

while read -r name value
do
    ....something
done < "test"

我以普通用户身份运行该脚本。

现在我想将此文件存储在/root主目录中并从那里读取它。
这样做

while read -r name value
do
    ....something
done < "/root/path/to/file"

当然我得到了错误:./script: ine xy: /root/path/to/file: Permission Denied

我尝试过

while sudo read -r name value
do
    ....something
done < "/root/path/to/file"

但这给了我:sudo: read: unknown command

/root为什么我使用却无法读取主目录中的文件sudo

编辑
我又试了一下,发现我甚至做不到

$> sudo echo "test" /root/.test
[sudo] Password for user:
-bash: /root/.test: Permission Denied 

编辑2
如果我运行完整的脚本,它就会按我想要的方式工作,sudo ./myscript但是我不想这样做...还有其他方法吗?

答案1

为什么它不起作用?

您的方法不起作用的原因是您使用<“stdin”读取文件,这意味着您的 shell 负责读取文件,并且您使用普通用户运行它,因此它没有读取文件的必要权限。现在您应该知道使用运行命令不会readsudo帮助,更不用说它是一个内置的 shell,不能使用sudo等运行。cd

我怎样才能让它工作?

您唯一需要做的是以某种方式读取文件 viroot或具有必要权限的用户/组。因此,您可以这样做:

sudo cat /root/txt | while read -r name value;
do
  some command
done

在这种情况下,只会cat使用 运行sudo

然而,最好的做法是把你的脚本放进去,/usr/local/bin以便每个人都可以运行它。

另请注意,当您想要重定向某些内容时,/root/example您应该使用sudo tee

echo test | sudo tee file

或者使用 运行整个脚本sudo

答案2

/root 文件夹仅供 root 使用。我相信只有系统可以操作那里的文件。您可以尝试使用“su”,但我认为您会得到相同的结果。

其次:不建议用root权限运行一般程序。

当您在命令行中使用 sudo 时,您需要提供密码并成为 root 身份。脚本无法执行此操作。这是一种安全措施,以确保终端上的某个人正在进行更改。此外,某些操作和文件夹仅对根系统进程可用。

相关内容