<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.sachsen.schule/dwiki/index.php?action=history&amp;feed=atom&amp;title=Benutzer%3AKirmse%2Fdelixs-userpasswd</id>
	<title>Benutzer:Kirmse/delixs-userpasswd - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sachsen.schule/dwiki/index.php?action=history&amp;feed=atom&amp;title=Benutzer%3AKirmse%2Fdelixs-userpasswd"/>
	<link rel="alternate" type="text/html" href="https://wiki.sachsen.schule/dwiki/index.php?title=Benutzer:Kirmse/delixs-userpasswd&amp;action=history"/>
	<updated>2026-05-02T17:53:39Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Delixs</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.sachsen.schule/dwiki/index.php?title=Benutzer:Kirmse/delixs-userpasswd&amp;diff=7320&amp;oldid=prev</id>
		<title>Kirmse: Script zum Ändern der Passworte eines Users</title>
		<link rel="alternate" type="text/html" href="https://wiki.sachsen.schule/dwiki/index.php?title=Benutzer:Kirmse/delixs-userpasswd&amp;diff=7320&amp;oldid=prev"/>
		<updated>2009-06-22T19:45:33Z</updated>

		<summary type="html">&lt;p&gt;Script zum Ändern der Passworte eines Users&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== delixs-userpasswd ==&lt;br /&gt;
