0

我有一个行为出乎意料的简单脚本。

path='/usr/local/bin/new_script'

content='#!/bin/bash\nls'

sudo echo -e "$content" > "$path"

引发错误:

bash: /usr/local/bin/new_script: Permission denied

我究竟做错了什么 ?

4

4 回答 4

3

您没有对文件 /usr/local/bin/new_script 或目录 /usr/local/bin 的写入权限

使用 sudo 执行 echo 命令没有帮助,因为 echo 只是写入 stdout 指向的任何文件。问题是外壳打开了您尝试重定向到的文件,该文件仍以普通用户身份运行。

一个解决方案是确保最终打开和写入文件的进程以 root 身份运行,例如:

echo -e "$content" | sudo dd of="$file"

这会导致 'dd' 以 root 身份运行,并让它打开文件进行写入,而不是你的 shell。

于 2012-07-23T17:25:09.387 回答
3

您可以使用以下方法进行重定向:

sudo sh -c "echo -e '$content' > $path"
于 2012-07-23T17:38:35.460 回答
2

重定向由当前用户处理,而不是作为根用户。因此,除非当前用户对$path具有写入权限,否则重定向可能会失败。

您可以使用tee绕过此限制。例如:

# echo as current user; tee as root
echo -e "$content" | sudo tee "$path"
于 2012-07-23T17:24:32.093 回答
0

您可能没有写入权限/usr/local/bin/。您正在使用 sudo,但文件重定向 (>) 被应用于 sudo 的输出sudo,而不是 sudo 的命令 (echo)。所以重定向的特权没有升级。

于 2012-07-23T17:25:28.450 回答