Посчитал неудобным менять пароли пользователям по отдельности на каждом сервисе - все равно в 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. Конструктивная критика принимается и ожидается.