当 ssh root 登录被禁用时,使用 sudo 在 Vim 中编辑远程文件

当 ssh root 登录被禁用时,使用 sudo 在 Vim 中编辑远程文件

我正在尝试确定一种在 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

相关内容