&lt;br /&gt;
* dieses Script ändert das Linux- und Sambapasswortes von Usern. Aufruf ist nur als root möglich&lt;br /&gt;
&lt;br /&gt;
* Parameter: --help oder -h, --user oder -u, --pass oder -p &lt;br /&gt;
&lt;br /&gt;
* Aufruf: delixs-userpasswd -u mmustermann -p geheim&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Dieses Script ist eine Modifikation des Scripts &amp;#039;smbldap-passwd&amp;#039;. Es wurden die Parameter  des Originalscripts &amp;quot;stillgelegt&amp;quot; und &amp;quot;neue&amp;quot; Parameter in der Art der anderen Scripte für Delixs ergänzt. Zudem wurden Teil des Codes entfernt, der nur als &amp;quot;normaler&amp;quot; User ausgeführt wurde.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== das Script ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
&lt;br /&gt;
# untaint environment&lt;br /&gt;
$ENV{&amp;#039;PATH&amp;#039;}= &amp;#039;/bin:/usr/bin&amp;#039;;&lt;br /&gt;
$ENV{&amp;#039;SHELL&amp;#039;}= &amp;#039;/bin/sh&amp;#039;;&lt;br /&gt;
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use FindBin;&lt;br /&gt;
use FindBin qw($RealBin);&lt;br /&gt;
use lib &amp;quot;$RealBin/&amp;quot;;&lt;br /&gt;
use smbldap_tools;&lt;br /&gt;
&lt;br /&gt;
use Crypt::SmbHash;&lt;br /&gt;
use Digest::MD5 qw(md5);&lt;br /&gt;
use Digest::SHA1 qw(sha1);&lt;br /&gt;
use MIME::Base64 qw(encode_base64);&lt;br /&gt;
&lt;br /&gt;
# ergaenzt&lt;br /&gt;
use Getopt::Long;&lt;br /&gt;
&lt;br /&gt;
# function declaration&lt;br /&gt;
sub make_hash;&lt;br /&gt;
sub make_salt;&lt;br /&gt;
&lt;br /&gt;
#my $user= undef;    &lt;br /&gt;
my $oldpass= undef;&lt;br /&gt;
&lt;br /&gt;
my $arg;&lt;br /&gt;
my $update_samba_passwd= 1;&lt;br /&gt;
my $update_unix_passwd= 1;&lt;br /&gt;
my $force_update_samba_passwd=0;&lt;br /&gt;
&lt;br /&gt;
# die Original-Behandlung der Parameter wurde komplett entfernt und &lt;br /&gt;
# durch die delixs-typische Parameterabfrage ersetzt&lt;br /&gt;
 &lt;br /&gt;
# Initialisieren der Variablen fuer die Parameter&lt;br /&gt;
my $user     = &amp;#039;&amp;#039;;&lt;br /&gt;
my $password = &amp;#039;&amp;#039;;&lt;br /&gt;
my $pass;&lt;br /&gt;
&lt;br /&gt;
# wir holen uns zuerst die Parameter,&lt;br /&gt;
# falls --help, dann Ausgabe der Hilfe (siehe &amp;amp;help) und beenden&lt;br /&gt;
GetOptions(&amp;#039;user=s&amp;#039;   =&amp;gt; \$user,&lt;br /&gt;
           &amp;#039;pass=s&amp;#039;   =&amp;gt; \$password,&lt;br /&gt;
           &amp;#039;help&amp;#039;     =&amp;gt; \&amp;amp;help);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Wenn kein Parameter -u oder --user uebergeben wurde, dann Abbruch&lt;br /&gt;
if ($user eq &amp;#039;&amp;#039;) {&lt;br /&gt;
  die &amp;quot;Abbruch: es wurde der Parameter --user nicht uebergeben!\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Wenn der User nicht den/meinen Konventionen entspricht, dann Abbruch&lt;br /&gt;
unless ($user =~ /^[a-zA-Z]\w{1,13}$/) {&lt;br /&gt;
  die &amp;quot;Abbruch: Der Name fuer den User $user ist nicht korrekt!\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
# Wenn kein Parameter -p oder --pass uebergeben wurde, dann Abbruch&lt;br /&gt;
if ($password eq &amp;#039;&amp;#039;) {&lt;br /&gt;
  die &amp;quot;Abbruch: es wurde der Parameter --pass nicht uebergeben!\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
# -------------- jetzt wieder im Original weiter&lt;br /&gt;
&lt;br /&gt;
# check if $user variable is not tainted&lt;br /&gt;
# [TODO] create proper user mask&lt;br /&gt;
$user =~ /^([-\@\ \w.]+\$?)$/ and $user = $1 or&lt;br /&gt;
    die &amp;quot;$0: username &amp;#039;$user&amp;#039; is tainted\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
my ($dn,$ldap_master);&lt;br /&gt;
# First, connecting to the directory&lt;br /&gt;
if ($&amp;lt; == 0) {&lt;br /&gt;
    # root user&lt;br /&gt;
    $ldap_master=connect_ldap_master();&lt;br /&gt;
    # test existence of user in LDAP&lt;br /&gt;
    my $dn_line;&lt;br /&gt;
    if (!defined($dn_line = get_user_dn($user))) {&lt;br /&gt;
	print &amp;quot;$0: user $user doesn&amp;#039;t exist\n&amp;quot;;&lt;br /&gt;
	exit (10);&lt;br /&gt;
    }&lt;br /&gt;
    $dn = get_dn_from_line($dn_line);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my $samba = is_samba_user($user);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# prompt for new password&lt;br /&gt;
&lt;br /&gt;
my $pass1;&lt;br /&gt;
my $pass2;&lt;br /&gt;
&lt;br /&gt;
# um die Stuktur des Originals zu erhalten, sollte einfach die Variable des &lt;br /&gt;
# Parameter hier zugewiesen werden&lt;br /&gt;
&lt;br /&gt;
$pass1 = $password;&lt;br /&gt;
$pass2 = $pass1;&lt;br /&gt;
$pass  = $password;&lt;br /&gt;
&lt;br /&gt;
# hier wurden etliche Zeilen geloescht &lt;br /&gt;
&lt;br /&gt;
# Prepare &amp;#039;$hash_password&amp;#039; for &amp;#039;userPassword&amp;#039;&lt;br /&gt;
my $hash_password;&lt;br /&gt;
# Generate password hash&lt;br /&gt;
if ($config{with_slappasswd}) {&lt;br /&gt;
    # checking if password is tainted: nothing is changed!!!!&lt;br /&gt;
    # essential for perl 5.8&lt;br /&gt;
    ($pass =~ /^(.*)$/ and $pass=$1) or&lt;br /&gt;
	die &amp;quot;$0: user password is tainted\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    # use slappasswd to generate hash&lt;br /&gt;
    if ( $config{hash_encrypt} eq &amp;quot;CRYPT&amp;quot; &amp;amp;&amp;amp; defined($config{crypt_salt_format}) ) {&lt;br /&gt;
	open BUF, &amp;quot;-|&amp;quot; or&lt;br /&gt;
	    exec &amp;quot;$config{slappasswd}&amp;quot;,&lt;br /&gt;
	    &amp;quot;-h&amp;quot;,&amp;quot;{$config{hash_encrypt}}&amp;quot;,&lt;br /&gt;
	    &amp;quot;-c&amp;quot;,&amp;quot;$config{crypt_salt_format}&amp;quot;,&lt;br /&gt;
	    &amp;quot;-s&amp;quot;,&amp;quot;$pass&amp;quot;;&lt;br /&gt;
	$hash_password = &amp;lt;BUF&amp;gt;;&lt;br /&gt;
	close BUF;&lt;br /&gt;
    } else {&lt;br /&gt;
	open(BUF, &amp;quot;-|&amp;quot;) or&lt;br /&gt;
	    exec &amp;quot;$config{slappasswd}&amp;quot;,&lt;br /&gt;
	    &amp;quot;-h&amp;quot;,&amp;quot;{$config{hash_encrypt}}&amp;quot;,&lt;br /&gt;
	    &amp;quot;-s&amp;quot;,&amp;quot;$pass&amp;quot;;&lt;br /&gt;
	$hash_password = &amp;lt;BUF&amp;gt;;&lt;br /&gt;
	close BUF;&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    # use perl libraries to generate hash&lt;br /&gt;
    $hash_password = make_hash($pass,$config{hash_encrypt},$config{crypt_salt_format});&lt;br /&gt;
}&lt;br /&gt;
# check if a hash was generated, otherwise die&lt;br /&gt;
defined($hash_password) or&lt;br /&gt;
    die &amp;quot;I cannot generate the proper hash!\n&amp;quot;;&lt;br /&gt;
chomp($hash_password);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# only modify smb passwords if smb user&lt;br /&gt;
if ( $samba and $update_samba_passwd ) {&lt;br /&gt;
    if (!$config{with_smbpasswd}) {&lt;br /&gt;
	# generate LanManager and NT clear text passwords&lt;br /&gt;
	my ($sambaLMPassword,$sambaNTPassword) = ntlmgen $pass;&lt;br /&gt;
	# the sambaPwdLastSet must be updating&lt;br /&gt;
	my $date=time;&lt;br /&gt;
	my @mods;&lt;br /&gt;
	push(@mods, &amp;#039;sambaLMPassword&amp;#039; =&amp;gt; $sambaLMPassword);&lt;br /&gt;
	push(@mods, &amp;#039;sambaNTPassword&amp;#039; =&amp;gt; $sambaNTPassword);&lt;br /&gt;
	push(@mods, &amp;#039;sambaPwdLastSet&amp;#039; =&amp;gt; $date);&lt;br /&gt;
	if (defined $config{defaultMaxPasswordAge}) {&lt;br /&gt;
	    my $new_sambaPwdMustChange=$date+$config{defaultMaxPasswordAge}*24*60*60;&lt;br /&gt;
	    push(@mods, &amp;#039;sambaPwdMustChange&amp;#039; =&amp;gt; $new_sambaPwdMustChange);&lt;br /&gt;
	    if ($&amp;lt; ==0) {&lt;br /&gt;
		push(@mods, &amp;#039;sambaAcctFlags&amp;#039; =&amp;gt; &amp;#039;[U]&amp;#039;);&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
	if ($force_update_samba_passwd == 1) {&lt;br /&gt;
		    # To force a user to change his password:&lt;br /&gt;
		    # . the attribut sambaPwdLastSet must be != 0&lt;br /&gt;
		    # . the attribut sambaAcctFlags must not match the &amp;#039;X&amp;#039; flag&lt;br /&gt;
		    my $winmagic = 2147483647;&lt;br /&gt;
		    my $valacctflags = &amp;quot;[U]&amp;quot;;&lt;br /&gt;
		    push(@mods, &amp;#039;sambaPwdMustChange&amp;#039; =&amp;gt; 0);&lt;br /&gt;
		    push(@mods, &amp;#039;sambaPwdLastSet&amp;#039; =&amp;gt; $winmagic);&lt;br /&gt;
		    push(@mods, &amp;#039;sambaAcctFlags&amp;#039; =&amp;gt; $valacctflags);&lt;br /&gt;
		}&lt;br /&gt;
	# Let&amp;#039;s change nt/lm passwords&lt;br /&gt;
	my $modify = $ldap_master-&amp;gt;modify ( &amp;quot;$dn&amp;quot;,&lt;br /&gt;
					    &amp;#039;replace&amp;#039; =&amp;gt; { @mods }&lt;br /&gt;
					    );&lt;br /&gt;
	$modify-&amp;gt;code &amp;amp;&amp;amp; warn &amp;quot;Failed to modify SMB password: &amp;quot;, $modify-&amp;gt;error ;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
	if ($&amp;lt; != 0) {&lt;br /&gt;
	    my $FILE=&amp;quot;|$config{smbpasswd} -s &amp;gt;/dev/null&amp;quot;;&lt;br /&gt;
	    open (FILE, $FILE) || die &amp;quot;$!\n&amp;quot;;&lt;br /&gt;
	    print FILE &amp;lt;&amp;lt;EOF;&lt;br /&gt;
$oldpass&lt;br /&gt;
$pass&lt;br /&gt;
$pass&lt;br /&gt;
EOF&lt;br /&gt;
		;&lt;br /&gt;
	    close FILE;&lt;br /&gt;
	} else {&lt;br /&gt;
	    open FILE,&amp;quot;|-&amp;quot; or&lt;br /&gt;
		exec &amp;quot;$config{smbpasswd}&amp;quot;,&amp;quot;$user&amp;quot;,&amp;quot;-s&amp;quot;;&lt;br /&gt;
	    local $SIG{PIPE} = sub {die &amp;quot;buffer pipe terminated&amp;quot; };&lt;br /&gt;
	    print FILE &amp;lt;&amp;lt;EOF;&lt;br /&gt;
$pass&lt;br /&gt;
$pass&lt;br /&gt;
EOF&lt;br /&gt;
		;&lt;br /&gt;
	    close FILE;&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Update &amp;#039;userPassword&amp;#039; field&lt;br /&gt;
if ( $update_unix_passwd ) {&lt;br /&gt;
    my $shadowLastChange=int(time()/86400);&lt;br /&gt;
    my $modify;&lt;br /&gt;
    if ($&amp;lt; != 0) {&lt;br /&gt;
	$modify = $ldap_master-&amp;gt;modify ( &amp;quot;$dn&amp;quot;,&lt;br /&gt;
					    changes =&amp;gt; [&lt;br /&gt;
							replace =&amp;gt; [userPassword =&amp;gt; &amp;quot;$hash_password&amp;quot;],&lt;br /&gt;
							replace =&amp;gt; [shadowLastChange =&amp;gt; &amp;quot;$shadowLastChange&amp;quot;]&lt;br /&gt;
							]&lt;br /&gt;
					    );&lt;br /&gt;
    } else {&lt;br /&gt;
	$modify = $ldap_master-&amp;gt;modify ( &amp;quot;$dn&amp;quot;,&lt;br /&gt;
					    changes =&amp;gt; [&lt;br /&gt;
							replace =&amp;gt; [userPassword =&amp;gt; &amp;quot;$hash_password&amp;quot;],&lt;br /&gt;
							replace =&amp;gt; [shadowLastChange =&amp;gt; &amp;quot;$shadowLastChange&amp;quot;],&lt;br /&gt;
							replace =&amp;gt; [shadowMax =&amp;gt; &amp;quot;$config{defaultMaxPasswordAge}&amp;quot;]&lt;br /&gt;
							]&lt;br /&gt;
					    );&lt;br /&gt;
    }&lt;br /&gt;
    $modify-&amp;gt;code &amp;amp;&amp;amp; warn &amp;quot;Failed to modify UNIX password: &amp;quot;, $modify-&amp;gt;error ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# take down session&lt;br /&gt;
$ldap_master-&amp;gt;unbind;&lt;br /&gt;
&lt;br /&gt;
exit 0;&lt;br /&gt;
&lt;br /&gt;
################### Programm-Ende #####################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Generates hash to be one of the following RFC 2307 schemes:&lt;br /&gt;
# CRYPT,  MD5,  SMD5,  SHA, SSHA,  and  CLEARTEXT&lt;br /&gt;
# SSHA is default&lt;br /&gt;
# &amp;#039;%s&amp;#039; is a default crypt_salt_format&lt;br /&gt;
# A substitute for slappasswd tool&lt;br /&gt;
sub make_hash&lt;br /&gt;
{&lt;br /&gt;
    my $hash_encrypt;&lt;br /&gt;
    my $crypt_salt_format;&lt;br /&gt;
&lt;br /&gt;
    my $clear_pass=$_[0] or return undef;&lt;br /&gt;
    $hash_encrypt=&amp;#039;{&amp;#039; . $_[1] . &amp;#039;}&amp;#039; or $hash_encrypt = &amp;quot;{SSHA}&amp;quot;;&lt;br /&gt;
    $crypt_salt_format=$_[2] or $crypt_salt_format = &amp;#039;%s&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    my $hash_pass;&lt;br /&gt;
    if ($hash_encrypt eq &amp;quot;{CRYPT}&amp;quot; &amp;amp;&amp;amp; defined($crypt_salt_format)) {&lt;br /&gt;
	# Generate CRYPT hash&lt;br /&gt;
	# for unix md5crypt $crypt_salt_format = &amp;#039;$1$%.8s&amp;#039;&lt;br /&gt;
	my $salt = sprintf($crypt_salt_format,make_salt());&lt;br /&gt;
	$hash_pass = &amp;quot;{CRYPT}&amp;quot; . crypt($clear_pass,$salt);&lt;br /&gt;
&lt;br /&gt;
    } elsif ($hash_encrypt eq &amp;quot;{MD5}&amp;quot;) {&lt;br /&gt;
	# Generate MD5 hash&lt;br /&gt;
	$hash_pass = &amp;quot;{MD5}&amp;quot; . encode_base64( md5($clear_pass),&amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    } elsif ($hash_encrypt eq &amp;quot;{SMD5}&amp;quot;) {&lt;br /&gt;
	# Generate SMD5 hash (MD5 with salt)&lt;br /&gt;
	my $salt = make_salt(4);&lt;br /&gt;
	$hash_pass = &amp;quot;{SMD5}&amp;quot; . encode_base64( md5($clear_pass . $salt) . $salt,&amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    } elsif ($hash_encrypt eq &amp;quot;{SHA}&amp;quot;) {&lt;br /&gt;
	# Generate SHA1 hash&lt;br /&gt;
	$hash_pass = &amp;quot;{SHA}&amp;quot; . encode_base64( sha1($clear_pass),&amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    } elsif ($hash_encrypt eq &amp;quot;{SSHA}&amp;quot;) {&lt;br /&gt;
	# Generate SSHA hash (SHA1 with salt)&lt;br /&gt;
	my $salt = make_salt(4);&lt;br /&gt;
	$hash_pass = &amp;quot;{SSHA}&amp;quot; . encode_base64( sha1($clear_pass . $salt) . $salt,&amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    } elsif ($hash_encrypt eq &amp;quot;{CLEARTEXT}&amp;quot;) {&lt;br /&gt;
	$hash_pass=$clear_pass;&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
	$hash_pass=undef;&lt;br /&gt;
    }&lt;br /&gt;
    return $hash_pass;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Generates salt&lt;br /&gt;
# Similar to Crypt::Salt module from CPAN&lt;br /&gt;
sub make_salt&lt;br /&gt;
{&lt;br /&gt;
    my $length=32;&lt;br /&gt;
    $length = $_[0] if exists($_[0]);&lt;br /&gt;
    &lt;br /&gt;
    my @tab = (&amp;#039;.&amp;#039;, &amp;#039;/&amp;#039;, 0..9, &amp;#039;A&amp;#039;..&amp;#039;Z&amp;#039;, &amp;#039;a&amp;#039;..&amp;#039;z&amp;#039;);&lt;br /&gt;
    return join &amp;quot;&amp;quot;,@tab[map {rand 64} (1..$length)];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# - The End&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden&lt;br /&gt;
sub help&lt;br /&gt;
{&lt;br /&gt;
   print &amp;quot;Hilfe muss noch erstellt werden.\n&amp;quot;;&lt;br /&gt;
   exit (0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kirmse</name></author>
	</entry>
</feed>