Eine Ära geht zu Ende …

… nein keine Angst, ich höre nicht auf mit dem Bloggen! Die Ära bezieht sich auf meine 4 Jährige Lehre, die ich ich wenigen Tagen abschliessen werde!
Und als ich mich so durch meine Ordnerstrukturen geklickt habe, wurde mir klar, dass sich in den 4 Jahren sehr viele kleine, aber auch wichtige und interessante Scripts, Kommandos und ähnliches angesammelt hat. Und da ich denke, es könnte dem einen oder anderen vielleicht mal helfen, möchte ich euch das nicht vorenthalten.

Beginnen wir mit einem einfachen VBS-Script um ein Netzlaufwerk zu verbinden unter Windows. Ich weiss die gibts wie Sand am Meer, aber meines ist besser 😉

'Author: 	Patrick schmid
'Datum:	23.9.2008
'Version:	1.0.0

Option Explicit

'Variablen einlesen
Dim objNetwork, objFSO
Dim strPath, strDrive, bolPer, strUsr, strPas

'Neue Systemojekte kreieren
Set objNetwork = CreateObject("WScript.Network")
Set objFSO = CreateObject("Scripting.FileSystemObject")

'Relevante Daten definieren
strPath = "\\PFAD\ZUM\SERVER'
strDrive = "W:"
bolPer = False
strUsr = "USER"
strPas = "PASSWORD"

'Prüfen ob Drive schon vorhanden
If NOT objFSO.DriveExists (strDrive) Then
	'drive mappen	
	objNetwork.MapNetworkDrive strDrive, strPath , bolPer, strUsr, strPas
End If

Oder noch ein VBS-Script, um zwei DNS-Einträge zu setzen:

'-----------------------------------------------------------------------------------------------
'Author:		Patrick Schmid
'Date:			14.12.2009
'Version:		1.0
'-----------------------------------------------------------------------------------------------
Option Explicit

'reserve variabels
Dim objWMIService, colNetCards, arrDNSServers, objNetCard, strprimary, strsecondary

'set dns ips for primary and secondary
strprimary = "192.168.1.18"
strsecondary = "192.168.1.19"

'set array with primary and secondary dns server
arrDNSServers = Array(strprimary, strsecondary)

'get system environment
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

'get all Network interfaces
Set colNetCards = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")

'read each network interface in variable
For Each objNetCard in colNetCards
	'set dns arry to network interface
	objNetCard.SetDNSServerSearchOrder(arrDNSServers)
Next

Nun weg von der dunklen Seite – auf zu Linux, da hab ich entsprechend mehr Material 🙂

Los geht es mit einem Perl-Script, welches alle Benutzer aus dem LDAP ausliesst, die abgelaufen sind und diese via eMail informiert:

#!/usr/bin/perl -w
use IPC::Open3;
use Net::LDAP;

$date = setExpire();
my $LDAPHOST = "";
my $LDAPROOT  = "";
my $LDAPUPASS = "";

my $ldap = Net::LDAP->new($LDAPHOST) or die "Can't bind to ldap:\n $!\n $@";
$ldap->bind;
my $pid = open3(\*IN,\*OUT,0,'/bin/bash');
my $cmd = 'lsuser -a expires ALL > tmpusers';
print IN "$cmd\n";
open(USERS, "tmpusers") || die("tmpusers is not accessable!");
@raw_data = <USERS>;
close(USERS);
foreach $user (@raw_data)
{
	@splited = split(/=/, $user);
	@splited2 = split(/ /, $splited[0]);
	$username = $splited2[0];
	if (not($splited[1] == "0"))
	{
		$exyear = (substr($splited[1],8,2));
		$exmonth = (substr($splited[1],0,2));
		$exday = (substr($splited[1],2,2));
		$expired = "$exyear$exmonth$exday";
		if ($date > $expired) {
			my $pid = open3(\*IN,\*OUT,1,'/bin/bash');
			my $cmd = 'lsuser -a gecos '.$username;
			print IN "$cmd\n";
			my $result = <OUT>;
			if ((index($result,"gecos")) > 0)
			{
				@raw_info = split(/=/, $result);
				if ((index($raw_info[1],"_")) > 0)
				{
					@raw_name = split(/_/, $raw_info[1]);
					$fullname = $raw_name[0]." ".$raw_name[1];
				} else {
					$fullname = $raw_info[1];
				}
				my ($mesg) = $ldap->search(
					base   => "ou=People,$LDAPROOT",
					filter => "(uid=$username)",
					attrs => ['uid', 'mail']
				);
				$mesg->code && die $mesg->error;
				foreach my $entry ( $mesg->entries ) {
					my ($useremail) = $entry->get_value('mail');
					my $pid = open3(\*IN,\*OUT,1,'/bin/bash');
					my $cmd = '/usr/lib/sendmail -t
						To: '.$useremail.'
						Subject: Account has expired
						Dear '.$fullname.'
						Your account '.$username.' has expired!';
					print IN "$cmd\n";
				}
			}
		}
	}
}

$ldap->unbind;

sub setExpire {
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	$year += 1900;
	$mon += 1;
	$year = sprintf("%02d", $year % 100);
	$mon = sprintf("%02d", $mon % 100);
	$mday = sprintf("%02d", $mday% 100);
	return "$year$mon$mday";
}

