Kit*_*nde 65 command-line sudo nano
很多时候我用 nano 编辑文件,尝试保存并获得权限错误,因为我忘记以 sudo 身份运行它。有什么快速的方法可以让我成为 sudo 而不必重新打开和重新编辑文件吗?
Cal*_*leb 50
不,您不能授予正在运行的程序启动时没有的权限,这就是称为“权限提升”¹ 的安全漏洞。
你可以做两件事:
sudo cp $TMPFILE $FILE. 请注意,不建议为此使用mv它,因为它可能导致文件所有权和权限的更改,您只想替换文件内容而不是文件占位符本身。fg返回编辑器并保存。不要忘记修复权限!¹一些编辑实际上能够通过启动具有不同权限的新进程并将数据传递给该进程进行保存来实现此目的。例如,有关允许将文件缓冲区写入进程管道的高级编辑器中的其他解决方案,请参阅此相关问题。Nano 不具备启动新进程或将数据传递给其他进程的能力,因此它被排除在这一方之外。
我刚刚尝试过nano,我发现最令人惊讶的是,当您开始尝试编辑文件时,它甚至没有警告您该文件是只读的。(更新:显然 nano 2.2 会发出警告;2.0 不会。)
这是执行此操作的(基本)脚本。
它检查您是否可以编辑文件,如果不能,它会以 root 身份运行“nano”。
/usr/local/bin/edit(或~/bin/edit)
sudo= # empty is false, non-empty is true
editor=nano # XXX check $EDITOR and $VISUAL
if test -e "$1" && test ! -w "$1"; then
if test -t 0 && test -t 2; then
printf "%s is not writable. Edit with sudo? [y/n] " "$1" 1>&2
read -n 1
case $REPLY in
y|Y)
sudo=true
;;
n|N)
sudo=
;;
*)
printf "\nExpected y or n. Exiting.\n" 1>&2
exit 1
;;
esac
else
printf "%s is not writable. Fix the permissions or run \"view\" instead." "$1" 1>&2
exit 1
fi
fi
${sudo:+sudo} "$editor" "$1"
Run Code Online (Sandbox Code Playgroud)
以及我调用的命令,view以便在您知道不会进行任何更改时避免出现提示。
/usr/local/bin/view(或~/bin/view)
editor=nano
readonlyflag=-v
"$editor" $readonlyflag "$1"
Run Code Online (Sandbox Code Playgroud)
已经有一个程序叫做viewVi/Vim 的一部分,所以请随意建议一个更好的名字。
(但我认为该程序的完整实现会使 Vi 变得view多余。)
完整版