Смена пароля пользователя в нескольких сервисах сразу

Посчитал неудобным менять пароли пользователям по отдельности на каждом сервисе - все равно в 99% пароли у юзеров одинаковые и для почты и для самбы. В cl-passwd нет параметра ‘all’ в качестве имени сервиса - поменять пароль во всех доступных сервисах. Набросал скрипт на perl+expect, который делает грязную работу )) Может кому пригодится.

Чтобы работало нужно поставить вот это:

emerge -av dev-perl/TermReadKey dev-perl/Expect

#!/usr/bin/perl
use Expect;
use Term::ReadKey;
if (@ARGV[0]) {
$user=@ARGV[0]; 
} else {
print "Первым параметром должно быть имя пользователя \n"; exit ();}

ReadMode 'noecho';
print 'Пароль: ';
my $p1 = ReadLine; 
print "\n";
print "Подтверждение:";
my $p2 = ReadLine; 
print "\n";

if ($p1 eq $p2) {
$password=$p1;
} else {
print "Пароли не совпадают";
exit ();
}

ReadMode 'normal';
chomp $password;

foreach $service ("unix","samba","proxy","mail","jabber") {

my $exp = Expect->spawn("cl-passwd", ($user,$service)) or die "Cannot spawn $command: $!\n";
$exp->log_stdout(0); # Не выводить на экран 

$exp->expect($timeout,
            [ "пароль:" => sub {$exp->send("$password\n"); exp_continue;}  ],
            [ "пароль:" => sub {$exp->send("$password\n"); exp_continue;}  ],
            [ "изменен" => sub {print "Пользователь $user сервис $service - OK  \n"; exp_continue;} ],
            [ "найден" => sub {print "Пользователь $user сервис $service - ERR \n"; exp_continue;} ]
            );
$exp->soft_close();
}

exit ();

Есть реализации expect для перла, питона, и собственный интерпретатор с языком на Tcl/Tk. eix expect. Конструктивная критика принимается и ожидается.

Скрипт может многим пригодиться. Используйте рассылку разработчиков calculate-dev-ru для объявления.

P.S. Сам скрипт на форуме удобней прикреплять к сообщению файлом. В этом случае его можно будет как просмотреть в отдельном окне, так и загрузить отдельным файлом.

Лучше использовать что-то подобное этому:

#!/bin/bash
USER=$1
PASSWD=$2
if [ $# -ne 2 ]
then
    echo "Using: script USER PASSWD"
    exit 1
else
for i in unix samba proxy mail jabber
    do 
       echo -e "$PASSWD\n$PASSWD" | cl-usermod -P $USER $i
    done
fi

Короче - да, правильнее - не соглашусь. Пароль передается в открытом виде параметром - светится в PS -AF (да, я параноик), и остается в баш-хистори.

У меня есть какая-никакая обработка сообщений об ошибках, на которую можно прикрутить что-нибудь полезное. Пароль набирается пользователем, и не отображается на экране - у пользователя когда он приходит ко мне поменять пароль создается ощущение что я его пароль не знаю)))

К тому-же:

echo -e "$PASSWD" | cl-usermod -P $USER $i

правильнее - не соглашусь

Cкрипт не претендует на универсальность его можно использовать как пример, для написания своего. Основной упор делается на использовании опции -P команды cl-usermod.

(да, я параноик)

Тогда для разные сервисов нужны разные пароли

К тому-же:

Строка универсальна для всех версий calculate-server

Для всех версий calculate-server будет работать следующая строка:
(для изменения пароля пользователя user_name на password в сервисе service (unix, samba, …))

echo -e "password\npassword" | cl-usermod -P user_name service

для calculate-server >= 2.1.11 так-же будет работать и такой скрипт (для более ранних версий работать не будет)

echo "password" | cl-usermod -P user_name service