On Tue, Jun 01, 2004 at 08:24:03PM +0300, Anton Zinoviev wrote: > На 1.VI.2004 в 19:53 (+0300) часа Peter Pentchev писа: > > > > Пффт.. това е доста по-сложно :( Както каза Васил, passwd(1) по принцип > > не е направено за ползване в не-интерактивен режим - имам чувството, че > > в някои реализации направо си проверява за tty и те отсвирва, ако не > > намери. > > Предполагам, че Samba прави това вече по някакъв начин, защото ето > какво пише в smb.conf: > > ; For Unix password sync. to work on a Debian GNU/Linux system, the following > ; parameters must be set (thanks to Augustin Luton > ; <[EMAIL PROTECTED]> for sending the correct chat script for > ; the passwd program in Debian Potato). > passwd program = /usr/bin/passwd %u > passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* > %n\n .
Да, вярно е, че Samba прави нещо подобно, само че това не значи, че го прави лесно :( Не знам дали досега си се сблъсквал с този проблем: нуждата да parse-ваш това, което всякакви откачени локализирани или просто изпонамодифицирани и изпонапрепачвани програми плюят, вместо това, което ти *очакваш* да изплюят, но във всеки случай не е добра идея :( Още повече, че цялата история със setup-ване на твой си виртуален терминал и прихващане на целия вход/изход не е проста. Правил съм я навремето на C, след като я направих, не я ползвах, защото беше отвратително... Направих го след това с expect (който е повече или по-малко правен за това), после се опитах да го интегрирам с външна програма и много бързо се отказах... Основният проблем в тази ситуация може да се изрази точно с две думи: shell injection. Виж по-долу за може би малко по-добро решение :) > > Струва ми се, че ще стане малко по-просто, отколкото да се опитваш да > > автоматизираш диалога с passwd(1); > > Да. Просто без sudo и специални права ми изглежда по-сигурно. Ммм. Трябваше ми известно време, за да разбера какво точно ти се струва несигурно, но накрая май ми просветна: като оставим настрана възможността за дупки в самото sudo (която не може да бъде *напълно* пренебрегната, но според мен не трябва да бъде основното, от което да се водим), остава малкият проблем с това, че ако позволим на уеб-сървъра да прави chpass, то едно малко malicious скриптче ще може наистина да смени паролата на произволен потребител по този начин. Въх! Кофти :) Ако наистина това е това, което те притеснява, може би идейката, която Васил Колев ми подхвърли вчера вечерта, ще ти се стори свястна: на http://devel.ringlet.net/sysutils/passwdif/passwdif.pl има малко скриптченце, което чете от стандартния вход три реда: username, old password, new password, след което проверява дали паролата на акаунта username наистина е old password и ако е, я променя на new password. Да, това пак използва chpass/usermod/chpasswd/pw/whatever (между другото, ще трябва да го пипнеш, за да го настроиш точно какво да ползва при теб), но не изпълнява *никоя* от тези програми, преди да е успяло с помощта на съвсем нормалните и стандартни getpwent() и crypt() да е проверило, че потребителят наистина е този, за когото се представя, а и след това променя само неговата парола. Надявам се да ти хареса - не е нещо завършено или изпипано, нахвърлях го тази сутрин набързо, но може и да свърши работа :) Да, трябва да работи като root, но мисля, че няма голяма опасност да направи някоя глупост :) А ако не искаш да разчиташ на sudo, винаги можеш да промениш първия ред на passwdif и да го пускаш през suidperl (брррррррррррррррр! :) Поздрави, Петър -- Peter Pentchev [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 If this sentence didn't exist, somebody would have invented it.
pgp6nrnit9h97.pgp
Description: PGP signature