使用echo / sudo时为什么shell重定向失败?

时间:2012-07-23 17:18:24

标签: linux bash shell file-io permissions

我有一个简单的脚本,表现得无法预料。

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

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

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

引发错误:

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

我做错了什么?

4 个答案:

答案 0 :(得分:3)

您没有文件/ usr / local / bin / new_script或目录/ usr / local / bin

的写访问权限

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

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

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

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

答案 1 :(得分:3)

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

sudo sh -c "echo -e '$content' > $path"

答案 2 :(得分:2)

重定向由当前用户处理,而不是以root身份处理。因此,除非当前用户具有 $ path 的写入权限,否则重定向可能会失败。

您可以使用 tee 解决此限制。例如:

# echo as current user; tee as root
echo -e "$content" | sudo tee "$path"

答案 3 :(得分:0)

您可能无权写信/usr/local/bin/。您正在使用sudo,但文件重定向(>)正在应用于sudo的输出,而不是sudo'ed命令(echo)。因此,重定向的特权没有升级。