Gibt es eine Möglichkeit, die Internetfreigabe über die Befehlszeile oder vielleicht ein Apple-Skript zu starten/stoppen?
Die Sache ist, dass ich meinen Laptop zwischen Zuhause und der Arbeit hin und her bewege. An einem Ort bekomme ich drahtloses Internet (und muss daher die Internetfreigabe deaktivieren), und an dem anderen bekomme ich Internet über ein Ethernet-Kabel und richte den Computer so ein, dass er das Internet für andere Geräte freigibt, indem ich ein kleines drahtloses Netzwerk erstelle.
Aber es wird ein bisschen mühsam, jedes Mal, wenn ich den Standort wechsele, in die Systemeinstellungen zu gehen und die Internetfreigabe zu starten / zu stoppen, also hätte ich gerne einen schnellen Befehl oder ein Skript, um den Wechsel bei Bedarf zu starten und durchzuführen.
Irgendwelche Hinweise oder Ideen?
So starten Sie die Internetfreigabe über die CLI:
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist
Um anzuhalten, wechseln Sie von Laden zu Entladen .
Beachten Sie, dass, wenn Sie das Pref-Fenster geöffnet haben, wenn Sie dies ausführen, die Änderung nicht sofort wirksam wird (die Benutzeroberfläche wird nicht aktualisiert), aber es funktioniert.
unload
sich lassen, um einen load
erneuten Vorgang ausführen zu können. Ein guter Prüfbefehl ist ps ax | egrep '[ /](PID|boo|nat)'
./System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
unload
nicht zu funktionieren, es sei denn, SIP wird entfernt (nichts, was ich gerne tun würde)…Eine Möglichkeit, dies zu tun, ist das Erstellen von GUI-Skripten – die Systemeinstellungen haben standardmäßig keine Applescript-Unterstützung.
tell application "System Preferences" to set current pane to pane "com.apple.preferences.sharing"
delay 1
tell application "System Events" to tell process "System Preferences"
click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window "Sharing" -- change to row 10 if you are using anything before Snow Leopard
delay 1
if (exists sheet 1 of window "Sharing") then
click button "Start" of sheet 1 of window "Sharing"
end if
end tell
ignoring application responses
tell application "System Preferences" to quit
end ignoring
System Events got an error: Can’t get button "Start" of sheet 1 of window "Sharing" of process "System Preferences".
Es funktioniert jedoch gut, wenn ich versuche, es zu deaktivieren. Das Lustige ist, wenn die Systemeinstellungen geöffnet sind und ich versuche, sie zu aktivieren, funktioniert es. Haben Sie eine Idee, warum das passieren würde?Ich hatte weitaus bessere Ergebnisse (für ein bereits konfiguriertes Sharing-Setup) auf 10.11.6 mit den einfachen Variationen ...
sudo launchctl
start
com.apple.NetworkSharing
und
sudo launchctl
stop
com.apple.NetworkSharing
beziehungsweise.
Ich habe ein System gefunden, das endlich funktioniert und wenn, weniger häufig, die WLAN-Freigabe unterbrochen wird, kann es es automatisch in einer Minute wiederherstellen.
Die Lösung ist ein ~/Library/LaunchAgents/com.me.wifisharingup.plist
Daemon mit folgendem Inhalt:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.juanfal.wifisharingup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/mi/bin/wifisharingup.sh</string>
</array>
<key>Nice</key>
<integer>1</integer>
<key>StartInterval</key>
<integer>60</integer>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/Users/me/Library/Logs/wifisharingup.err</string>
<key>StandardOutPath</key>
<string>/Users/me/Library/Logs/wifisharingup.out</string>
</dict>
</plist>
Sie können sehen, dass jede Minute das folgende einfache Skript ausgeführt wird. Achten Sie darauf, dass die vorherige Plist dem Stamm gehört, und starten Sie sie mit:
sudo chown root com.me.wifisharingup.plist
sudo launchctl load /Users/me/Library/LaunchAgents/com.me.wifisharingup.plist
Das Skript, das jede Minute gestartet wird (vergessen Sie nicht, es ausführbar zu machen), lautet:
#!/bin/sh
if [[ ! `ipconfig getifaddr en1` ]]; then
/usr/sbin/networksetup -setairportpower en1 off
/usr/sbin/networksetup -setairportpower en1 on
echo `date` >> "/Users/me/Library/Logs/wifisharingup.err"
else
touch "/Users/me/Library/Logs/wifisharingup.out"
fi
Ich denke, der einfache periodische (jede Minute) Aufruf ipconfig getifaddr en1
aktualisiert etwas in dem, was der WLAN-Sharing-Daemon ist. Was auch immer es ist, in jedem Moment, in dem die WLAN-Freigabe fehlschlägt, verliert sie die selbst zugewiesene IP-Adresse und schlägt dann ipconfig getifaddr en1
fehl, sodass mein Skript das WLAN vollständig zurücksetzt, wodurch es seinen vorherigen Status wiederherstellt und die WLAN-Freigabe wiederherstellt.
Es funktioniert bisher seit Tagen in einem MacMini ohne Tastatur, Maus oder Monitor, sondern nur am Ethernet angeschlossen und verschafft meinen WLAN-Gadgets Zugang zur Welt.
Ich habe mich an Mankoffs Antwort orientiert und sie in ein AppleScript verpackt. Ich verwende dieses Skript von Automator, damit ich es einfach als Dienst verwenden und ihm eine Tastenkombination zuweisen kann.
Internetfreigabe umschalten:
register_growl()
try
if isRunning("InternetSharing") then
do shell script "launchctl unload -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges
if isRunning("InternetSharing") then
error "Internet Connection Sharing was Not Disabled"
else
my growlnote("Success", "Internet Connection Sharing Disabled")
end if
else
do shell script "launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges
if isRunning("InternetSharing") then
my growlnote("Success", "Internet Connection Sharing Enabled")
else
error "Internet Connection Sharing was Not Enabled"
end if
end if
on error errMsg
my growlnote("Error", errMsg)
end try
on isRunning(processName)
try
return 0 < length of (do shell script "ps ax | grep -v grep | grep " & processName)
on error
return false
end try
end isRunning
on register_growl()
try
tell application "GrowlHelperApp"
set the notificationsList to {"Success", "Warning", "Error"}
register as application "Toggle Internet Connection Sharing" all notifications notificationsList default notifications notificationsList icon of application "Sharing"
end tell
end try
end register_growl
on growlnote(growltype, str)
try
tell application "GrowlHelperApp"
notify with name growltype title growltype description str application name "Toggle Internet Connection Sharing"
end tell
end try
end growlnote
Ich verwende das folgende Skript, um die Internetfreigabe auf einem MacBook Pro von Anfang 2011 / 10.11.3 El Capitan umzuschalten, sodass Sie mit neuerer Hardware möglicherweise mit kürzeren Verzögerungen davonkommen. Es übernimmt Ideen aus mehreren Skripten, die zu diesem Zweck veröffentlicht wurden (Lokalisierung, WLAN ein-/ausschalten mit networksetup
, schließen, System Preferences
wenn fertig).
tell application "System Preferences"
activate
reveal (pane id "com.apple.preferences.sharing")
set localized_window to the localized name of the current pane
end tell
tell application "System Events" to tell process "System Preferences"
delay 1
repeat with r in rows of table 1 of scroll area 1 of group 1 of window localized_window
if (value of static text of r as text) starts with "Internet" then
set sharingBool to value of checkbox of r as boolean
select r
if sharingBool is true
do shell script "/usr/sbin/networksetup -setairportpower en1 off"
else
do shell script "/usr/sbin/networksetup -setairportpower en1 on"
end if
click checkbox of r
end if
end repeat
delay 1
if (exists sheet 1 of window localized_window) then
click button "Start" of sheet 1 of window localized_window
end if
end tell
ignoring application responses
tell application "System Preferences" to quit
end ignoring
Der wirklich einfache Weg, dies zu tun, besteht darin, die Antwort von @Philip mit der NetworkLocation - Anwendung zu kombinieren. NL kann erkennen, wo Sie sich befinden, und automatisch ein AppleScript ausführen, wenn es feststellt, dass Sie den Standort gewechselt haben.
Ich denke, es ist eine erforderliche Software, wenn Sie einen Laptop haben – ansonsten ist es eine PITA, immer mehrere Einstellungen manuell zurücksetzen zu müssen, wenn ich den Standort wechsele.
Etwas anders als das andere gepostete Applescript (ich denke auf eine bessere Art, aber …). Optionen zu haben kann manchmal helfen.
tell application "System Preferences"
activate
reveal (pane id "com.apple.preferences.sharing")
end tell
tell application "System Events"
tell process "System Preferences"
try
click checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing"
if checkbox of row 11 of table 1 of scroll area of group 1 of window "Sharing" is equal to 1 then
repeat until sheet of window 1 exists
delay 0.5
end repeat
end if
if (sheet of window 1 exists) then
click button "Start" of sheet of window 1
end if
tell application "System Preferences" to quit
activate (display dialog "Internet Sharing preferences sucessfully flipped")
on error
activate
display dialog "something went wrong in automation but you are probably in the right menu…"
return false
end try
end tell
end tell
Da die zuvor gepostete GUI-Scripting-Lösung erfordert, dass internationale Benutzer die Fenster- und Schaltflächennamen anpassen, habe ich eine Version entwickelt, die mit jeder Systemsprache funktioniert. Es funktioniert auch für die andere Freigabeoption und gibt lokalisiertes Feedback zum Freigabestatus. Ich verwende darauf basierend zwei verschiedene Automator-Dienste, einen zum Umschalten der Dateifreigabe und einen zum Umschalten der Internetfreigabe.
tell application "System Preferences"
set current pane to pane "com.apple.preferences.sharing"
set localized_window to the localized name of the current pane
set localized_app to (localized string "System Preferences")
set localized_ok to {localized string "OK"} -- File sharing
set localized_start to {localized string "START"} -- Internet sharing
end tell
delay 0.3
tell application "System Events"
tell process "System Preferences"
click checkbox 1 of row 8 of table 1 of scroll area 1 of group 1 of window localized_window
delay 0.2
select row 8 of table 1 of scroll area 1 of group 1 of window localized_window
-- change row numbers to the service you want toggled
if (exists sheet 1 of window localized_window) then
try
click button (localized_ok as string) of sheet 1 of window localized_window
on error
click button (localized_start as string) of sheet 1 of window localized_window
end try
end if
set sharing_state to the value of item 1 of static text of group 1 of window localized_window
end tell
tell application "System Preferences" to quit
display notification sharing_state with title localized_app
-- display notification exists since OS 10.9, for older systems use:
-- display dialog sharing_state buttons {localized_ok} default button 1 with title localized_app giving up after 1.5
end tell
Vor/nach jeder Konfiguration müssen die an der Freigabe beteiligten Schnittstellen aus-/eingeschaltet werden mit:
networksetup -setairportpower en1 off
dann weiter. ( networksetup -setairportpower en1 on
)
Mein WLAN wurde als aufgeführt en1
, um Ihres zu suchen networksetup -listnetworkserviceorder
. Genauer gesagt, wenn Sie mit der Internetfreigabe beginnen, müssen Sie eine detailliertere NAT-Funktionalität hinzufügen und dann nur das aktivierte Bit setzen.
NAT wird mit Bit ein-/ausgeschaltet: -int 0
= aus -int 1
= ein
Das einzige, was mit geschrieben /Library/Preferences/SystemConfiguration/com.apple.nat.plist
ist
defaults write /Library/Preferences/SystemConfiguration/com.apple.nat\
NAT -dict Enabled -int 0
ist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NAT</key>
<dict>
</dict>
<key>Enabled</key>
<integer>1</integer>
</dict>
</dict>
</plist>
Sie müssen Ihre Plist-Datei so ändern, dass sie wie folgt aussieht:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NAT</key>
<dict>
<key>AirPort</key>
<dict>
<key>40BitEncrypt</key>
<integer>1</integer>
<key>Channel</key>
<integer>0</integer>
<key>Enabled</key>
<integer>0</integer>
<key>NetworkName</key>
<string>FancyHostNome</string>
<key>NetworkPassword</key>
<data>
</data>
</dict>
<key>Enabled</key>
<integer>1</integer>
<key>NatPortMapDisabled</key>
<false/>
<key>PrimaryInterface</key>
<dict>
<key>Device</key>
<string>en4</string>
<key>Enabled</key>
<integer>0</integer>
<key>HardwareKey</key>
<string></string>
<key>PrimaryUserReadable</key>
<string>InfiniBand</string>
</dict>
<key>PrimaryService</key>
<string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
<key>SharingDevices</key>
<array>
<string>en1</string>
</array>
</dict>
</dict>
</plist>
Wie Sie sehen können, muss meine Plist-NAT-Datei möglicherweise etwas an Ihre Bedürfnisse angepasst werden.
Vielleicht möchten Sie sich diese (möglicherweise Off-Topic für Stack Overflow) Frage und ihre Antwort ansehen: How to start/stop Internet Sharing using AppleScript .
do shell script "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges
Eines der obigen Skripte geändert, um die Internetfreigabe auf OSX MOJAVE (10.14) umzuschalten, es funktioniert:
tell application "System Preferences"
activate
reveal (pane id "com.apple.preferences.sharing")
delay 0.3
set current pane to pane "com.apple.preferences.sharing"
delay 0.3
set localized_window to the localized name of the current pane
set localized_app to (localized string "System Preferences")
set localized_ok to {localized string "OK"} -- File sharing
set localized_start to {localized string "START"} -- Internet sharing
end tell
delay 0.3
tell application "System Events"
tell process "System Preferences"
click checkbox 1 of row 7 of table 1 of scroll area 1 of group 1 of window localized_window
delay 0.2
select row 8 of table 1 of scroll area 1 of group 1 of window localized_window
-- change row numbers to the service you want toggled
if (exists sheet 1 of window localized_window) then
try
click button (localized_ok as string) of sheet 1 of window localized_window
on error
click button (localized_start as string) of sheet 1 of window localized_window
end try
end if
set sharing_state to the value of item 1 of static text of group 1 of window localized_window
end tell
tell application "System Preferences" to quit
display notification sharing_state with title localized_app
-- display notification exists since OS 10.9, for older systems use:
-- display dialog sharing_state buttons {localized_ok} default button 1 with title localized_app giving up after 1.5
end tell
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
MikeZ
Benutzer588
Benutzer588
Benutzer588
MikeZ
MikeZ
Robert S Ciaccio