我有一个类似这样的 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 负责读取文件,并且您使用普通用户运行它,因此它没有读取文件的必要权限。现在您应该知道使用运行命令不会read
有sudo
帮助,更不用说它是一个内置的 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 身份。脚本无法执行此操作。这是一种安全措施,以确保终端上的某个人正在进行更改。此外,某些操作和文件夹仅对根系统进程可用。