在您忘记以 sudo 运行后,是否可以从 nano 保存为 sudo?

Kit*_*nde 65 command-line sudo nano

很多时候我用 nano 编辑文件,尝试保存并获得权限错误,因为我忘记以 sudo 身份运行它。有什么快速的方法可以让我成为 sudo 而不必重新打开和重新编辑文件吗?

Cal*_*leb 50

不,您不能授予正在运行的程序启动时没有的权限,这就是称为“权限提升”¹ 的安全漏洞。

你可以做两件事:

  1. 保存到 /tmp 或任何地方的临时文件,关闭编辑器,然后将临时文件的内容转储到您正在编辑的文件中。sudo cp $TMPFILE $FILE. 请注意,不建议为此使用mv它,因为它可能导致文件所有权和权限的更改,您只想替换文件内容而不是文件占位符本身。
  2. 使用Ctrl+背景编辑器z,更改文件所有权或权限,以便您可以对其进行写入,然后使用fg返回编辑器并保存。不要忘记修复权限!

¹一些编辑实际上能够通过启动具有不同权限的新进程并将数据传递给该进程进行保存来实现此目的。例如,有关允许将文件缓冲区写入进程管道的高级编辑器中的其他解决方案,请参阅此相关问题。Nano 不具备启动新进程或将数据传递给其他进程的能力,因此它被排除在这一方之外。

  • 这个问题应该是关于纳米的。如果我们在这里开始包括有关 Vim 的答案,那么这个问题的意义何在?我们已经为 Vim 提供了[从 Vim 内部成为 root](http://unix.stackexchange.com/questions/11004/becoming-root-from-inside-vim)。 (6认同)
  • @Caleb 您可以在 vim 中使用 tee 命令来执行您所描述的操作:`:w !sudo tee` (2认同)
  • *保存到/tmp中的临时文件* - **如何在nano内部保存到临时文件?** (2认同)

Mik*_*kel 8

我刚刚尝试过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多余。)


完整版

  • 供您参考:`[ Read ... 行(警告:无写入权限)]` 显示在快捷方式的两行帮助上方(屏幕底部)。Nano 版本是 2.2.4。 (2认同)