Schon seit der Einführung von MacOS X hatte ich die wichtigsten Links zu den am häufigsten verwendeten Servern in einem extra Ordner im Dock abgelegt. So ist jeder Server mit zwei Klicks und ohne große Sucherei gemountet.

Normalerweise sind diese Bookmarks relativ flott mit Hilfe des Texteditors meiner Wahl erstellt (siehe dieser Artikel).
Bei einem Freund von mir, dem ich öfters in seiner Agentur aushelfe und der eine gewisse Personalfluktuation hat, ist dies allerdings so langsam zu einer zeitintensiven Angelegenheit geworden, da ich auch Benutzername und Passwort für den Serverzugriff mit im Bookmark speichere und für jeden neuen Mitarbeiter sämtliche Bookmarks komplett neu erstellen muss.

Deshalb habe ich mir nun – endlich nach Jahren – ein Shell-Skript für diesen Zweck geschrieben (welches inzwischen ein Perl-Skript geworden ist, da mir das Parsen der Server-Konfigurationen im Skript mit Bash etwas zu blöd wurde).

 

Zu meiner Überraschung handelt es sich bei diesen Bookmarks um XML-Dateien. Obwohl man zum Beispiel nur den Text smb://admin:admin@172.17.61.12/documents von einem Texteditor auf den Desktop zieht, erstellt das System im Hintergrund statt einem Text-Snippet eine XML-Datei. Zieht man diese Datei wieder zurück in den Texteditor, bekommt man nur den anfangs vorgegebenen Text zu sehen (das ist bei den via Skript erstellten Bookmark-Dateien seltsamerweise nicht mehr der Fall).
Deshalb konnte ich erst nicht verstehen, wieso meine automatisiert erstellten Bookmarks nicht funktionieren. Bis ich darauf kam, dass mich TextWrangler hier das erste Mal verarscht und nicht den 100%igen Inhalt der geöffneten Datei wiedergibt.

Bei folgendem Skript können im oberen Teil einzelne Serververbindungen eingetragen werden, die dann bei Skriptaufruf als einzelne Bookmarks erstellt werden, welche dann (optional) den Benutzername und das Passwort enthalten, was beim Skriptaufruf mitgegeben wurden.

Sollten die Developer-Tools nicht installiert sein, ist die Zeile 71 SetFile -a E $filename auszukommentieren oder zu entfernen, da der SetFile-Befehl mit den Developer-Tools installiert wird und ansonsten nicht vorhanden ist.
Durch diesen Befehl wird die Dateiendung des Bookmarks (.inetloc, .webloc, etc) ausgeblendet, was die Bookmarks etwas übersichtlicher machen würde.

Die Bookmarks werden an der Stelle erstellt, von der aus das Skript ausgeführt wird, nicht an der Stelle, an der die Skript-Datei liegt.

createBookmarks.pl
#!/usr/bin/perl

use strict;

################################################################################
# Die zu erstellenden Bookmarks                                                #
#                                                                              #
# Eine Serververbindung je Zeile:                                              #
#  - Name des Bookmarks (späterer Dateiname)                                   #
#  - Protokoll (afp/smb/vnc/http/https/ftp)                                    #
#  - Adresse/Freigabe durch Leerzeichen getrennt                               #
#  - Optional: no_cred, um bei diesem Bookmark keine Zugangsdaten zu speichern #
#                                                                              #
################################################################################

my $bookmarks = <<'END_BOOKMARKS';
Agentur                  smb 172.17.61.12/Agentur
FTP-Server               smb 172.17.61.12/Public           no_cred
Bildschirmzugriff-Server vnc admin:verysecret@172.17.61.12 no_cred
END_BOOKMARKS

################################################################################
 
my $uname = @ARGV[0];
my $upass = @ARGV[1];
my $cred  = "";
my %extensions = (
  "smb"   => "inetloc",
  "afp"   => "inetloc",
  "http"  => "webloc",
  "https" => "webloc",
  "ftp"   => "ftploc",
  "vnc"   => "vncloc"
  );

if ($uname eq "") {
  print "\nVerwendung:\n";
  print "createBookmarks.pl BENUTZERNAME PASSWORT  Benutzername und Passwort in Bookmarks einfügen\n";
  print "createBookmarks.pl BENUTZERNAME           Benutzername in Bookmarks einfügen\n";
  print "createBookmarks.pl --nouser               Keinen Benutzername und Passwort einfügen\n\n";
  exit(0);
  }

# Zugangsdaten-String
if ($uname ne "--nouser") { $cred = $uname; }
if ($upass ne "") { $cred .= ":$upass"; }
if ($cred ne "") { $cred .= "@"; }

# Bookmarks erstellen
for my $server (split(/\n/, $bookmarks)) {
  my ($name, $protocol, $url, $noCred) = split(/\s+/, $server);
  my $filename = "$name.$extensions{$protocol}";
  open(OUT,">$filename") or die("Konnte Datei für Bookmark $name nicht erstellen");
  print OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
  print OUT "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">";
  print OUT "<plist version=\"1.0\">";
  print OUT "<dict>";
  print OUT "   <key>URL</key>";
  print OUT "   <string>$protocol://", (($noCred eq "no_cred") ? "" : $cred) . "$url</string>";
  print OUT "</dict>";
  print OUT "</plist>";
  close(OUT);
  `SetFile -a E $filename`; # Nur, falls Developer-Tools installiert sind
  }

Nehmen wir an, ich führe das Skript wie folgt aus:
./createBookmarks.pl apfelz secretpass

So erhalte ich drei Bookmarks mit folgenden Serververbindungen (bzw. 1x VNC-Bildschirmzugriff):

smb://apfelz:secretpass@172.17.61.12/Agentur
smb://172.17.61.12/Public
vnc://admin:verysecret@172.17.61.12
Hier geht natürlich Usability vor Sicherheit. Die meisten Leute würden niemals Passwörter auf diese Weise fest in frei lesbare Dateien speichern.
In diesem Fall handelt es sich allerdings "nur" um die Benutzeraccounts für den File-Zugriff einer kleineren Agentur. Wenn die Leute Feierabend machen (und das Büro abgeschlossen wird), bleiben die Rechner sowieso immer eingeschaltet und angemeldet. Falls jemand extra einbricht, um an Daten rumzupfuschen, kann er es dann auch gleich am Rechner selbst machen und braucht keine Passworte, welche schon gar nicht für andere Dienste verwendet werden können.