我正在尝试确定一种在 Vim 中编辑需要 sudo 的远程文件的方法,但仍使用我的本地 vim 配置和插件。
目前我可以打开vim
并:e scp://me@server//some/root/file
进行更改,但是当我尝试写入它时,我当然会收到“权限被拒绝”的提示。
如果我尝试“我忘记了 sudo”命令 ( :w !sudo tee %
),它会尝试以 root 身份将文件 scp 回来,但该功能已被禁用。我也尝试过ssh -t user@host sudo vim /some/file
,但这不会获取任何本地配置。
有人能建议一下我可能忽略的方法吗?提前谢谢大家。
答案1
你不能直接将 Vim 配置复制到远程服务器,然后在那里编辑吗?当然,前提是安装了 Vim 和 X。
“rsync” 命令可以很好地保持一切一致,因此您可以将 Vim 设置复制到任何地方。理想情况下,您可以登录远程服务器,并以 root 身份安装 Vim 配置。:-)
例子:
rsync -avzp ~/.vimrc ~/.vim you@remote-server:~
ssh you@remote-server
sudo rsync -avzp ~you/.vimrc ~you/.vim ~root
答案2
假设您在远程服务器上具有 sudo 访问权限,您最终可以从 vim 执行此操作:
function! WriteRemote()
let pat = '^scp://\(.\{-}\)/'
let l = matchlist( bufname('%'), pat)
if len(l) < 2
echom "could not get remote host"
return
end
let remote = l[1]
let temp_file = expand('%:t')
let dest_file = substitute( bufname('%'), pat, '', '')
execute "write! scp://" . remote . "//tmp/" . temp_file
execute "!ssh -t " . remote .
\ " 'sudo tee >/dev/null -- " . dest_file .
\ " </tmp/".temp_file .
\ " ; rm -- /tmp/".temp_file . "'"
endfunction
您可以使用以下方式保存远程本地缓冲区:execute WriteRemote()
请注意,此功能尚未经过大量测试。但您已经明白了。
答案3
执行此方式的先决条件(使用 rsync 而不是 scp):您必须在远程计算机上
没有密码。sudo
如果是真的,您可以:
1.)首先在本地 vim 设置中更改 rsync 命令:
:let g:netrw_rsync_cmd='rsync --rsync-path="sudo rsync"'
因此在远程主机上执行“sudo rsync”,而不仅仅是“rsync”:h netrw-externapp
2.) 读取文件:
在主机名后你必须写:/filename
不//filename
(像在 vim 中一样?!)
:e rsync://myhost.net:/etc/apt/sources.list
3.)写入文件
:e rsync://myhost.net:/etc/apt/sources.list
x.) 打印可能的错误使用:
:verbose e rsync://myhost.net:/etc/my_file