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


49

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


有人建议与这个问题合并。基本上是相同的问题,但是vim。我正在考虑合并...尽管我也在考虑vim特定指令在中不起作用的事实nano
xenoterracide

1
@xenaterracide-我认为vim问题是该问题的一种特例,因为该问题实际上有解决方案,而且似乎一般情况下都没有。我也不确定,取决于您。:)
Kit Sunde'Apr

您可以在.vimrc中进行映射以轻松调用sudo tee函数:<pre> <code>“允许使用具有root特权cmap w !! w!sudo tee%> / dev / null </ pre> < / code>
jasonwryan 2011年

@xenoterracide:Caleb关于Nano的答案很有用,所以我认为我们应该只保留有关Nano的答案。
Mikel

1
@mikel我认为合并无效。nano不是vim...,也没有nano类似于的解决方案vim提出过。
xenoterracide 2011年

Answers:


37

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

您可以做两件事:

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

¹ 有些编辑者实际上可以通过使用不同权限启动一个新进程并将数据传递给该进程进行保存,从而做到这一点。请参阅此相关问题,以获取高级编辑器中的其他解决方案,这些解决方案允许将文件缓冲区写入过程管道。Nano没有启动新进程或将数据传递给其他进程的能力,因此不在此列之列。


优秀的。谢谢迦勒。我大约在30分钟前遇到了这个问题。:)
boehj 2011年

2
@Caleb您可以在vim中使用tee命令来执行您描述的操作::w !sudo tee

@hellojesus绝妙的把戏。如果您愿意将其写为答案,我可以将其从我的网站上删除。我认为纳米用户以外的人也会遇到这种情况,并且可能会在这里找到自己。
Caleb

4
这个问题应该是关于纳米的。如果我们在这里开始包括有关Vim的答案,那么这个问题的意义是什么?我们已经有从Vim内部成为Vim的根
Mikel

2
保存到/ tmp中的临时文件 - 在nano中时如何保存到临时文件?
Anand Rockzz '18

7

我刚刚尝试过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"

我调用了一个命令,view以便在知道将不进行任何更改的情况下避免出现提示。

/ usr / local / bin / view(或〜/ bin / view

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

viewVi / Vim中已经有一个名为的程序,请随时提出一个更好的名称。
(但我认为,该程序的完整实施将使Vi变得view多余。)


完整版


1
它确实会警告您。问题是您使用的是哪个版本。同样,在基于Debian的系统上,Alternatives系统更适合您的建议。
0xC0000022L

2
供您参考:[ Read ... lines (Warning: No write permission) ]在快捷方式的两行帮助的上方(屏幕底部)显示的内容。Nano版本是2.2.4。
0xC0000022L

嗯,在我正在测试的nano 2.0中它没有警告。
Mikel

很酷,我们整理出来了:)
0xC0000022L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.