我正在使用纳米。
有时我对文件进行更改,然后在尝试保存后我意识到我需要 sudo 权限。然后我需要关闭该文件,以 sudo 重新打开它并再次进行更改......
到底有没有办法挽救呢?我记得一位同事没有保存就关闭了文件,然后执行了“sudo !!”或其他东西,然后保存更改。
它是如何工作的?
答案1
sudo !!
诸如zsh
或 之类的 shell 中实现 csh 样式历史扩展的命令bash
将重新执行最近的命令,但在其前面加上sudo
.如果最近的命令是打开文本编辑器,则这将以 root 用户身份完成。然后您可以继续重新进行更改并保存。但是,您第一次引入的更改将会丢失。
nano
假设您以非 root 用户身份使用编辑器,并且您发现自己需要将当前文件保存为 root 用户。然后,您可以通过过滤当前缓冲区的内容来完成此操作sudo tee some/file/path
。该命令将以tee
root 身份运行,并覆盖或创建位于 的文件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
请将临时文件复制到您要编辑的文件。