编辑为非root用户后,以root身份保存文件

时间:2010-12-19 17:29:34

标签: linux bash vim sudo

好的,所以这一切都发生在我身上。必须有一个更好的解决方案。假设您执行vim /etc/somefile.conf,然后执行i,但发现您不是sudo而且您无法写信。因此,我通过:q然后sudo !!丢失了我的更改并再次进行更改。有更好的方法吗?

7 个答案:

答案 0 :(得分:32)

尝试

:w !sudo tee %

w !获取整个文件并将其传递给shell命令。 shell命令是sudo tee,以超级用户身份运行tee%将替换为当前文件名。

答案 1 :(得分:1)

将文件保存在其他位置(例如您的主文件夹),然后sudo mv将其覆盖原始文件?

答案 2 :(得分:0)

将更改另存为另一个文件并进行适当的放置。

答案 3 :(得分:0)

当vim启动时,状态栏会显示[readonly],当您第一次尝试编辑时,会显示W10: Warning: Changing a readonly file并暂停一整秒。这足以让我退出并说出sudoedit /etc/somefile.conf

您可以使用插件强制执行此操作:Make buffer modifiable state match file readonly state

答案 4 :(得分:0)

根据更改的范围,使用其他名称保存(:w)文件可能会更快,然后使用sudocat覆盖原始文件的内容

sudo sh -c 'cat changed > file'

请注意,cpmv都将替换原始文件,其属性(所有权,权限,ACL)将丢失。 不要使用,除非您知道如何修复权限。

答案 5 :(得分:0)

我使用zsh模板和功能完成。

特别是this one。如果我没有写入权限,它会提示输入我的sudo密码并自动运行“sudo vim”...等等。

答案 6 :(得分:0)

我用过这个:

function! SaveAsSudo()
    let v=winsaveview()
    let a=system("stat -c \%a " .  shellescape(expand('%')))
    let a=substitute(a,"\n","","g")
    let a=substitute(a,"\r","","g")
    call system("sudo chmod 666 " . shellescape(expand('%')))
    w
    call system("sudo chmod " . a . " " . shellescape(expand('%')))
    call winrestview(v)
endfunction

我已将<F2>映射到:w<CR>。 &安培; <F8>:call SaveAsSudo()<CR>

此答案仅针对sudo tee选项提供的优势是:vim不会抱怨未保存的缓冲区或外部修改的文件。