如果您忘记使用 sudo,请保存文件更改

Bla*_*ack 7 command-line sudo nano

我正在使用纳米。

有时我对文件进行更改,然后在尝试保存后我意识到我需要 sudo 权限。然后我需要关闭该文件,以 sudo 重新打开它并再次进行更改......

到底有没有办法挽救呢?我记得一位同事没有保存就关闭了文件,然后执行了“sudo !!” 或其他东西,然后保存更改。

它是如何工作的?

Kus*_*nda 6

sudo !!诸如zsh或 之类的 shell 中实现 csh 样式历史扩展的命令bash将重新执行最近的命令,但在其前面加上sudo. 如果最近的命令是打开文本编辑器,则这将以 root 用户身份完成。然后您可以继续重新进行更改并保存。但是,您第一次引入的更改将会丢失。

nano假设您以非 root 用户身份使用编辑器,并且您发现自己需要将当前文件保存为 root 用户。然后,您可以通过过滤当前缓冲区的内容来完成此操作sudo tee some/file/path。该命令将以teeroot 身份运行,并覆盖或创建位于 的文件some/file/path

nano编辑器中,您可以通过按^R^X,即Ctrl+R+来调用此过滤器Ctrl+X,然后键入

|sudo tee some/file/path
Run Code Online (Sandbox Code Playgroud)

(初始|信号表明nano您要将当前文档传递给该命令。)

如果sudo需要提示您输入密码,它会这样做。^L这会使显示有点混乱,但您可以通过按( )重新绘制屏幕Ctrl+L

请注意,必须小心指定要写入的文件的正确路径名,因为这会用编辑器缓冲区的内容不可逆地覆盖该文件。由于您以 root 身份编写,因此权限不会阻止您破坏数据。因此,这是一种可能值得了解的“黑客”,但您不想依赖它。

nano版本 2.9.8(2018)中添加了从外部命令过滤文本的功能。


小智 5

尝试这个...

\n
:w !sudo tee %\n
Run Code Online (Sandbox Code Playgroud)\n

解释...

\n
    \n
  • :w\xe2\x80\x93 写入缓冲区的内容
  • \n
  • !sudo\xe2\x80\x93 将其通过管道传输到 sudo 的标准输入
  • \n
  • tee %\xe2\x80\x93 sudo 执行 tee 写入 \xe2\x80\x9c%\xe2\x80\x9d 文件
  • \n
  • %\xe2\x80\x93 Vim 将 \xe2\x80\x9c%\xe2\x80\x9d 扩展为当前文件名
  • \n
\n

  • 这是针对“vim”的,是什么让你认为OP正在使用“vim”? (8认同)

Arc*_*mar 2

sudo !!将调用最后一个命令 ( !!) sudo。无论如何,您都必须重新进行更改(假设最后一个命令是编辑)。

根据文件大小和敏感性(机密信息、明文密码等),您可以将文件保存在临时位置,然后从sudo.

会话中的示例代码vi

:w /tmp/file.txt 
sudo vi /some/path/file.txt
:%d (this will delete all content of file.txt under sudo)
:r /tmp/file.txt (this will include from /tmp/file.txt )
:x (exit vi)
rm -f /tmp/file.txt (delete file)
Run Code Online (Sandbox Code Playgroud)

注意/tmp/file.txt是暴露的。