user + passwd tömeges létrehozása (normál is meg samba is)

 ( mezgaaladar | 2005. augusztus 17., szerda - 12:02 )

user + passwd tömeges létrehozása (normál is meg samba is)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Sziasztok!

Az lenne a kérdésem, hogy a címben vázolt matematikai :D képletre tudtok-e valami egyszerű megoldást? A helyzet ugyanis az, hogy nincs kedvem/energiám mintegy 300 diáknak egyesével azonosítót és jelszót generálni a készülő iskolai fájlszerverre, és ezt a folyamatot megismételni, amikor samba userekké emelem őket.

Az ötleteket előre is hálásan köszönöm!

Üdv!

Ha nagyon muszaj smbpasswd-vel szivnod akkor shell script :)

Ha nem akkor LDAP + smbldaptools + shell script.

Udv.

Hátha ez segít, nem volt időm átolvasni:

How to change both the Unix and SMB passwords for a user?

Extracted from comp.protocols.smb
Tip provided by Dean Pentcheff
> But how can I sync the passwords
> the other way? I mean, when a user changes his password on the
> linux-server, how can I sync this with samba?

Code appended. Have users use this instead of "passwd" (you may
prefer to move passwd to something else and install this instead --
note that you'll need to change the constant in this program to point
to the "real" Unix passwd program that you just renamed).

===== code begins (delete this line) =====
/*
* cpasswords.c
* Copyright N. Dean Pentcheff 1998
* University of South Carolina
* dean2@mail.biol.sc.edu
* This program may be redistributed either under the terms of the GNU Copyleft
* or the Perl Artistic License (http://www.perl.com).
*
* Change both the Unix and SMB passwords for a user.
*
* To work, must be installed SUID-root.
* Uses the current user's username, except that if the program is called
* by the root user, a username can be given as an argument.
* If called interactively (from a tty), is slightly verbose, and uses
* the standard getpass() routine to query for a password twice.
* If called noninteractively, expects the password (once) on stdin.
*
* Customize the locations of the standard Unix and SMB password programs
* in the "#defines" near the top (do NOT be tempted to add code to make
* these changeable from command-line arguments: these programs will
* be run as root!). If your paths are obscenely long, examine the
* size of STRLEN to make sure it will accomodate them.
* The only check on password quality is existence (len > 0) and for
* non-root callers a minimum length (MINPWLEN). This can be enhanced.
* The sleep()s in the actual pwd-changing routines appeared to be necessary
* in some early tests I did with the PAM-passwd program on Linux. I'm
* not convinced they're always necessary. Delays in a pwd-changing
* program aren't a bad idea anyway, so I've left them in.
*/
#include <fcntl.h>
#include <sys/ioctl.h>
#include <pwd.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define PASSWD "/usr/bin/passwd"
#define SMBPASSWD "/usr/local/bin/smbpasswd"
#define PROMPT1 "Type a new password: "
#define PROMPT2 "Type the same password again: "
#define MINPWLEN 6
#define STRLEN 1024

int change(char *program, char *user, char *pwd, FILE *mystderr);

