Liebe Pinguine,
da man ja leider immer noch nicht um Windows-Programme herum kommt oder ich zumindest nicht, hat es mich immer sehr gestört, wie umständlich es ist, Wine-Programme unter Ubuntu vernünftig zu starten. Denn:
Es ist sinnvoll den meisten dieser Programme den Internetzugang zu blockieren
Sie befinden sich sinnvoller weise unter einer eigenen WINEPREFIX
Nicht alle Wine-Programme funktionieren mit allen Wine-Versionen
Man braucht für viele Wine-Programme ein Skript um Dateien mit Ihnen öffnen zu können
Einige Wine-Programme können nur aus ihrem Verzeichnis ausgeführt werden.
Weil es langsam lästig wurde, alle diese Bedürfnisse einzeln abzudecken, habe ich ein kleines Skript geschrieben, welches alle fünf Punkte erledigt. Weil ich mir denken kann, daß ich nicht der einige bin, der diese Probleme hat, will ich es mit euch teilen. Ich bin sicherlich kein genialer Programmierer, aber für mich ist darum auch nur bedeutend, daß es funktioniert. Ihr könnt das Skript (zum Beispiel unter dem Namen wine_appstarter) abspeichern und ausführbar machen. Dann ruft Ihre es mit:
1 | ./wine_appstarter --install
|
auf. Nun installiert sich das Skript. Das heißt, es kopiert sich selbst in /usr/local/bin, legt eine neue Gruppe an und verbietet ihr per Iptable den Zugriff aufs Internet. Mit dieser Gruppe werden die Wine_Programme dann ausgeführt, wenn sie keinen Zugriff aufs Internet haben sollen.
Nach der Installation könnt Ihr das Script wie folgt nutzen, um Wine-Programme zu starten. Hier ein Beispiel mit Microsoft Word 2010:
1 | wine_appstarter --prefix="~/.wine/Microsoft_Office_2010" --app="C:/Programme/Microsoft\ Office/Office14/WINWORD.EXE" |
Standartmäßig wird der Zugriff auf Internet verwehrt, wenn Ihr diesen aber gestatten wollt, könnt Ihr das durch den Parameter
1 | --internetAccess="yes" |
tun.
Standartmäßig schaut das Skript, ob innerhalb der WINEPREFIX im Ordner »WineVersion« eine spezielle Wine-Version abgelegt ist, mittels der das Programm ausgeführt werden soll. Das heißt in diesem Falle muß sich die gesamte Orderstruktur /usr und innerhalb /lib /bin /share in dem Ordner WineVersion befinden. Ist keine da, wird die systemweite Wine-Version genutzt. Der Standardort kann im Skript geändert werden, oder aber durch den Parameter:
1 | --winePath="/path/to/wine" |
Ich freue mich also, wenn Euch das Skript nützlich ist. Eine Garantie kann ich natürlich nicht übernehmen, über Rückmeldungen und Verbesserungen freue ich mich aber.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | #!/bin/bash ### BEGIN LICENSE # Copyright (C) 2011 Gunwald Neuhausen <gunwald@gmx.de> # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see <http://www.gnu.org/licenses/>. ## END LICENSE ################################################################################ # ----- Variable # ################################################################################ # ----- Variable allgemein ----------------------------------------------------- # Diese Variablen werden überschrieben, wenn entsprechende Parameter # übergeben wurden wineAppPath="C:\\Programme\\Adobe\\Acrobat 10.0\\Acrobat\\Acrobat.exe" winePrefix="/home/simon/.wine/Adobe_Acrobat_10" documentPath="" # Soll dem Wine-Programm Internetzugriff erlaubt sein? # »yes« or »no« internetAccess="no" # Relativer Pfad zu Wineversionen innerhalbt der Wineorefixe # Pfad zu Wine wineVersionPath="WineVersion/usr/bin/" # ----- Installationsoptionen--------------------------------------------------- # Name der Grupp, die benutzt wird, um den Internetzugriff zu verwehren groupName="no-internet" user=$(id -nu) # Netzwerk Ip networkIP="192.168.1.0/24" # Pfad, in den das Skript sich installiert installPath="/usr/local/bin/" # Name, unter dem sich das Skript installiert installName="wine-appstarter" # Firewall firewall="#!/bin/bash iptables -A OUTPUT -m owner --gid-owner no-internet -p tcp --dport 22 --sport 22 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A OUTPUT -m owner --gid-owner no-internet ! -d $networkIP -j DROP" # ----- Variable aus den Parametern holen -------------------------------------- # Werte der Variablen werden geändert, wenn dem Skript Parameterübergeben wurden numberOfParam=$# param=$1 echo $param for (( I=1; $I <= $numberOfParam; I++ )); do if [ "`echo "$1" | awk 'BEGIN { FS = "=|&" } { print $2 }'`" != "" ]; then # In der Variablen 'temp' wird der Bezeichner des Parameters # gespeichert also im Beipspiel "--paramtersName=paramtersValue" # hätte temp den Wert --paramtersName temp=`echo "$1" | awk 'BEGIN { FS = "=|&" } { print $1 }'` # Nun wird aus temp der Name einer Variablen gewonnen und # aus dem zweiten Teil des Parameters ihr Wert eval "`echo $temp | awk 'BEGIN { FS = "--|-" } { print $2 }'`=`echo $1 | awk 'BEGIN { FS = "=|&" } { print $2 }'`" elif test -f "$1" then documentPath=$1 fi shift done unset temp ################################################################################ # ----- Funktionen # ################################################################################ installScript() { # Dateiname des Skriptes thisScript="$(readlink -e "$0")" # Systemverwaltungsrechte holen gksu -p -m "Bitte Passwort eingeben, um das Skript zu installieren:" | sudo -S -s -- mkdir $installPath # Skript kopieren und ausführbar machen echo "Skript wird nach $installPath$installName kopiert.." sudo cp $thisScript $installPath$installName && sudo chmod +x $installPath$installName # Gruppe zum verwehren des Internetzugriffs anlegen echo "Gruppe »$groupName« zum verwehren des Internetzugriffs anlegen" sudo addgroup $groupName sudo adduser $user $groupName # Firewall errichten und ausführen echo "Firewall errichten und ausführen..." sudo echo -e "$firewall" > /tmp/iptables_no-internet_rule sudo mv /tmp/iptables_no-internet_rule /etc/network/if-pre-up.d/iptables_no-internet_rule sudo chmod +x /etc/network/if-pre-up.d/iptables_no-internet_rule sudo /etc/network/if-pre-up.d/iptables_no-internet_rule # Abwärtskompatibilität #sudo ln -s $installPath/$installName /usr/local/bin/openWineApp exit } ################################################################################ # ----- Programmablauf # ################################################################################ # Falls --install aufgerufen wurde, soll installiert werden if [ "`echo $param | grep '\-\-install'`" != "" ]; then installScript fi # Falls --winePath angegeben wurde, diesen übernehmen if [ "$winePath" != "" ]; then wineVersionPath=$winePath fi # Falls --prefix angegeben wurde, diesen für winePrefix übernehmen if [ "$prefix" != "" ]; then winePrefix=$prefix fi # Pfad zu Wine aktualisieren wineVersionPath="$winePrefix/$wineVersionPath" # Falls --app angegeben wurde, diesen für wineAppPath übernehmen if [ "$app" != "" ]; then wineAppPath=$app fi # Überprüfen, ob ein Pfade zu einem Dokument übergeben wurde # Gegebenenfalls in Winepfad umsetzen if test -f "$documentPath" then documentPath="WINPREFIX=$winePrefix winepath -w \"$documentPath\"" documentPath=`eval $documentPath` else documentPath="" fi # Überprüfen ob sich im Programmordner ein Verzeichnis befindet, in welchem # eine spezielle Wineversion abgelegt ist, mit der das Programm gestartet werden # soll. if test -d "$wineVersionPath" then echo -e "\033[1;34m################### Benutzerdefinierte Wineversion ####################" echo -e "Das Programm wird mit folgender Wineversion gestartet: $wineVersionPath" PATH="$wineVersionPath:$PATH" zenity --info --timeout=1 --text "Das Programm wird mit folgender Wineversion gestartet:\n$(wine --version) \n\nIn: $wineVersionPath" else echo "Unter dem Pfad $wineVersionPath wurde keine Wineversion gefunden" #exit; fi wine --version # Überprüfen, ob winecfg gestartet werden soll if [[ $wineAppPath = "winecfg" || $(echo $wineAppPath | grep "winetricks") ]]; then echo -e "\033[1;34mEs wird nun das Programm $wineAppPath in mit folgender Präfix gestartet: $winePrefix\033[0m" WINEPREFIX="$winePrefix" $wineAppPath exit fi echo -e "################### $documentPath #################### \033[0m" # Kommando zusammenbauen command='env WINEPREFIX="'$winePrefix'" wine "'$wineAppPath'" "'$documentPath'"' # In das Wine-Prgrammverzeichnis wechseln: Manche Programme können nur aus ihrem # Programmverzeichnis heraus ausgeführt werden, weil sie sonst ihre DLLs nicht # finden fullUnixPath="`WINEPREFIX="$winePrefix" winepath -u "$wineAppPath"`" fullUnixPath="`dirname "$fullUnixPath"`" echo "Wechsle in das Verzeichnis $fullUnixPath..." cd "$fullUnixPath" # Soll Internetzugriff erlaubt sein oder nicht? if [ $internetAccess = "yes" ]; then echo -e "\033[0;33mDas Programm wird mit Internetzugriff mit folgendem Befehl gestartet:" echo -e "$command\033[0m" env WINEPREFIX="$winePrefix" wine "$wineAppPath" "$documentPath" else echo -e "\033[0;33mDas Programm wird ohne Internetzugriff mit folgendem Befehl gestartet:" echo -e "sg $groupName $command \033[0m" sg $groupName "$command" fi exit 0 |
Ach ja, wenn Ihr mit dem Skript eine Datei mittels eines Wine-Programmes öffnen wollt, legt Ihr am besten eine Desktop-Datei an, mit der Zeile:
1 | Exec=wine_appstarter --prefix="~/.wine/Microsoft_Office_2010" --app="C:/Programme/Microsoft\ Office/Office14/WINWORD.EXE" %f |
Oder Ihr startet das Skript so
1 | wine_appstarter --prefix="~/.wine/Microsoft_Office_2010" --app="C:/Programme/Microsoft\ Office/Office14/WINWORD.EXE" documentPath="Pfad/zu/der/Word-Datei.doc" |
oder so:
1 | wine_appstarter --prefix="~/.wine/Microsoft_Office_2010" --app="C:/Programme/Microsoft\ Office/Office14/WINWORD.EXE" "Pfad/zu/der/Word-Datei.doc" |