我有一个行为出乎意料的简单脚本。
path='/usr/local/bin/new_script'
content='#!/bin/bash\nls'
sudo echo -e "$content" > "$path"
引发错误:
bash: /usr/local/bin/new_script: Permission denied
我究竟做错了什么 ?
我有一个行为出乎意料的简单脚本。
path='/usr/local/bin/new_script'
content='#!/bin/bash\nls'
sudo echo -e "$content" > "$path"
引发错误:
bash: /usr/local/bin/new_script: Permission denied
我究竟做错了什么 ?
您没有对文件 /usr/local/bin/new_script 或目录 /usr/local/bin 的写入权限
使用 sudo 执行 echo 命令没有帮助,因为 echo 只是写入 stdout 指向的任何文件。问题是外壳打开了您尝试重定向到的文件,该文件仍以普通用户身份运行。
一个解决方案是确保最终打开和写入文件的进程以 root 身份运行,例如:
echo -e "$content" | sudo dd of="$file"
这会导致 'dd' 以 root 身份运行,并让它打开文件进行写入,而不是你的 shell。
您可以使用以下方法进行重定向:
sudo sh -c "echo -e '$content' > $path"
重定向由当前用户处理,而不是作为根用户。因此,除非当前用户对$path具有写入权限,否则重定向可能会失败。
您可以使用tee绕过此限制。例如:
# echo as current user; tee as root
echo -e "$content" | sudo tee "$path"
您可能没有写入权限/usr/local/bin/
。您正在使用 sudo,但文件重定向 (>) 被应用于 sudo 的输出sudo
,而不是 sudo 的命令 (echo)。所以重定向的特权没有升级。