int main (
int argc,
char **argv)
{
int fd;
struct passwd *pwentry;
char name[STRLEN];
char newpw[STRLEN];
int reallyroot = 0;
char *cp;
FILE *mystderr;

/* do we have the appropriate permissions? */
if (geteuid() != 0) {
fprintf(stderr, "This program cannot run unless it is SUID-root, "
"exiting...\n");
exit(1);
}
if (getuid() == 0)
reallyroot = 1;

/* get the appropriate username */
if (argc > 1) {
if (reallyroot) {
/* if root, we can specify a username */
strncpy(name, *++argv, STRLEN);
} else {
fprintf(stderr, "Only the root user can specify a name, exiting...\n");
exit(1);
}
} else {
/* pick up the current user's username */
if ((pwentry = getpwuid(getuid())) == NULL) {
fprintf(stderr, "Failed getting name entry for UID=%d, exiting...\n",
getuid());
exit(1);
}
strncpy(name, pwentry->pw_name, STRLEN);
}

/* get a password and clean any cr/lf stuff */
if (isatty(0)) {
/* interactive, so use a no-echo prompt twice */
fprintf(stderr, "Changing password for user '%s'\n", name);
cp = getpass(PROMPT1);
strncpy(newpw, cp, STRLEN);
cp = getpass(PROMPT2);
if (strcmp(newpw, cp)) {
fprintf(stderr, "The two versions don't match, exiting...\n");
exit(1);
}
} else {
/* noninteractive, so just get it from stdin */
if (read(0, newpw, STRLEN) <= 0) {
fprintf(stderr, "Failed to read a new password, exiting...\n");
exit(1);
}
}
for (cp=newpw; *cp!='\n' && *cp!='\r' && cp-newpw<= 0) {
fprintf(stderr, "No password entered, exiting...\n");
exit(1);
}
if ( ! reallyroot) {
if (strlen(newpw) < MINPWLEN) {
fprintf(stderr, "Password must be at least %d characters long, "
"exiting...\n", MINPWLEN);
exit(1);
}
}

/* get a private stderr, then close stderr/stdout to silence pwd programs */
if ((fd = dup(2)) < 0) {
fprintf(stderr, "Strange! Couldn't dup error-output fd, exiting...\n");
exit(1);
}
if ((mystderr = fdopen(fd, "w")) == NULL) {
fprintf(stderr, "Strange! Couldn't fdopen new stderr fd, exiting...\n");
exit(1);
}
close(1);
close(2);

/* detach from controlling tty to get password programs to read stdin */
if ((fd = open("/dev/tty", O_RDWR)) >= 0) {
if (ioctl(fd, TIOCNOTTY) < 0) {
fprintf(mystderr, "Failed to detach from /dev/tty: %s, exiting...\n",
strerror(errno));
exit(1);
}
close(fd);
}

/* shuffle UIDs for permissions - we know we are running SUID-root */
if (setuid(geteuid()) != 0) {
fprintf(stderr, "Failed to properly set UID, exiting...\n");
exit(1);
}

/* change the Unix password */
if (isatty(0))
fprintf(mystderr, "Changing Unix password...\n");
if ( ! change(PASSWD, name, newpw, mystderr))
exit(1);
if (isatty(0))
fprintf(mystderr, "\tSuccessfully changed Unix password.\n");

/* change the SMB password */
if (isatty(0))
fprintf(mystderr, "Changing SMB/Windows password...\n");
if ( ! change(SMBPASSWD, name, newpw, mystderr))
exit(1);
if (isatty(0))
fprintf(mystderr, "\tSuccessfully changed SMB/Windows password.\n");

exit(0);
}

int
change(char *program,
char *user,
char *pwd,
FILE *mystderr)
{
char cmd[STRLEN];
FILE *cmdpipe;
int status;

/* open a pipe to and then feed the password program, slowly */
strncpy(cmd, program, STRLEN);
strncat(cmd, " ", STRLEN - 1);
strncat(cmd, user, STRLEN - strlen(cmd));
if ((cmdpipe = popen(cmd, "w")) == NULL) {
fprintf(mystderr, "Failed to open pipe to '%s', exiting...\n", cmd);
return 0;
}
sleep(3);
fprintf(cmdpipe, "%s\n", pwd); fflush(cmdpipe); sleep(2);
fprintf(cmdpipe, "%s\n", pwd); fflush(cmdpipe); sleep(2);
if ((status = pclose(cmdpipe)) != 0) {
fprintf(mystderr, "Program '%s' returned error code %d, exiting...\n",
cmd, status);
return 0;
}

return 1;
}
============ code ends ==============

Hi!

Nekem egy kicsit más problémám van. Tehát amikor a tanuló megváltoztatja a passwd parancsal a jelszvát akkor azt a sambanak is frissítenie kéne. Hogyan tudnám ezt megoldani?

Köszi!

Sziasztok!

Megkésve bár, de... :) Szóval sikerült az ötletek alapján (is) egy épkézláb perl scriptet összehoznom, ami fileból olvasva az adatokat elvégzi a szükséges feladatokat. 370 tanár és diák használja mától élesben. (juhhu) :D A scriptet, ha valakinek szüksége van rá, szívesen közzéteszem.

Egy kérdésem is volna viszont, ill. ismét ötleteket várnék, hogy szerintetek hogy a legegyszerűbb megcsinálni, hogy a diák, ha belép akkor ne kelljen neki az outlook expresst állítgatnia, hanem egyből bekonfigurálva találja ott. Sajnos ragaszkodnak hozzá, hiába javasoltam a thunderbirdet (ahol még meg is tudnám csinálni)... Szóval nem tudom, hogy ez a nyamvadt vindóz hova mindenhova súvasztja be az információkat (mail szerver, usernév, passwd...stb). Nem tudjátok, hogy az oe-nek nincs valami thunderbirdös prefs.js-hez hasnoló file-ja, vagy hogy lehetne a problémát kiküszöbölni. (azon kívül, hogy a faliújságra kiírom, hogy miként kell beállítani :D )

