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 для 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. Затем всякий раз, когда непривилегированный пользователь запускает сценарий, он будет работать как суперпользователь.