如何将 /etc/hosts 复制到我的所有机器?

如何将 /etc/hosts 复制到我的所有机器?
import os, sys, time

servers = ['dev','admin','db1']
for s in servers:
    cmd = 'scp /etc/hosts regular_user@%s:/etc/hosts' % s
    print cmd
    os.system(cmd)

我编写了这个脚本来将我当前的 HOSTS 文件复制到我所有的其他服务器。但是,我想以普通用户(而不是 ROOT)的身份执行此操作。

由于覆盖 /etc/hosts 需要 root 权限,因此我想这样做须藤。我怎样才能将 sudo 放入该脚本中?

这不起作用,因为更改 /etc/hosts 文件的权限被拒绝。

cmd = 'sudo scp /etc/hosts regular_user@%s:/etc/hosts' % s

答案1

cat /etc/hosts | ssh otherhost "sudo sh -c 'cat >/etc/hosts'"就可以了。

答案2

您需要在远程主机上而不是本地执行 sudo。显然,要做到这一点,您在远程主机上的帐户需要 sudo 权限才能运行相关的复制命令。它看起来像这样:

cmd = 'scp /etc/hosts regular_user@%s:/tmp/hosts' % s
os.system(cmd)
cmd = 'ssh regular_user@%s sudo cp /tmp/hosts /etc/hosts' % s
os.system(cmd)

您可能会发现使用像 fabric 这样的框架或者像 cfengine 或 puppet 这样的配置管理系统是更好的长期选择......

答案3

使用 Paramiko(本机 Python SSH 客户端)可以轻松完成此操作,而无需调用 ssh 命令。

  • 使用 Paramiko 将文件 scp 到远程服务器上的 /tmp
  • 使用 Paramiko 在删除服务器上运行“sudo cp /tmp/hosts /etc/hosts”。

网络上有很多使用 Paramiko 用于 scp 以及使用 sudo 运行命令的示例。

答案4

这里的问题是,您正尝试以非特权用户身份将文件复制到远程服务器(使用命令中的登录凭据scp)。

为了利用sudo远程计算机,您必须在那里执行命令来启动传输。它可能看起来像这样:

ssh [email protected] sudo scp [email protected]:/etc/hosts /etc/hosts

这实际上是让您以普通用户身份登录到远程计算机,然后发出命令sudo将文件从本地计算机复制到远程计算机。逻辑scp看起来有点倒退,因为它是从远程主机的角度执行的。

不过,您可能需要做一些工作才能让 ssh 接受来自脚本的密码。特别是当您登录到远程计算机并告诉它重新登录到本地计算机时。

相关内容