Изменить пароль Unix из командной строки через Python / Fabric - PullRequest
8 голосов
/ 20 июня 2010

Я хотел бы обновить мой пароль на удаленной коробке Ubuntu 10.4 с помощью ткани .

Я ожидаю, что мой fabfile.py будет выглядеть примерно так:

def update_password(old_pw, new_pw):
    # Connects over ssh with a public key authentication
    run("some_passwd_cmd --old %s --new %s" % (old_pw, new_pd))

К сожалению, единственная известная мне команда, позволяющая изменить пароль, - это passwd, а в Ubuntu 10.4, похоже, нет способа передать новый (или старый) пароль в качестве аргумента passwd.

Какую команду можно использовать для изменения пароля пользователя в Ubuntu 10.4 с помощью fabric?

EDIT : Я посмотрел на usermod -p, и это может сработать, но это не рекомендуется man-страницей.

РЕДАКТИРОВАТЬ : По какой-то причине usermod -p не работал ни на ткани.

Также я попробовал (несколько небезопасный) вариант ответа mikej, который решил проблему:

# connecting & running as root.
from fabric.api import *
from fabric.contrib import files

files.append("%s\n%s" % (passwd, passwd), '.pw.tmp')
# .pw.tmp:
# PASSWD
# PASSWD

run("passwd %s < .pw.tmp" % user)

run("rm .pw.tmp")

Это не очень элегантное решение, но оно работает.

Спасибо, что прочитали.

Brian

Ответы [ 5 ]

14 голосов
/ 20 июня 2010

Вы можете ввести новые и старые пароли в passwd, используя echo например,

echo -e "oldpass\\nnewpass\\nnewpass" | passwd

(опция -e для echo позволяет интерпретировать экранирование обратной косой черты, поэтому переводы строк интерпретируются кактакие)

10 голосов
/ 28 февраля 2011

Хитрость заключается в том, чтобы использовать комбинацию usermod и Python's crypt для изменения пароля:

from crypt import crypt
from getpass import getpass
from fabric.api import *

def change_password(user):
    password = getpass('Enter a new password for user %s:' % user)
    crypted_password = crypt(password, 'salt')
    sudo('usermod --password %s %s' % (crypted_password, user), pty=False)
5 голосов
/ 18 июня 2011

Я использую chpasswd в Ubuntu 11.04

fabric.api.sudo('echo %s:%s | chpasswd' % (user, pass))

Примечание: Обычно этот шаблон не работает:

$ sudo echo bla | restricted_command

потому что только «echo» получает повышенные привилегии, а не «limited_command».

Однако, здесь это работает, потому что когда fabric.api.sudo вызывается с shell = True (по умолчанию), фабрика собирает команду следующим образом:

$ sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

sudo создает новую оболочку (/ bin / bash), работающую с привилегиями root, и затем эта расширенная оболочка запускает команду.

Еще один способ использовать sudo - использовать sudo tee :

3 голосов
/ 15 марта 2011

Из-за интереса, я должен выполнить аналогичную задачу для коллекции ящиков Solaris (добавить много пользователей, установить их пароль). В пользовательском модуле Solaris нет опции --password, поэтому в прошлом я использовал Expect для этого, но написание сценариев Expect может быть болезненным.

Так что в этот раз я собираюсь использовать crypt.crypt в Python, редактировать / etc / shadow напрямую (с резервными копиями, конечно). http://docs.python.org/release/2.6.1/library/crypt.html

Комментаторы предложили использовать различные заклинания эха, переданные в passwd. На самом деле, это никогда не сработает, так как passwd запрограммирован на игнорирование ввода от stdin и прием ввода только от интерактивного tty. Смотри http://en.wikipedia.org/wiki/Expect

1 голос
/ 22 июня 2019

Мне не повезло с другими методами.Думаю, я поделюсь своим методом, который я использовал для одноразового сценария.

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

Это не самый безопасный метод, но в зависимости от вашего варианта использования он может быть полезен.

...