我有一个简单的脚本,表现得无法预料。
path='/usr/local/bin/new_script'
content='#!/bin/bash\nls'
sudo echo -e "$content" > "$path"
引发错误:
bash: /usr/local/bin/new_script: Permission denied
我做错了什么?
答案 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)。因此,重定向的特权没有升级。