ubuntuusers.de

Wine-Anwendungen besser integrieren: Internetzugriff verbieten, aus Verzeichnis starten, etc..

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

gunwald

Anmeldungsdatum:
12. Juli 2010

Beiträge: 218

Wohnort: /home/gunwald

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:

  1. Es ist sinnvoll den meisten dieser Programme den Internetzugang zu blockieren

  2. Sie befinden sich sinnvoller weise unter einer eigenen WINEPREFIX

  3. Nicht alle Wine-Programme funktionieren mit allen Wine-Versionen

  4. Man braucht für viele Wine-Programme ein Skript um Dateien mit Ihnen öffnen zu können

  5. 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"

Lauscher

Avatar von Lauscher

Anmeldungsdatum:
23. Januar 2012

Beiträge: 541

Wohnort: /..

Hallo gunwald,

danke für Dein sehr nützliches Skript! Ich habe gerade einen Hinweis darauf im Artikel wine eingefügt.

Viele Grüße, Lauscher

Antworten |