如何将/ 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根本privelages,我想做SUDO 。 我怎么能把sudo放在脚本里面?

这是行不通的,因为它是拒绝更改/ etc / hosts文件的权限。

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

cat /etc/hosts | ssh otherhost "sudo sh -c 'cat >/etc/hosts'" cat /etc/hosts | ssh otherhost "sudo sh -c 'cat >/etc/hosts'"将会诀窍。

您需要在远程主机上执行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) 

你可能会发现使用像cfengine或puppet这样的结构或configurationpipe理系统的框架是一个更好的长期select。

这很容易使用Paramiko(本地Python SSH客户端)完成,而不是调用ssh命令。

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

有很多Paramiko的例子用于scp,并用sudo运行命令,可以在网上find。

你可能想要做的就是打开这个文件上的suid位,这个文件应该由root拥有。 然后,每当非特权用户运行脚本时,它将以超级用户身份运行

这里的麻烦是你试图将一个文件作为非特权用户(通过scp命令使用你的login凭证)复制到远程服务器上。

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

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

这基本上以普通用户的身份login到远程计算机,然后发出sudo命令将文件从本地计算机复制到远程计算机。 scp逻辑会稍微向后看,因为它是从远程主机的angular度来执行的。

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