Köszönöm.

MA

Itt legalabb csak egyszer kell megadnod az adatokat:
Később majd tovább akarom fejleszteni, hogy text állományból olvassa, de indén még úgy sem volt abban, így nem küzdöttem vele.
Nem a legelegánsabb, de pár perc alatt készen volt.

Íme, ami nálunk van:

#!/bin/bash
clear
echo " "
echo " ............ Felhasználó létrehozó script! ......... Rózsár G. 2005 ..."

# felhasznaloi csoport konstansok
export CSOPORT1="diak"
export CSOPORT2="tanar"
export CSOPORT3="adminisztracio"

# Kvota konstansok
export CSOP1K="25600"
export CSOP2K="256000"
export CSOP3K="512000"

# E-mail domain
export EDOMAIN="@bercsenyi-bp.sulinet.hu"

# egroup adatok
export ALAPCSOPORT=2
export MYSQLPASSWD='na ezt azert kitoroltem'

# felhasznaloi alapadatok
export VNEV=""
export KNEV=""
export UNEV=""
export ECIM=""
export KORNYEZETE="/bin/false"
export PASSWORDJE=""
export CSOPORTJA=""
export ECSOPORTJA=""

# Adatok bekérése:

echo "Kérem a felhasználó vezetéknevét: "
read VNEV
echo " "
echo "Kérem a felhasználó keresztnevét: "
read KNEV
echo " "
echo "Kérem a felhasználó user-nevét: "
read UNEV
cat /etc/passwd | grep $UNEV
PROBA=$?
case "$PROBA" in
1):
echo "OK!";;
0):
echo "Sajnálom $USERNEV felhasználó MÁR létezik!!!";
exit 1;;
esac
echo " "
echo "Kérem a felhasználó jelszavát: "
read PASSWORDJE
echo " "
echo " "
echo "Neve: " $VNEV" "$KNEV "Userneve: " $UNEV " jelszava: " $PASSWORDJE
echo " "
echo " "
echo "Mely csoporthoz kíván felhasználót hozzáadni:"
echo "1," $CSOPORT1
echo "2," $CSOPORT2
echo "3," $CSOPORT3
echo ""
read valasztas
case "$valasztas" in
1):
export CSOPORTJA=$CSOPORT1;
useradd -m -p $PASSWORDJE -d /home/diak/$UNEV -s $KORNYEZETE -c $UNEV -g $CSOPORTJA $UNEV;
echo $UNEV:$PASSWORDJE|chpasswd --md5;
mkdir /home/diak/$UNEV/public_html;
chown $UNEV.$CSOPORTJA /home/diak/$UNEV/public_html;
chmod 755 /home/diak/$UNEV/public_html;
(echo $PASSWORDJE; echo $PASSWORDJE)|smbpasswd -s -a $UNEV;
setquota -u $UNEV -F xfs 0 $CSOP1K 0 0 -a /home;;
2):
export CSOPORTJA=$CSOPORT2;
ECIM=$KNEV"."$VNEV;
useradd -m -p $PASSWORDJE -s $KORNYEZETE -c $UNEV -g $CSOPORTJA $UNEV;
echo $UNEV:$PASSWORDJE|chpasswd --md5;
maildirmake /home/$UNEV/Maildir;
chown -R $UNEV.$CSOPORTJA /home/$UNEV/Maildir
chmod -R 700 /home/$UNEV/Maildir
mkdir /home/$UNEV/public_html;
chown $UNEV.$CSOPORTJA /home/$UNEV/public_html;
chmod 755 /home/$UNEV/public_html;
(echo $PASSWORDJE; echo $PASSWORDJE)|smbpasswd -s -a $UNEV;
echo $ECIM": "$UNEV>>/etc/aliases;
/usr/bin/newaliases;
mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;INSERT INTO phpgw_accounts
VALUES ('','$UNEV',MD5('$PASSWORDJE'),'$VNEV','$KNEV','','','','A','-1','u','0','$ALAPCSOPORT','$ECIM$EDOMAIN')";
IDEIGLENES=`mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;SELECT account_id FROM phpgw_accounts WHERE account_lid='$UNEV'";`;
IDEIGLENES2=`echo $IDEIGLENES|tr -d "account_id_"`;
mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;INSERT INTO phpgw_acl
VALUES ('phpgw_group','$ALAPCSOPORT','$IDEIGLENES2','1')";
setquota -u $UNEV -F xfs 0 $CSOP2K 0 0 -a /home;;
3):
export CSOPORTJA=$CSOPORT3;
ECIM=$KNEV"."$VNEV;
useradd -m -p $PASSWORDJE -s $KORNYEZETE -c $UNEV -g $CSOPORTJA $UNEV;
echo $UNEV:$PASSWORDJE|chpasswd --md5;
maildirmake /home/$UNEV/Maildir;
chown -R $UNEV.$CSOPORTJA /home/$UNEV/Maildir
chmod -R 700 /home/$UNEV/Maildir
mkdir /home/$UNEV/public_html;
chown $UNEV.$CSOPORTJA /home/$UNEV/public_html;
chmod 755 /home/$UNEV/public_html;
(echo $PASSWORDJE; echo $PASSWORDJE)|smbpasswd -s -a $UNEV;
echo $ECIM": "$UNEV>>/etc/aliases;
/usr/bin/newaliases;
mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;INSERT INTO phpgw_accounts
VALUES ('','$UNEV',MD5('$PASSWORDJE'),'$VNEV','$KNEV','','','','A','-1','u','0','$ALAPCSOPORT','$ECIM$EDOMAIN')";
IDEIGLENES=`mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;SELECT account_id FROM phpgw_accounts WHERE account_lid='$UNEV'";`;
IDEIGLENES2=`echo $IDEIGLENES|tr -d "account_id_"`;
mysql -u root --password=$MYSQLPASSWD -h localhost --execute="USE egroupware;INSERT INTO phpgw_acl
VALUES ('phpgw_group','$ALAPCSOPORT','$IDEIGLENES2','1')";
setquota -u $UNEV -F xfs 0 $CSOP3K 0 0 -a /home;;
esac
chmod 700 /home/*
chmod 755 /home/diak
chmod 755 /home/samba
echo ""
echo "A kiválasztott csoport: $CSOPORTJA"
echo " "
echo "A művelet végetért... "

Amúgy várlak ősszel itt: http://lok.hu

Üdv: G.

[quote:61a3740dc2="mezgaaladar"]Sziasztok!

Megkésve bár, de... :) Szóval sikerült az ötletek alapján (is) egy épkézláb perl scriptet összehoznom, ami fileból olvasva az adatokat elvégzi a szükséges feladatokat. 370 tanár és diák használja mától élesben. (juhhu) :D A scriptet, ha valakinek szüksége van rá, szívesen közzéteszem.

Egy kérdésem is volna viszont, ill. ismét ötleteket várnék, hogy szerintetek hogy a legegyszerűbb megcsinálni, hogy a diák, ha belép akkor ne kelljen neki az outlook expresst állítgatnia, hanem egyből bekonfigurálva találja ott. Sajnos ragaszkodnak hozzá, hiába javasoltam a thunderbirdet (ahol még meg is tudnám csinálni)... Szóval nem tudom, hogy ez a nyamvadt vindóz hova mindenhova súvasztja be az információkat (mail szerver, usernév, passwd...stb). Nem tudjátok, hogy az oe-nek nincs valami thunderbirdös prefs.js-hez hasnoló file-ja, vagy hogy lehetne a problémát kiküszöbölni. (azon kívül, hogy a faliújságra kiírom, hogy miként kell beállítani :D )

Köszönöm.

MA[/quote:61a3740dc2]

Hát, szerintem ha itt közzéteszed azt sokan megköszönik.
Jó 5letem nincs, kicsit jó van. Legyen roaming profil, így ha egyszer valahol beállította, akkor bármely géphez ül be lesz állítva, mivel a profil viszi a beállításokat.
Esetleg mintha volna valami profil másolás a windozba...

A faliújság a legjobb, nálunk is ott a proxy beállítás! :)

A diák meg szerintem freemailezzen webes felületen, ne irogasson iskolai e-mail címmel. (Nálunk legalábbis nincs e-mail fiokja, mint a scriptemből is látszik.)

Mondjuk ezt még lehet ritkítani, mert létrehozza az e-mail aliast is és az egroupware felhasználóit is.

ja meg a kvótát is beállítja.

na asssszem má nem felejtettem ki semmit.

szóval, ha ezeket kigyakod, akkor lényegesen kisebb lesz

Sziasztok!

Nagyon köszönöm az ötleteket, kódokat! Első ránézésre reménykeltőek... :D Hétfőn igyekszem kipróbálni őket, majd beszámolok!

Addigi is minden jót!
A

Iskolai környezetben nem biztos, hogy legjobb ötlet a roaming profile, mert akkor előre kell gondolni arra, hogy a diákok a 600megás pr0n.avi-t a desktopon tárolják, ami a ki/belépési idők drasztikus növekedését eredményezi.
Persze a Windowsban lehet állítgatni, hogy a profil melyik része roamingolható, de a dolognak azért vannak buktatói. :)

Erre találták ki a quotat :)

[quote:1ac3656d74="Previ"]Iskolai környezetben nem biztos, hogy legjobb ötlet a roaming profile, mert akkor előre kell gondolni arra, hogy a diákok a 600megás pr0n.avi-t a desktopon tárolják, ami a ki/belépési idők drasztikus növekedését eredményezi.
Persze a Windowsban lehet állítgatni, hogy a profil melyik része roamingolható, de a dolognak azért vannak buktatói. :)[/quote:1ac3656d74]

Több megoldás is van, lásd pl quota, mint a kolléga írta, no meg aztán a squid -is megteheti, hogy nem engedi át az avi-kat, mpg-ket stb, legalábbis a diákok számára nem. Aztán lehet éjjszakánként "tisztogató" scriptet csinálni, ami törli azt ami szerinted felesleges. (nálam pl mozzilla cache volt régen így)
Azt gondolom amit lehet központilag kell megcsinálni. Fő a lustaság. :)

Nem is a quota az igazi megoldás, hanem a windows policy-ban beállítható, hogy mekkora profilt engedélyezzen. Sőt, az is, hogy valami speckó üzenetet írjon ki, ha a profil teli. Pl azt, hogy mit is csináljon a lúzer, ha már így járt.

Outllok, vagy Outlook express? Ha OE, akkor az is eléggé gázos, hogy annak a file-jait hogyan mozgatod ki a homeshare-re, hogy annak ne kelljen ki-be töltődnie:
-------------------
http://www.techsoup.org/forums/index.cfm?fuseaction=read&forum=2009&id=55498&cid=117&mid=189899

RE: roaming profiles and outlook express
Posted: September 27 2004 9:40 PM Post Reply

Patricia,

Yes, this is possible. Not easy, but possible. Outlook Express is not server aware so it attempts to store the user's profile in their preferences directory. And it will default to the local machine. Plus if you stored the mail files in the preferences directory of the roaming profile, they would get deleted and overwritten every time the user logged in... which defeats the whole purpose.

So, it's a little convoluted and will require you touching every person's settings. And you need to make sure you have PLENTY of space on your server hard drive b/c Outlook Express mailbox files can easily get over 1 GB in size each b/c all email attachments are stored there.

Now the instructions...
0) BACK UP THE USER'S CURRENT OE MAIL STORE TO A SAFE PLACE!

1) Create a place for Outlook Express to store mail. By default, it stores your mail in a non-roaming part of your profile which is simply deleted when you log off.

Here is how to store the mail permanently and have it roam with you:

(a) Login via the roaming login and make a folder on your desktop named Mail.

(b) In Outlook Express, choose Tools, Options, Maintenance, Store Folder, Change.

(c) Navigate to the Mail folder you just created (within Desktop) and choose it.

(d) Immediately close Outlook Express and log out. Log back in again and your mail will be placed in that folder.

NOTE: If users have large mail files, using this method will make their logins and logoffs slow b/c the server will copy the files to/from the server to/from the desktop every time the login!

2) So, if your users have a lot of mail, you may want to make and map a folder on a shared drive called something like F:\Mail on your F: drive (F: being a generic reference to whatever drive letter you're assigning to your shared drive) and keep it there.

By default, Outlook Express will *not* let you move the mail folder to a drive other than C:. However, you can achieve this by editing the Registry. Carefully run Regedit and navigate to:
\HKEY_CURRENT_USER\Identities\{...whatever...}\Software\Microsoft\Outlook Express\5.0
(yes, even though you're running version 6.0).

Change the value of StoreRoot to F:\Mail (or whatever you created in step 2).

You can now do Step 1 above.

3) Remember that backup you made? If you didn't back it up, you just lost ALL THEIR MAIL!

Now, when you change your mail store location, the first time you open OE after changing the store location, it will create all new mailboxes - no matter what. DO NOT COPY THE OLD MAILBOX FILES TO THE NEW LOCATION BEFORE OPENING OE FOR THE FIRST TIME AFTER THE CHANGE. So open OE for the first time so it can get this over with. Then you can copy all of the mailboxes that you backed up into the new location. The next time you open OE, it will show their old mail and folders.

Best of luck!
- Daniel P.
-----------------
Best of luck!
- Oops

lényeg a lényeg: thunderbird rulez.
abban megoldható sokminden