Mulai / hentikan berbagi internet dari sebuah skrip?

21

Apakah ada cara untuk memulai / menghentikan berbagi internet dari baris perintah atau mungkin skrip apel?

Masalahnya adalah saya memindahkan laptop saya antara rumah dan kantor. Di satu tempat saya mendapatkan internet nirkabel (dan karenanya saya harus menonaktifkan berbagi internet), dan di tempat lain saya mendapatkan internet dari kabel ethernet dan mengatur komputer untuk berbagi internet ke perangkat lain dengan membuat jaringan nirkabel kecil.

Tetapi agak membosankan karena harus masuk ke System Preferences dan memulai / menghentikan berbagi internet setiap kali saya berpindah lokasi, jadi saya ingin memiliki perintah atau skrip cepat untuk memulai dan melakukan pergantian sesuai permintaan.

Ada petunjuk atau ide?

Juan A. Navarro
sumber
Mankoff, ketika saya menjalankan saran Anda: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist tampaknya berjalan dengan baik dan bahkan preferensi berbagi gui diperbarui dengan benar ketika di-refresh, namun koneksi sebenarnya tidak kerja. Jika saya menjalankan perintah lagi itu bahkan gagal karena dianggap sudah dimuat. Juga, jika saya menjalankan perintah "atas" untuk melihat proses yang sedang berjalan saya tidak melihat "InternetSharing" tetapi jika saya memulainya di gui preferensi saya akan melihat proses "InternetSharing" benar-benar berjalan dan koneksi berfungsi. Ada ide mengapa saya h
Tidak yakin mengapa Anda mendapatkan perilaku itu. Saya melihat "InternetSharing" di atas (atau lebih mudah, ps aux | grep -i internet ).
Saya menjalankan OS X 10.6. Jika Anda memiliki versi yang berbeda mungkin itu sebabnya ...
Juga, ini mungkin seharusnya komentar untuk jawaban saya, bukan jawaban itu sendiri. Mungkin ingin menghapus jawabannya ...
Ya, tentu ini harus menjadi komentar untuk jawaban Anda, tetapi untuk beberapa alasan saya tidak dapat mengomentari jawaban di sana kecuali seseorang telah membuat komentar. Mungkin karena saya pengguna baru. Saya menjalankan OS X 10.6.4. Hal lain yang saya perhatikan adalah ketika saya meluncurkan berbagi internet di gui preferensi adalah bahwa proses natd (daemon terjemahan alamat jaringan) juga akan dimulai. Saya bertanya-tanya apakah saya juga perlu meluncurkan proses ini, saat ini sedang menyelidiki bagaimana melakukan ini, tampaknya ada argumen kompleks yang diperlukan untuk memulai proses ini.

Jawaban:

19

Untuk memulai Berbagi Internet dari CLI:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist

Untuk berhenti, ubah beban menjadi bongkar .

Perhatikan bahwa jika Anda memiliki panel buka saat Anda menjalankan ini, Anda tidak akan segera melihat perubahan berlaku (UI tidak akan memperbarui), tetapi itu berfungsi.


sumber
Aneh, setelah beberapa saat, itu berhenti bekerja. Jika saya menjalankan perintah dan kemudian membuka panel preferensi saya melihat bahwa berbagi diaktifkan, namun koneksi sebenarnya tidak dibagi. Jika saya berhenti secara manual dan mulai berbagi di panel preferensi, maka itu akan berfungsi lagi tanpa masalah. Adakah petunjuk tentang apa yang bisa salah?
Juan A. Navarro
2
Kwitansi dari Ken berfungsi! Tapi ... ada bug (saya sedang berburu). Anda harus meninggalkan penundaan 30 detik setelah unloaddapat melakukan loadlagi. Satu perintah cek yang bagus adalah ps ax | egrep '[ /](PID|boo|nat)'.
dan
1
Tidak berfungsi pada 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby
3
coba: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist sebagai gantinya;)
guerrerocarlos
1
Karena aplikasi System Preferences tidak memerlukan otentikasi, bagaimana kami bisa melakukannya tanpa menggunakan sudo / root?
Michele Dall'Agata
4