Oder ein Bash-Script, um einen Drucker hinzuzufügen:

#!/bin/bash
echo "What's the printer's name?"
read printer
echo "What's the queue's name (Default: $printer)?"
read queue

echo "<Printer $printer>" >> /etc/cups/printers.conf
echo "Info $printer" >> /etc/cups/printers.conf
echo "DeviceURI lpd://$printer/$queue" >> /etc/cups/printers.conf
echo "State Idle" >> /etc/cups/printers.conf
echo "Accepting Yes" >> /etc/cups/printers.conf
echo "JobSheets none none" >> /etc/cups/printers.conf
echo "QuotaPeriod 0" >> /etc/cups/printers.conf
echo "PageLimit 0" >> /etc/cups/printers.conf
echo "KLimit 0" >> /etc/cups/printers.conf
echo "</Printer>" >> /etc/cups/printers.conf

echo "restarting cups"
/etc/init.d/cups restart

Wie wäre es mit einem kleinen Script, dass den freien Festplattenspeicher mit ASCII grafisch aufbereitet:

#!/bin/bash
df -h $1 | tr -s ' ' '\t' | cut -f2,3,5,6 | grep '^[^/].*$' | grep '^.*/.*$' | while read all use pct fs
	#get the percent without the % and wirte it to fil
	do echo $pct $fs | cut -d% -f1 | while read fil
		#write as that much # as the number of fil is
		do for (( i=0 ; $i<$fil; i=$i+1 ))
			#write everything to out
			do out="$out#"
		done
		
		#calculate the rest
		rest=$((100-fil))
		for (( i=0 ; $i<$rest; i=$i+1 ))
			#add everything to out too
			do out="$out-"
		done

		#get the size of the mountpoint
		size=$(echo $fs | wc -m)
		#calculate the needed rest
		size=$((15-$size))
		
		#add the number of spaces
		for (( i=0 ; $i<$size; i=$i+1 ))
			do space="$space "
		done

		#print the mountpoint, space buffer and out (its fil)
		echo -e "$fs $space $out $pct ($use/$all)"
	done
done

Oder aber ein Script (benötigt expect) das via iLO eine Maschine neustartet:

#!/usr/bin/expect
# Version 1.0
# by Patrick Schmid

spawn ssh root@[lindex $argv 0]
expect "Password:" {send "PASSWORD\r"}
expect "> " {send "reset /SYS -script\r"}
expect {
	"Performing" {puts stdout "\nDone"}
  default {puts stdout "\nError"}
}

So jetzt mal weg von den Scripts, einfach ein paar Befehle für die Konsole. So zum Hinzufügen einer Maschine zu einer NIS-Domäne:

ypset -d DOMÄNE SERVER
/etc/init.d/ypbind restart
chkconfig --level 345 ypbind on

Oder eine Checkliste zum Zurücksetzen eines vergessenen Passwortes unter RedHat:

  • Insert de Rescue Disk
  • Befor loading the system press F2 to enter the start up menu
  • Select Disk and wait until it is loaded
  • Press F5 to enter rescue mode
  • enter „linux rescue“ and confirm with Enter
  • Wait until a shell promt comes up
  • Type „chroot /mnt/syslinux“ and confirm with enter
  • mount -o remount,rw /
  • Open the shadow file by entering „vi /etc/shadow“
  • Delete the value between the first two :
  • Type :wq to save and quit
  • Type shutdown -h now and remove the CD
  • Password is reseted now

Auch die Quota lässt sich ganz einfach anzeigen und anpassen:

zfs get quota store/home/USERNAME
zfs set quota=10G store/home/USERNAME

Oder aber viel Nützliches im Umgang mit SUN / Solaris. So zum Beispiel zum Ausführen eines Filesystemchecks:

fsck -v ufs /dev/dsk/c0t0d0sX

Oder zum sauberen Neustarten eines Maschine:

sync:sync:reboot

Oder wenn man auf der Konsole mit BACKSPACE nichts mehr löschen kann, so hilft:

stty erase [BACKSPACE]

Auch wenn man alle Partitionen sehen will, wird geholfen:

echo|format

Oder wer von der Konsole aus neustarten will:

boot -s (Single User)
boot net -s (ab Netzwerk starten)
boot net - install (ab Netzwerk installieren)
boot cdrom -s (von CD starten)

Auch wer unter Solaris sein Passwort vergisst, muss nicht verzweifeln:

  • boot cdrom -s –> Ab CD starten
  • echo|format –> Die Partitionen ausgeben
  • mkdir /tmp/d –> Ordner zum mounten erstellen
  • mount /dev/dsk/c0t0d0s0 /tmp/t –> Partition mounten
  • vim /etc/shadow –> Passwortfile öffnen, Passwort für root löschen
  • sync;sync;reboot –> Reboot
  • fsck /dev/dsk/c0t0d0s0 –> file system check
  • fsck -y /dev/dsk/c0t0d0s0 –> confirm file system check

So das war es dann in etwa auch schon wieder. Und ja ich weiss, die Scripts sind teils schrecklich umständlich, aber sie führten zum Ziel 😀

5 Kommentare bei „Eine Ära geht zu Ende …

  1. Mag mich noch dunkel an ein Script erinnern, das Du mal für Dome schreiben musstes für irgendwelche Excel Statistiken etc. 😀

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.