Назад | Перейти на главную страницу

Как скопировать / 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 требует привилегий, я бы хотел сделать СУДО. Как я могу поместить 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'" сделает свое дело.

Это легко сделать с помощью Paramiko (собственного SSH-клиента Python) вместо вызова команды ssh.

  • Используйте Paramiko, чтобы скопировать файл в / tmp на удаленном сервере
  • Используйте Paramiko для запуска sudo cp / tmp / hosts / etc / hosts на сервере удаления.

Существует множество примеров использования Paramiko для scp и для запуска команд с помощью sudo, доступных в Интернете.

Вам нужно выполнить 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, будет лучшим долгосрочным выбором ...

Проблема здесь в том, что вы пытаетесь скопировать файл на удаленный сервер как непривилегированный пользователь (используя свои учетные данные для входа с scp команда).

Чтобы воспользоваться sudo на удаленном компьютере вам нужно будет выполнить там команду, чтобы начать передачу. Это может выглядеть примерно так:

ssh regular_user@remote.computer sudo scp myuser@local.computer:/etc/hosts /etc/hosts

По сути, это регистрирует вас на удаленном компьютере как обычного пользователя, а затем выдает sudo команда для копирования файла с локального компьютера на удаленный. В scp логика будет выглядеть немного назад, так как она выполняется с точки зрения удаленного хоста.

Однако вам, возможно, придется поработать, чтобы ssh принимал пароли из вашего скрипта. Тем более, что вы входите в систему на удаленном компьютере и говорите ему снова войти на свой локальный компьютер.

Что вы, вероятно, захотите сделать, так это включить бит suid в этом файле, который должен принадлежать пользователю root. Затем всякий раз, когда непривилегированный пользователь запускает сценарий, он будет работать как суперпользователь.