Salah satu cara untuk melakukannya adalah dengan skrip GUI — Preferensi Sistem tidak memiliki dukungan Applescript apa pun secara default.

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
Philip Regan
sumber
3
Mungkin, tetapi berhasil dan jawabannya ada dalam batasan pertanyaan OP: "Apakah ada cara untuk memulai / menghentikan berbagi internet dari baris perintah atau mungkin skrip apel ?" Downvoting benar-benar harus diselamatkan untuk jawaban yang benar-benar mengerikan. Terima kasih
Philip Regan
1
Karenanya tidak ada downvote "resmi". :)
2
"berfungsi dan masih dalam batasan" membuat saya berpikir kita harus memiliki situs baru: rubegoldberg.stackexchange.com
2
Bukankah itu untuk thedailywtf.com ? ;-)
Philip Regan
1
@Juan: Hanya diperingatkan sebelumnya bahwa jika Apple mengubah tata letak Preferensi Sistem dan panel Berbagi dengan pemutakhiran, maka skrip saya memiliki potensi jeda yang nyata juga karena skrip GUI bergantung pada parameter yang sangat ketat.
Philip Regan
2

Saya mengambil isyarat dari jawaban mankoff dan membungkusnya dalam AppleScript. Saya menggunakan skrip ini dari Automator sehingga saya dapat dengan mudah menggunakannya sebagai layanan dan memberikan pintasan keyboard.

Beralih Berbagi Internet:

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
Prestaul
sumber
Tidak benar-benar bekerja pada Lion untukku. Ini menampilkan pesan sukses growl dan matikan opsi di preferensi sistem tetapi simbol WiFi tidak berubah ke berbagi (dan perangkat lain tidak dapat melihat bahwa wifi dibagi, jadi saya pikir itu tidak ada di :(
alopix
2

Saya memiliki hasil yang jauh lebih baik (untuk pengaturan berbagi yang sudah dikonfigurasi) pada 10.11.6 dengan variasi sederhana ...

sudo launchctl start com.apple.NetworkSharing

dan

sudo launchctl stop com.apple.NetworkSharing

masing-masing.

alex grey
sumber
1

Solusi pasti untuk berbagi wifi konstan mogok di MacosX

Saya telah menemukan sistem yang akhirnya berfungsi dan ketika, jarang berbagi wifi rusak, ia berhasil memulihkannya secara otomatis dalam satu menit.

Solusinya adalah ~/Library/LaunchAgents/com.me.wifisharingup.plistdaemon dengan konten berikut:

<?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>

Anda bisa lihat, setiap menit ia menjalankan skrip sederhana yang mengikuti. Hati-hati membuat plist sebelumnya dimiliki oleh root dan luncurkan dengan:

sudo chown root com.me.wifisharingup.plist
sudo launchctl load /Users/me/Library/LaunchAgents/com.me.wifisharingup.plist

Skrip yang diluncurkan setiap menit (jangan lupa untuk membuatnya dapat dieksekusi) adalah:

#!/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

Saya pikir panggilan sederhana secara berkala (setiap menit) untuk ipconfig getifaddr en1menyegarkan sesuatu dalam apa adalah daemon berbagi wifi. Apa pun itu, kapan pun pembagian wifi gagal, ia kehilangan alamat IP yang ditetapkan sendiri, dan kemudian,ipconfig getifaddr en1 gagal, jadi skrip saya benar-benar mengatur ulang wifi, membuatnya membangun kembali status sebelumnya dan memulihkan berbagi wifi.

Ini telah bekerja selama berhari-hari sejauh ini di dalam MacMini tanpa keyboard, mouse atau monitor, tetapi hanya terhubung ke Ethernet dan memberikan akses gadget wifi saya ke dunia.

juanfal
sumber
0

Cara yang sangat mudah untuk melakukannya adalah dengan menggabungkan jawaban @ Philip dengan aplikasi NetworkLocation . NL dapat mengetahui di mana Anda berada, dan secara otomatis menjalankan AppleScript saat Anda merasakan Anda telah mengubah lokasi.

Saya pikir ini adalah perangkat lunak yang diperlukan jika Anda memiliki laptop — jika tidak, ini adalah PITA untuk selalu harus mengatur ulang beberapa pengaturan secara manual setiap kali saya mengubah lokasi.

Dori
sumber
Kedengarannya seperti Marco Polo ( symonds.id.au/marcopolo ) tetapi tanpa steroid Marco Polo. :)
Ian C.
@Ian - Halaman itu mengatakan MP telah mengetahui masalah dengan Snow Leopard. The Google Grup mengatakan "proyek MarcoPolo tidak mati, per se, tetapi itu sedang berkembang sangat lambat. Jangan berharap versi baru segera." The git repositori menunjukkan tidak ada update sejak September 2009. Suara saya seperti steroid mungkin penangkapan dengan seseorang ... ;-)
Dori
Tidak bisa mengatakan saya punya masalah dengan itu di SL save untuk BlueTooth. Saya hanya tidak menggunakan fitur BT aktifkan / nonaktifkan / deteksi dan itu berfungsi agak cemerlang. (Tetapi poin diambil)
Ian C.
0

