我如何使用 vim 远程 edit/update 文本文件
How can I remotely edit/update a text file using vim
我必须在大约 200 个远程 Linux 服务器上更新一行。
有人可以告诉我使用 ssh 是否可行吗?
假设我在文本文件中有 5 行,我想更新第 3 行的命令,如下所示:
line 1
line 2
line 3 # I want to update this line
line 4
line 5
我将使用 ssh 远程使用什么命令来更新第 3 行或在其中添加更多文本?
谢谢。
有多种方法可以做到这一点。修改文件的最简单方法是使用 sed
。所以如果你想在每个服务器上以某种方式修改第 3 行,你可以这样做:
cat list-of-servers | xargs -I{} ssh {} sed -i -e '3s/line/ligne/' FILE
sed
是一个标准的 Unix 命令,所以它应该可用。如果你需要更复杂的东西,你可以用 perl -i
或 ruby -i
来完成,它们也很擅长这个。 /usr/bin/perl
二进制文件(包含核心 Perl 模块的子集)将在所有 Debian 和 Ubuntu 系统上可用,因为它是基本软件包的一部分,但在 Red Hat 或 CentOS 系统上可能不可用。
如果你真的想用Vim来做,你可以;所有冒号命令在 ex
中都可用,您可以使用 ex
修改文件。请注意,此处通常不提供正常模式命令。所以你可以这样写:
cat list-of-servers | \
xargs -I{} ssh {} 'echo '\''3s/line/ligne/ | wq'\'' | ex -s FILE'
在这种情况下,您可以只使用双引号而不是转义单引号,但在您的情况下这可能是不可能的,所以我已经演示了如何嵌套单引号,因为这很棘手。
请注意,ed
也可用于此目的,但实际上它在服务器上比 Vim 更不常见,因为它通常仅作为 patch
的依赖项安装,而为了系统管理员的利益,大多数服务器都会安装某些版本的 ex
和 vi
。
作为替代方案,请考虑将文件带到本地,在本地计算机上准备更新版本,然后发送更新。这将允许您在发送之前测试更新版本 - 风险更低,睡眠更好。
- 将所有文件复制到本地框(到主机名-FILE)
cat list-of-servers | xargs -I{} sh -c 'scp :/path/to/FILE -FILE' -- {}
- 在本地系统上进行更改
验证输出
更新远程系统
cat list-of-servers | xargs -I{} sh -c 'scp -FILE :/path/to/FILE' -- {}
我必须在大约 200 个远程 Linux 服务器上更新一行。
有人可以告诉我使用 ssh 是否可行吗?
假设我在文本文件中有 5 行,我想更新第 3 行的命令,如下所示:
line 1
line 2
line 3 # I want to update this line
line 4
line 5
我将使用 ssh 远程使用什么命令来更新第 3 行或在其中添加更多文本?
谢谢。
有多种方法可以做到这一点。修改文件的最简单方法是使用 sed
。所以如果你想在每个服务器上以某种方式修改第 3 行,你可以这样做:
cat list-of-servers | xargs -I{} ssh {} sed -i -e '3s/line/ligne/' FILE
sed
是一个标准的 Unix 命令,所以它应该可用。如果你需要更复杂的东西,你可以用 perl -i
或 ruby -i
来完成,它们也很擅长这个。 /usr/bin/perl
二进制文件(包含核心 Perl 模块的子集)将在所有 Debian 和 Ubuntu 系统上可用,因为它是基本软件包的一部分,但在 Red Hat 或 CentOS 系统上可能不可用。
如果你真的想用Vim来做,你可以;所有冒号命令在 ex
中都可用,您可以使用 ex
修改文件。请注意,此处通常不提供正常模式命令。所以你可以这样写:
cat list-of-servers | \
xargs -I{} ssh {} 'echo '\''3s/line/ligne/ | wq'\'' | ex -s FILE'
在这种情况下,您可以只使用双引号而不是转义单引号,但在您的情况下这可能是不可能的,所以我已经演示了如何嵌套单引号,因为这很棘手。
请注意,ed
也可用于此目的,但实际上它在服务器上比 Vim 更不常见,因为它通常仅作为 patch
的依赖项安装,而为了系统管理员的利益,大多数服务器都会安装某些版本的 ex
和 vi
。
作为替代方案,请考虑将文件带到本地,在本地计算机上准备更新版本,然后发送更新。这将允许您在发送之前测试更新版本 - 风险更低,睡眠更好。
- 将所有文件复制到本地框(到主机名-FILE)
cat list-of-servers | xargs -I{} sh -c 'scp :/path/to/FILE -FILE' -- {}
- 在本地系统上进行更改
验证输出
更新远程系统
cat list-of-servers | xargs -I{} sh -c 'scp -FILE :/path/to/FILE' -- {}