我必须在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
,这也是擅长的。 A /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更不常见,因为它通常只作为Vim的依赖关系安装。patch
而大多数服务器会有一些版本的 ex
和 vi
为系统管理员的利益而安装。
作为一个替代方案,考虑将文件带到本地,在你的本地机器上准备更新版本,然后发送更新。这将允许你在发送更新版本之前测试它 - 风险更小,更好的睡眠。
cat list-of-servers | xargs -I{} sh -c 'scp $1:/path/to/FILE $1-FILE' -- {}
验证输出
更新远程系统
cat list-of-servers | xargs -I{} sh -c 'scp $1-FILE $1:/path/to/FILE' -- {}