我找到了这个问题这解释了如何使用 vim 编辑远程文件:
vim scp://user@myserver[:port]//path/to/file.txt
是否可以sudo
在远程主机上以 root 身份(通过 )执行此操作?
我尝试在远程主机上创建一个具有 root 权限的文件,并使用上面的内容进行编辑。 Vim 可以看到内容,可以编辑它,也可以保存它,但远程主机上没有任何变化(可能是因为 vim 只是保存其临时文件,然后将其交给 scp 放回?)
当使用我的用户保存的文件执行此操作时,它的行为符合预期。
我的 SSH 使用密钥进行身份验证,并且远程服务器具有 NOPASSWD 供我进行 sudo 访问
这个问题类似,但唯一有投票的答案使用木偶,这绝对不是我想使用的。
编辑:为了回应@drewbenn 下面的评论,这是我的完整编辑过程:
vim scp://nagios//tmp/notouch
/tmp/notouch
root拥有的文件在哪里,我看到vim快速显示
:!scp -q 'nagios:/tmp/notouch' '/tmp/vaHhwTl/0'
这会自动消失,产生一个带有文本的空白黑屏
"/tmp/vaHhwTl/0" 1L, 12C
Press ENTER or type command to continue
按 Enter 键可以编辑文件
保存会弹出与开始相同的 scp 命令,该命令很快自动消失(很难及时读取,但 scp 和 /tmp/... 文件肯定在那里)
答案1
我想说这是不可能的,因为vim
没有执行远程命令。它只是用来scp
复制文件,在本地编辑它,scp
完成后将其返回。如中所述这个问题 sudo
viascp
是不可能的,建议您修改权限来完成您想要的操作,或者只是通过 ssh 到远程计算机。
答案2
就像已接受的答案一样,我认为这不可能直接实现。
然而,我看到至少有两种方法可以实现你的目标。
远程运行 vim
ssh user@myserver sudo vim /some/file
这有缺点:
- 您与 vim 的交互是通过网络进行的。明显的延迟会很烦人,如果你的连接中断,vim 也会中断(最终)。
- 这不会使用本地的 vim 配置,而是使用远程 root 的 vim 配置。
但它有一个优点,那就是工作。
在 vim 之外执行 scp
您可以将文件复制到本地,对其进行编辑,然后将其复制回来。您可以将其自动化,使其几乎与 vim 的 scp 支持一样无缝。
类似下面的 shell 脚本可以工作(注意,完全未经测试!):
#! /bin/sh
TMPFILE=$(mktemp)
ssh -- "$1" sudo cat "'$2'" > ${TMPFILE}
vim ${TMPFILE}
ssh -- "$1" "sudo tee '$2' > /dev/null" < ${TMPFILE} && \
rm -f ${TMPFILE}
这将允许你做类似的事情rvim user@myserver /some/file
。如果第二次传输失败,它甚至会保留本地副本,因此您不会丢失更改。
该脚本可以使用许多改进(至少是错误检查),但这只是一个起点。
答案3
您需要 root 密码或在 ~root/.ssh/authorized_keys 中拥有您的公共 ssh 密钥。一旦你拥有了这个,你也许可以做到
vim scp://root@nagios//tmp/notouch
底线:这实际上只是一个捷径
scp root@nagios:/tmp/notouch /tmp/notouch
vim /tmp/notouch
scp /tmp/notouch root@nagios:/tmp/notouch
如果您有必要的访问权限来执行此操作,那么您就有必要的访问权限来使用 vim 的网络访问插件。如果没有,那么你就不会。
正如扎卡里·布雷迪(Zachary Brady)指出的那样,sudo
他没有参与其中。您需要对 root 帐户进行 ssh 访问。
你尝试过吗?
答案4
此解决方法的先决条件(使用 rsync 而不是 scp):
您必须sudo
在远程计算机上设置无密码1
1.) 首先更改本地 vim 设置中的 rsync 命令:
:let g:netrw_rsync_cmd='rsync --rsync-path="sudo rsync"'
所以在远程主机上执行“sudo rsync”,而不仅仅是“rsync”,请参阅:h netrw-externapp
2.) 读取文件:
在主机名后面你必须写:/filename
not //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