vim可以以root身份编辑远程文件吗?


10

我发现了这个问题该问题解释了如何使用以下命令使用vim编辑远程文件:

vim scp://user@myserver[:port]//path/to/file.txt

是否可以通过根目录(通过sudo)在远程主机上执行此操作?

我尝试在远程主机上创建具有root权限的文件,并使用上述内容对其进行编辑。Vim可以查看内容,可以对其进行编辑并可以对其进行保存,但是在远程主机上没有任何变化(可能是因为Vim只是保存了其临时文件,然后将其交给scp放回去了?)

使用我的用户保存的文件执行此操作时,它的行为符合预期。

我的SSH使用密钥进行身份验证,并且远程服务器对我的sudo访问具有NOPASSWD

这个问题是相似的,但是唯一带投票的答案是使用木偶,这绝对不是我想要使用的。


编辑:为了回应@drewbenn在下面的评论,这是我的完整编辑过程:

vim scp://nagios//tmp/notouch

/tmp/notouchroot拥有的文件在哪里,我看到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 / ...文件)


2
只需ssh进入服务器并在其中编辑文件(使用visudo或其他命令)。其他任何事情都会影响安全性。
佐藤桂

@SatoKatsura除了在您的本地主机上复制远程文件之外,我看不到任何实际的安全隐患。由于版本和.vimrc文件的原因,我想使用本地版本的vim
Mitch

为什么不使用配置管理将文件推送(或拉出)到生产环境呢?然后,您可以只使用本地编辑器。
thrig

@drewbenn我已用显示我正在使用的完整过程的编辑更新了问题
Mitch

嗯...行不通吗? ssh -t host sudo vim file
库桑兰达

Answers:


9

我要说这是不可能的,因为vim没有执行远程命令。它只是scp用于复制文件,在本地scp对其进行编辑并在完成后返回。如该问题中 所述,sudovia scp是不可能的,建议您修改权限以完成所需的操作,或者仅通过ssh连接到远程计算机。


不是我希望的答案,但似乎是正确的答案。也许我会写一个插件来解决这个问题
。– Mitch

嘿@Mitch,您找到任何解决方案/插件来解决您的问题了吗?我正在经历完全相同的情况!谢谢!
布鲁诺·贝洛蒂

4

像接受的答案一样,我认为这不可能直接实现。

但是,我认为至少有两种方法可以实现您的目标。

远程运行vim

ssh user@myserver sudo vim /some/file

这有缺点:

  • 您与vim的交互通过网络进行。明显的延迟会很烦人,如果您的连接中断,vim也会(最终)终止。
  • 这不会使用您本地的vim配置,而是使用远程根目录的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没有涉及。您需要通过ssh访问根帐户。

你试过了吗?


1
我没有root密码,而且我不确定在没有拥有服务器的人允许的情况下将密钥放入其中的感觉是否很舒服。它为我做的真正快捷方式是使我免于ssh-ing,sudo cp-ing,scp-ing,编辑,scp-ing,ssh-ing,sudo cp-ing(因为我的用户无法读取文件)。sshfs可能是这里的解决方法
Mitch

如果您没有对根用户的ssh访问,则sshfs很有可能不会工作。远程文件系统可能只有您的许可才能安装。我认为目前,您唯一的选择是ssh remotesystem sudo vim file
Edward Falk

您是对的-sshfs不起作用(并且您向我指出,我不小心将一堆本不应该的文件丢给了自己...),尽管我认为它可以正常工作
-Mitch

1
@Mitch-拥有服务器的人为您提供了一个用户帐户,我相信您对使用该帐户的目的负责。您将在那里放置一个公钥,任何有权访问该帐户的人都可以。您正在将该帐户的权限与私钥的拥有联系起来,正如密码知识所允许的那样。即从服务器的角度来看,拥有密钥或知道密码之间没有区别。
grochmal

底线:我认为您应该毫不犹豫地将公共密钥放在该服务器上。我认为您被ssh / sudo vim所困扰
Edward Falk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.