Benutzerliste aus LDAP/ActiveDirectory erstellen

Mittels python lassen sich Benutzer aus einem LDAP-Verzeichnis (bzw. ActiveDirectory) einfach auslesen und formatiert ausgeben:

#!/usr/bin/python
 
# import ldap module
import sys, ldap
 
# Define the name to search
searchstring="*"
 
# connection settings
ldap_url = "ldap://localhost"
binddn = "CN=LDAP User,OU=User Accounts,DC=example,DC=org"
pw = "secret"
 
# Search settings
basedn = "OU=User Accounts,DC=ad,DC=example,DC=net"
searchFilter = "(&(cn={searchstring}))".format (searchstring=searchstring)
searchAttribute = ['cn', 'sAMAccountName', 'displayName', 'mail']
searchScope = ldap.SCOPE_SUBTREE
 
# bind to the server
l = ldap.initialize(ldap_url)
try:
  l.simple_bind_s(binddn, pw)
except ldap.INVALID_CREDENTIALS:
  print "Your username or password is incorrect."
  sys.exit(0)
except ldap.LDAPError, e:
  if type(e.message) == dict and e.message.has_key('desc'):
    print e.message['desc']
  else:
    print e
  sys.exit(0)
 
# query LDAP
try:
  resultId = l.search(basedn, searchScope, searchFilter, searchAttribute)
  result_type, result_data = l.result(resultId)
 
  for ldap_dn,ldapuser in result_data:
    print ldap_dn
    #print ('username={ldap_sAMAccountName},)
    print ('username={ldap_sAMAccountName}\ndisplayName={ldap_displayName}\nmail={ldap_mail}\n\n').format (ldap_sAMAccountName = ldapuser['sAMAccountName'][0], ldap_displayName = ldapuser['displayName'][0], ldap_mail = ldapuser['mail'][0],)
 
except ldap.LDAPError, e:
  print e
 
# close connection
l.unbind_s()

Die Parameter unter „connection settings“ sind:

searchstring Der Name nach dem gesucht wird
ldap_url Die Adresse vom LDAP-Server
binddn Die DN vom Benutzer, welcher sich am LDAP-Server anmeldet (i.dR. ein „read-only“ user)
pw Passwort für den oben genannten Benutzer
basedn Fange ab hier mit der Suche an; das kann der root Pfad sein, besser ist es aber aber einen Pfad mit den aktiven Accounts einzuschränken, damit deaktivierte Benutzer nicht drin sind
searchFilter Das LDAP-Suchmuster; anstelle von „givenName“ kann beispielsweise auch „cn“ oder „displayName“ sein
searchScope Hier wird definiert ob nur im aktuellen LDAP-Zweig oder rekursiv gesucht wird

 

ConnectionString auflösen

Parameter zum Zugriff auf eine Datenbank werden häufig in sog. „URL Connection-Strings“ angegeben, z.B.:
mysql://username:password@localhost/databasename

Diese kann man ganz einfach mit der Funktion parse_url auflösen; beim Datenbank-Namen muss der beginnende ‚/‘ noch mit basename entfernt werden:

$db_url = 'mysql://username:password@localhost/databasename';
$DBConnectionString = parse_url($db_url);
 
$dbUser = $DBConnectionString['user'];
$dbPass = $DBConnectionString['pass'];
$dbHost = $DBConnectionString['host'];
$dbName = basename($DBConnectionString['path']);

Quelle: Gneu.org PHP SQL Connection Strings

WordPress-API einbinden

Falls man auf seine wordpress Installation von einer unabhängigen Seite (d.h. ein "leeres" PHP-Script) zugreifen möchte, kann man wie folgt die wordpress API einbinden:

API Einbinden

<?php
/<em> include wordpress API </em>/
define('WP_USE_THEMES', false);
require('./wp-blog-header.php');
?>

Nun stehen einem im Script alle [http://codex.wordpress.org/Function_Reference/|Funktionen von wordpress] zur Verfügung!

Hier zwei Beispiele, wie man damit die letzten drei posts abruft und wie man selbst einen neuen post erstellt:

Die letzten 3 Posts abrufen:

<?php
global $post;
$args = array( 'posts_per_page' => 3 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) :	setup_postdata($post); ?>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a><br />
<?php endforeach; ?>

Einen neuen Post erstellen (sehr nützlich bei Migrationen von einem anderen CMS)

/**
<ul>
 * A function used to programmatically create a post in WordPress. The slug, author ID, and title
 * are defined within the context of the function.
 *
 * @returns -1 if the post was never created, -2 if a post with the same title exists, or the ID
 *          of the post if successful.
 */
</ul>
function programmatically_create_post() {
 
	// Initialize the page ID to -1. This indicates no action has been taken.
	$post_id = -1;
 
	// Setup the author, slug, and title for the post
	$author_id = 1;
	$slug = 'example-post';
	$title = 'My Example Post';
 
	// If the page doesn't already exist, then create it
	if( null == get_page_by_title( $title ) ) {
 
		// Set the post ID so that we know the post was created successfully
		$post_id = wp_insert_post(
			array(
				'comment_status'	=>	'closed',
				'ping_status'		=>	'closed',
				'post_author'		=>	$author_id,
				'post_name'		=>	$slug,
				'post_title'		=>	$title,
				'post_status'		=>	'publish',
				'post_type'		=>	'post'
			)
		);
 
	// Otherwise, we'll stop
	} else {
 
    		// Arbitrarily use -2 to indicate that the page with the title already exists
    		$post_id = -2;
 
	} // end if
 
} // end programmatically_create_post
add_filter( 'after_setup_theme', 'programmatically_create_post' );
 
 
$post_id = programmatically_create_post()
if( -1 == $post_id || -2 == $post_id ) {
   // The post wasn't created or the page already exists
} // end if

Quellen

Mehrere Zeilen in Datei „grep’en“

Manachmal möchte man in eienr Datei nicht nur nach einer Zeile "grep’en", sondern nach mehreren.

Dies geht einfach mit awk:

awk '/abc/,/xyz/' datei

Weitere Bespiele finden sich auf: [http://stackoverflow.com/questions/2686147/how-to-find-patterns-across-multiple-lines-using-grep|How to find patterns across multiple lines using grep?]

Output loopen

Möchte man in einem shell script mit einer Ausgabe irgendwas machen, geht das ganz leicht mittels:

for line in `ls`; do echo "this is line: $line"; done

In diesem Beipsiel wird jede Zeile von "ls" wieder ausgegeben.
Selbiges könnte man zum Beispiel cat mit dem Inhalt einer Datei machen:

for line in `cat datei.txt`; do echo "this is line: $line"; done

Man kann auch ein kommando ausführen und dies erst in eien Variable schreiben.
Das folgende Beispiel findet alle ausführbaren .conf Dateien im Verzeichis /etc/myapp/ und führt diese mit dem entpsrechenden Benutzer der die Datei besitzt aus:

init_files=`find /etc/myapp/<em> -maxdepth 1 -type f -name </em>.conf -perm -u+rx`
for init_files in $init_files
  do
    script_owner=`stat -c '%U' $init_script`
    echo -e "nStarting script for user: $script_owner"
    sudo -u $script_owner -i $init_script $1;
    RETVAL=$(($RETVAL+$?))
  done