Laufwerks-Buchstaben abhängig vom Disklabel zuweisen

Möchte man nach einer Neuinstallation die Laufwerksbuchstaben automatisch anpassen, kann man dies anhand des Labels (= Laufwerks-Name) tun.

Folgender Ausschnitt weisst der Festplatte mit dem Namen BACKUP den Buchstaben "L:" zu.

<B>Hinweis:</B> Das Beispiel benötigt "diskpart", dass aber bei Windows XP standardmässig schon dabei ist.

Weitere Infos dazu gibts unter: http://groups.msn.com/windowsscript/powershell.msnw?action=get_message&mview=0&ID_Message=15313&LastModified=4675570881377551875&all_topics=1

' Objekte die wir brauchen (FSO und WSHShell) erstellen
Set fs = createobject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
 
 
' Textdatei für diskpart erstellen
fn = fs.Getspecialfolder(2) & "hd_rename.txt"
Set renFile = fs.Opentextfile(fn, 2, True)
 
 
' Nun alle Festplatten-Laufwerke (Drivetype 2) durchgehen und wenn das Label
' gefunden wurde dieses zum umbenennen in die Textdatei schreiben.
' HINWEIS: Beim Select Case kann man natürlich so viele Cases machen wie man
'                 benötigt, einfach das "BACKUP"-Beispiel kopieren
For each myDrive in Drives
  If myDrive.Drivetype = 2 Then
    Select Case myDrive.VolumeName
      Case "BACKUP"
        renFile.Writeline "Select Volume " & myDrive.DriveLetter
        renFile.Writeline "Assign Letter=L"
 
      'Case Else
      '  msgBox myDrive.VolumeName
    End select
  end if
Next
 
 
' Textdatei schliessen
renFile.Close
 
 
' Diskpart laufen lassen und dabei die umbenennungs Textdatei mitgeben
myCMD = "Diskpart.exe /s " & fn
result = wshShell.Run(myCMD ,,true)
 
 
' Textdatei löschen und Objekte aus dem Speicher entfernen
If fs.FileExists(fn) Then
  fs.DeleteFile(fn)
End if
set fs = nothing
set wshShell = nothing

Backup aller mySQL Datenbanken

Ein komplettes Backup aller mysql-datenbanken lässt sich mit dem Befehl:

mysqldump -A -a -C -c -e --user=root --password=****** > dump.sql

durchführen.

Die Optionen bedeuten hier:

Kurze OptionLange OptionBedeutung
-A–all-databasesAlle Datenbanken sichern
-a–create-optionsErstellungseigenschaften der Tabelle einfügen
-C–compressDen Datenverkehr zwischen mysql Server und Client komprimieren
-c--complete-insertDie Spaltennamen in der Datei ausschreiben, also z.B.

 

INSERT INTO `table` VALUES
(1, 'Zeile1'),
(2, 'Zeile2'),
(3, 'Zeile3');
-e--extended-insertMehrere Reihen in eine Abfrage kombinieren
 
--skip-extended-insert

Da die Option --extended-insert seit längerem Standard ist, kann man mittels --skip-extended-insert
diese Option ausschalten und bekommt ein INSERT Statement pro Zeile, z.B.

INSERT INTO `table` VALUES (1, 'Zeile1');
INSERT INTO `table` VALUES (1, 'Zeile2');
INSERT INTO `table` VALUES (1, 'Zeile3');
(da diese Art sehr langsam ist, wird sie nur für kleine Tabellen oder zu Analysezwecken so empfohlen)

Hier noch eine Erklärung des Unterschieds zischen –complete-insert und –extended-insert.

[stextbox id=“tip“ caption=“Tipp“]
Will man das Passwort nicht unbedingt an der Konsole im Klartext eingeben, kann man mit der Zeile:

mysqldump -A -a -C -c -e --user=root --password &gt; dump.sql

auch erreichen, dass ein Abfrage-Dialog erscheint und man das Passwort ohne Anzeige eingeben kann. (Dies funktioniert natürlich NICHT in automatischen Scripts… :D)
[/stextbox]

Dies ist für automatische Sicherungen aller Datenbanken praktisch.

Eine einzelne Datenbank kann man aber auch einfach wie folgt sichern (z.B. als „Quick Backup“ vor einem Applikations-Update):

mysqldump -u BENUTZER -p DB_NAME > db.sql

Wieder eingespielt wird das Backup mit dem Befehl:

mysql < backup-file.sql

Will man hingegen nur eine bestimmte Datenbank wieder einlesen, geschieht dies mit dem Befehl:

