Посчитал неудобным менять пароли пользователям по отдельности на каждом сервисе - все равно в 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 (да, я параноик), и остается в баш-хистори.
У меня есть какая-никакая обработка сообщений об ошибках, на которую можно прикрутить что-нибудь полезное. Пароль набирается пользователем, и не отображается на экране - у пользователя когда он приходит ко мне поменять пароль создается ощущение что я его пароль не знаю)))
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 так-же будет работать и такой скрипт (для более ранних версий работать не будет)