Sedikit berbeda dari applescript lainnya yang diposting (saya pikir dengan cara yang lebih baik tetapi ...). Memiliki opsi terkadang dapat membantu.

 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
Dori
sumber
0

Karena solusi skrip GUI yang diposting sebelumnya memerlukan pengguna internasional untuk menyesuaikan nama jendela dan tombol, saya membuat versi yang berfungsi dengan bahasa sistem apa pun. Ini juga berfungsi untuk opsi berbagi lainnya, dan memberikan umpan balik lokal tentang status berbagi. Saya menggunakan dua layanan Automator berbeda berdasarkan ini, satu untuk beralih berbagi file dan satu untuk beralih berbagi internet.

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
r0mer0
sumber
0

Sebelum / sesudah konfigurasi apa pun antarmuka atau antarmuka yang terlibat dalam berbagi perlu dimatikan / dihidupkan dengan:

networksetup -setairportpower en1 off

lalu ( networksetup -setairportpower en1 on)

Wifi saya terdaftar sebagai en1, untuk menggunakan pencarian Andanetworksetup -listnetworkserviceorder . Lebih penting lagi, ketika memulai berbagi internet Anda perlu menambahkan fungsionalitas NAT lebih rinci kemudian hanya mengatur bit yang diaktifkan.

NAT dinyalakan / dimatikan dengan bit: -int 0= off -int 1= on

Satu-satunya hal yang ditulis /Library/Preferences/SystemConfiguration/com.apple.nat.plistdengan

defaults write /Library/Preferences/SystemConfiguration/com.apple.nat\
    NAT -dict Enabled -int 0

aku s

<!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>

Anda perlu mengubah file plist Anda agar terlihat seperti berikut:

<!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>

Seperti yang Anda lihat, file NAT plist saya mungkin perlu sedikit penyesuaian agar sesuai dengan kebutuhan Anda.

Paul
sumber
0

Saya menggunakan skrip berikut untuk beralih berbagi internet pada awal 2011 MacBook Pro / 10.11.3 El Capitan, jadi dengan perangkat keras yang lebih baru Anda mungkin lolos dengan penundaan yang lebih pendek. Ini mengadopsi ide dari beberapa skrip diposting untuk tujuan ini (pelokalan, menyalakan / mematikan wifi menggunakan networksetup, tutup System Preferencesketika selesai).

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
Bernhard Wagner
sumber
-1
/usr/bin/defaults write /Library/Preferences/SystemConfiguration/com.apple.nat NAT -dict Enabled -int 0
Jason Bush
sumber
Apakah ini mengaktifkan berbagi?
Greenonline