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);
}

Verzeichnis Rekursiv löschen

Die folgende funktion löscht ein Verzeichnis samt aller Unterverzeichnisse.
Vorsicht bei der Anwendung!

// Funtion for deleting a directory recursively
function rmdirRec($file)
{
  if (file_exists($file))
  {
    chmod($file,0777);
    if (is_dir($file))
    {
      $handle = opendir($file);
      while($filename = readdir($handle))
      {
        if ($filename != "." && $filename != "..")
        {
          rmdirRec($file."/".$filename);
        }
      }
      closedir($handle);
      rmdir($file);
    }
    else
    {
      unlink($file);
    }
  }
}

NestedSet Reparieren

Dieser Code repariert ein kaputtes NestedSet anhand der Parent ID

<?
// DB Connection
@mysql_connect($dbHost, $dbUser, $dbPass)
  or die("Abbruch: Verbindung zu '$dbHost' konnte nicht hergestellt werden.");
@mysql_select_db($dbName)
  or die("Abbruch: Datenbank '$dbName konnte nicht selektiert werden.<br><br>MySQL sagt: ".mysql_error());
 
function repairNestedSet($parent)
{
  global $counter;
 
  $sql = "SELECT PID FROM tblPage WHERE PParentID = $parent";
  $data = mysql_query($sql) or die ("<B>mySQL error:</B> " . mysql_error() . "<BR><BR><B>SQL-Query:</B> [$sql]");
 
  while (list($child) = mysql_fetch_row($data))
  {
    $counter++;
    mysql_query("UPDATE tblPage SET PLeft = $counter WHERE PID = $child");
    repairNestedSet($child);
    $counter++;
    mysql_query("UPDATE tblPage SET PRight = $counter WHERE PID = $child");
   }
}
repairNestedSet(0);
mysql_close();
?>

Bildinformationen aus einem JPEG auslesen (EXIF-Daten)

Mittels dieses Codes kann man ganz einfach die exif-header eines JPGs auslesen, beispielsweise, Kameratype, Winkel, etc.

<?
$exif = read_exif_data ('DSC00879.JPG');
while(list($k,$v)=each($exif))
{
  echo "$k: $v<br>n";
}
?>

Copyright in Grafik einfügen

Dieser Code fügt eine kleine Grafik an den unteren rand eines Bildes ein.

PS: Wenn du dieses Beispiel 1:1 ausprobieren willst:
upload.jpg ist die Originalgrafik und adresse.jpg die Copyright-Grafik

<?
$img_origImage = ImageCreateFromJPEG("upload.jpg");            // Holt sich die Bild-Datei in die Variable
$img_copyright = ImageCreateFromJPEG("adresse.jpg");           // Holt sich die Wasserzeichen-Datei in die Variable
 
// Optional, macht die Wasserzeichen Grafik Transparent
// ImageColorTransparent($img_copyright, TransparenteFarbe);   // Transparente Farbe kann auch durch
                                                               // ImageColor ($img_copyright, XPos, YPos) bestimmt werden...
ImageCopyMerge
(
  $img_origImage, $img_copyright,
  ImageSX($img_origImage) - ImageSX($img_copyright),           // Legt die X-Position für die rechte untere Ecke fest
  ImageSY($img_origImage) - ImageSY($img_copyright),           // Legt die Y-Position für die linke untere Ecke fest
  0, 0,                                                        // Die Anfangsposition des zu Kopierenden Bildes
  ImageSX($img_copyright), ImageSY($img_copyright),            // Die Breite und Höhe des hinenzukopierenden Bildes
  50                                                           // Gibt die Transparenz des eingefügten Bildes an...
);
ImageJPEG($img_origImage);                                     // Sorgt noch dafür, dass das Bild ausgegeben wird...
?>