mysql DB_NAME < backup-file.sql

Evtl. muss man natürlich auch beim Einspielen den Benutzernamen und Passwort eingeben:

mysql --user=root --password < backup-file.sql

Dateien inluden

Um in Shellscripts Dateien, z.B. mit Variablen einbinden zu können, muss die includierte Datei auch ein Shellscript, d.h. ausführbar sein!

Sobald man mal etwas komplexere Unix/Linux Shellscripts schreibt, sucht man nach einer Möglichkeit Dateien zu "inkludieren".
 
Dies ist mit dem Konstrukt:
. /pfad/zu/script_mit_variablen.sh
ganz einfach möglich.
 
 
Bei vielen Programmen (apache z.B.) ist es zudem auch möglich ganze Verzeichnisse (bzw. alle Dateien darin) zu inkludieren.
 
So kann man z.B. in der apache httpd conf mittels:
 
include /verzeichnis/configs/*.conf
 
alle Dateien im Verzeichnis "/verzeichnis/configs/" einbinden. die die Endung.conf haben. Die Angabe von:
 
include /verzeichnis/configs/*
 
würde dann entsprechend alle Dateien in diesem Verzeichnis einbinden.
 
Besonders gut macht sich dies um die Konfiguration in viele kleine Dateien aufzusplitten, z.B. in Apache für jeden VirtualHost eine eigene Datei:
 
include /etc/apache/vhosts/*.vhost

Passwort im shell script ändern

Manchmal möchte man in einem shell script das passwort ändern- bzw. setzen; von einem direkten editieren von /etc/shadow sollte jedoch abgesehen werden und auch sollte das passwort nicht unverschlüsselt im script stehen.

Zum Glück gibts da das Programm chpasswd, mit dem man im script passwörter ändern/setzen kann. 😉

chpasswd --encrypted <<EOF
root:$ROOTPW
EOF

Kommentarzeilen Entfernen

Als ich wieder mal eine Übersicht meiner Konfigurationsdateien brauchte, suchte ich nach einer Lösung die Kommentarzeilen von Files zu entfernen.

Auch wenn man seine Konfiguration hilfesuchend an eine Mailingliste oder ein Forum senden möchte, stören die Kommentare mehr als dass sie nützen.

Dies muss man lediglich in einer Datei namens confcat speichern, die im $PATH ist (z.B. ~/bin oder /usr/local/bin) und diese Datei dann mit: <I>chmod 755 /pfad/zu/confcat</I> ausführbar machen.

Quelle: http://de.gentoo-wiki.com/Kommentare_entfernen
Original-Thread im Gentoo-Forum: http://forums.gentoo.org/viewtopic.php?t=160179

#!/bin/bash
# Code to cat a config file removing all comments and blank lines.
 
grep -vh '^#' "$@" | grep -v '^$'

Grafische echo-funktionen

Wie vielleicht schon aufgefallen ist, erscheinen bei booten vieler Linux-Distributionen die Bootmeldungen im Format:
<FONT FACE="courier new">Starting ServiceXY… <FONT COLOR="green"><B>[DONE]</B></FONT></FONT>

Solche Meldungen kann man mit nachfolgender Funktion ganz einfach in seine eigenen Shellscripts einfügen:

Einfach diese Funktionen oben im Script einfügen und danach Meldungen schreiben wie:

echo -n $"Starting XYZ..."
 # Startroutinen
 echo_ok
 echo_warning
 echo_done
RES_COL=60
MOVE_TO_COL="echo -en 33[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en 33[1;32m"
SETCOLOR_FAILURE="echo -en 33[1;31m"
SETCOLOR_WARNING="echo -en 33[1;33m"
SETCOLOR_NORMAL="echo -en 33[0;39m"
 
#Functions
function echo_done()
{
  $MOVE_TO_COL
  echo -n "[ "
  $SETCOLOR_SUCCESS
  echo -n "DONE"
  $SETCOLOR_NORMAL
  echo " ]"
  return 0
}
 
function echo_ok()
{
  $MOVE_TO_COL
  echo -n "[  "
  $SETCOLOR_SUCCESS
  echo -n "OK"
  $SETCOLOR_NORMAL
  echo "  ]"
  return 0
}
 
function echo_warning()
{
  $SETCOLOR_WARNING
  echo -n "WARNING: "
  $SETCOLOR_NORMAL
  return 0
}

Dialoge automatisiert Beantworten

Beim shellscripten steht man oft vor dem Problem, dass man ein Programm "steuern" muss.
Unter Unix/Linux Shellscript kann man dies ganz einfach erreichen, wenn man ein ‚<<EOT‘ vor den Programmaufruf setzt. Danach kann normal die Eingaben angeben, ein erneutes ‚EOT‘ schliesst den Vorgang ab und schaltet wieder zur normalen Scriptsteuerung.

Unten ist ein Beispiel zur Steuerung des FTP clients angegeben.

#!/bin/bash
# ftp-put.sh output_file host directory remote_file local_file user pass
ftp -n $2 > $1 2> $1 <<EOC
user $6 $7
binary
cd $3
put $5 $4
bye
EOC

Ein anderes Beispiel:
Das Shellscript ruft das Script ‚test.sh‘ auf; dieses fragt nach einem Parameter, den wir übergeben:

#!/bin/bash
./test.sh <<EOC
parameterUebergabe
EOC

NET SEND Meldung an alle SAMBA-Domain Benutzer

Mittels diesem Code wird eine NET SEND Meldung an alle SAMBA Domänenbenutzer gesendet, ähnlich dem "NET SEND * msg" unter Windows.

Dabei wird das /etc/samba/smbpasswd file ausgelesen und eine Nachricht an alle Maschinenaccounts gesendet.

for i in $(cut -d: -f1 /etc/samba/smbpasswd | grep "$" | cut -d$ -f1)
do
  echo "Test an alle SAMBA Users | smbclient -M $i
done

ICQ Status anzeigen

Die folgende Funktion zeigt an ob eine ICQ Benutzer online/offline ist.

Testen kann man dies mit: <? echo is_online("123456789"); ?>

 function is_online($uin) {
  if (!is_numeric($uin)) return FALSE;
 
  $fp = fsockopen('status.icq.com', 80, &$errno, &$errstr, 8);
  if (!$fp) return FALSE;
  $request = "GET /online.gif?icq=".$uin."&img=5 HTTP/1.0rn"
              ."Host: status.icq.comrn"
      ."Connection: closernrn";
    fputs($fp, $request);
 
    do {
      $response = fgets($fp, 1024);
#      echo $response,'<br />';
    } while (!feof($fp) && !stristr($response, 'Location'));
 
    fclose($fp);
 
    if (strstr($response, 'online1.gif')) return 'online';
    if (strstr($response, 'online0.gif')) return 'offline';
    if (strstr($response, 'online2.gif')) return 'disabled';
    return FALSE;
}

Webseiten Status überprüfen

Diese funktion prüft den Staus einer Webseite, bzw. ob diese überhaupt existiert und liefert den HTTP-Fehlercode (oder DNS Error) zurück.

Gut geeignet um in seinen Scripts (z.B. bei Gästebüchern) die Links zu überprüfen.

Zum testen ruft man die Funktion wie folgt auf:

<?
$test = url_validate("<a href="http://www.tech-island.com/");" target="blank">http://www.tech-island.com/");</a>
echo "test=[$test]";
?>
/*
<ul>
<li> @return status code or HTTP request</li>
<li> @param  string $link</li>
<li> @desc   Überprüft die angegeben URL auf Erreichbarkeit und</li>
<li>         liefert den HTTP Code oder DNS-Error zurück</li>
<li>/</li>
</ul>
function url_validate($link)
{
  // Parse URL and set default values if neccesary
  $url_parts = parse_url( $link );
  if (empty($url_parts["host"]))
    return(false);
  if (!empty($url_parts["path"]))
    $documentpath = $url_parts["path"];
  else
    $documentpath = "/";
  if (!empty( $url_parts["query"]))
   $documentpath .= "?" . $url_parts["query"];
 
  // Get Host and Port from URL, Port 80 default
  $host = $url_parts["host"];
  $port = $url_parts["port"];
 
  if (empty($port))
    $port = "80";
 
  // Now (HTTP-)GET $documentpath at $host";
  $socket = fsockopen( $host, $port, $errno, $errstr, 30 );
  if (!$socket)
  {
    // If socket can't bew connected there's a DNS-Error
    $status = "dns-error";
  }
  else
  {
    // Get Status Code
    fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0rnHost: $hostrnrn");
    $http_response = fgets($socket, 30);
 
    if (ereg("200 OK", $http_response, $regs ))
      $status = "200";
    elseif (ereg("404", $http_response, $regs ))
      $status = "404";
    elseif (ereg("30", $http_response, $regs))
      $status = "30*";
    else
      $status = $http_response;
 
    fclose($socket);
  }
  return ($status);
}