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

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

我正在使用纳米。

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

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

它是如何工作的?

答案1

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

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

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

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

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

答案2

尝试这个...

:w !sudo tee %

解释...

  • :w– 写入缓冲区的内容
  • !sudo– 将其通过管道传输到 sudo 的标准输入
  • tee %– sudo 执行 tee 写入“%”文件
  • %– Vim 将“%”扩展为当前文件名

答案3

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)

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

答案4

一般的解决方案是“将修改后的文件写入允许的位置,退出编辑器,将文件复制/移动到正确的位置”。

VISUAL如果您将和环境变量设置EDITOR为您喜欢的编辑器的完整路径(使用例如type -p nano),则可以使用该sudoedit命令。读man sudoedit

sudoedit使用其root功能来制作您正在编辑的文件的临时副本,让您 ( $USER) 编辑该副本。当您完成编辑并且临时文件已更改时,sudoedit请将临时文件复制到您要编辑的文件。

相关内容