เริ่ม / หยุดการแบ่งปันอินเทอร์เน็ตจากสคริปต์หรือไม่


21

มีวิธีการเริ่ม / หยุดการแบ่งปันอินเทอร์เน็ตจากบรรทัดคำสั่งหรืออาจจะเป็นแอปเปิ้ลสคริปต์?

สิ่งที่ฉันย้ายไปรอบ ๆ แล็ปท็อประหว่างบ้านและที่ทำงาน ที่หนึ่งที่ฉันได้รับอินเทอร์เน็ตไร้สาย (และฉันต้องปิดการใช้งานอินเทอร์เน็ตร่วมกัน) และอื่น ๆ ที่ฉันได้รับอินเทอร์เน็ตจากสายเคเบิลอีเธอร์เน็ตและตั้งค่าคอมพิวเตอร์เพื่อแบ่งปันอินเทอร์เน็ตไปยังอุปกรณ์อื่น ๆ โดยการสร้างเครือข่ายไร้สายขนาดเล็ก

แต่การเริ่มต้น / หยุดการแบ่งปันอินเทอร์เน็ตทุกครั้งที่ฉันเปลี่ยนสถานที่นั้นค่อนข้างน่าเบื่อเมื่อต้องเปลี่ยนการตั้งค่าระบบดังนั้นฉันจึงต้องการคำสั่งหรือสคริปต์ที่รวดเร็วในการเปิดใช้งานและเปลี่ยนตามความต้องการ

คำแนะนำหรือความคิดใด ๆ


Mankoff เมื่อฉันเรียกใช้ข้อเสนอแนะของคุณ: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist ดูเหมือนว่าจะทำงานได้ดีและแม้กระทั่งการตั้งค่าการแบ่งปัน Gui ถูกปรับปรุงอย่างถูกต้องเมื่อรีเฟรช การทำงาน ถ้าฉันรันคำสั่งอีกครั้งมันก็ล้มเหลวเพราะคิดว่าโหลดแล้ว นอกจากนี้หากฉันเรียกใช้คำสั่ง "top" เพื่อดูกระบวนการที่กำลังทำงานอยู่ฉันไม่เห็น "InternetSharing" แต่ถ้าฉันเริ่มในการตั้งค่า gui ฉันจะเห็นกระบวนการ "InternetSharing" ใช้งานได้จริงและการเชื่อมต่อใช้งานได้ ความคิดใด ๆ ว่าทำไมฉันถึง h

ไม่แน่ใจว่าทำไมคุณถึงมีพฤติกรรมเช่นนั้น ฉันเห็น "InternetSharing" ด้านบน (หรือง่ายกว่าคือps aux | grep -i internet )

ฉันใช้ OS X 10.6 หากคุณมีเวอร์ชั่นที่แตกต่างกันนั่นอาจเป็นเหตุผลว่า ...

นอกจากนี้อาจเป็นความเห็นต่อคำตอบของฉันไม่ใช่คำตอบในตัวเอง อาจต้องการลบคำตอบ ...

ใช่แน่นอนว่านี่ควรเป็นความเห็นต่อคำตอบของคุณ แต่ด้วยเหตุผลบางอย่างฉันไม่สามารถแสดงความคิดเห็นในคำตอบนั้นได้เว้นแต่มีบางคนแสดงความคิดเห็นแล้ว อาจเป็นเพราะฉันเป็นผู้ใช้ใหม่ ฉันใช้ OS X 10.6.4 อีกสิ่งหนึ่งที่ฉันสังเกตเห็นคือเมื่อฉันเปิดใช้งานอินเทอร์เน็ตร่วมกันในการตั้งค่า gui ก็คือกระบวนการ natd (daemon การแปลที่อยู่เครือข่าย) ก็เริ่มต้นเช่นกัน ฉันสงสัยว่าถ้าฉันยังต้องเปิดตัวกระบวนการนี้ในปัจจุบันตรวจสอบวิธีการทำเช่นนี้ดูเหมือนจะมีข้อโต้แย้งที่ซับซ้อนที่จำเป็นในการเริ่มต้นกระบวนการนี้

คำตอบ:


19

ในการเริ่มการแชร์อินเทอร์เน็ตจาก CLI:

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

เพื่อหยุดการเปลี่ยนภาระการขน

โปรดทราบว่าหากคุณเปิดบานหน้าต่าง pref เมื่อคุณรันสิ่งนี้คุณจะไม่เห็นการเปลี่ยนแปลงมีผลทันที (UI จะไม่อัปเดต) แต่จะใช้งานได้


แปลกหลังจากผ่านไปครู่หนึ่งมันก็หยุดทำงาน ถ้าฉันเรียกใช้คำสั่งแล้วเปิดบานหน้าต่าง pref ฉันเห็นว่ามีการเปิดใช้งานการแชร์ แต่การเชื่อมต่อไม่ได้ถูกแชร์ ถ้าฉันหยุดและเริ่มการแชร์บนบานหน้าต่าง pref ด้วยตนเองมันจะทำงานอีกครั้งโดยไม่มีปัญหา เบาะแสใด ๆ เกี่ยวกับสิ่งที่อาจผิด
Juan A. Navarro

2
สูตรการทำงานของเคน! แต่ ... มีข้อผิดพลาด (ฉันกำลังตามล่า) คุณต้องออกจากการหน่วงเวลา 30 วินาทีหลังจากนั้นunloadเพื่อให้สามารถทำloadอีกครั้ง ps ax | egrep '[ /](PID|boo|nat)'หนึ่งในคำสั่งการตรวจสอบที่ดีคือ
แดน

1
ใช้งานไม่ได้กับ 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby

3
ลอง: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist แทน;)
guerrerocarlos

1
เนื่องจากแอป System Preferences ไม่ต้องการการตรวจสอบสิทธิ์เราจะทำอย่างไรโดยไม่ใช้ sudo / root
Michele Dall'Agata

4

วิธีหนึ่งในการทำเช่นนี้คือโดยสคริปต์ GUI - การตั้งค่าระบบไม่มีการสนับสนุน Applescript ตามค่าเริ่มต้น

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

3
บางทีมันอาจจะใช้งานได้และคำตอบนั้นอยู่ภายใต้ข้อ จำกัด ของคำถาม OP: "มีวิธีเริ่ม / หยุดการแบ่งปันอินเทอร์เน็ตจากบรรทัดคำสั่งหรืออาจเป็นแอปเปิ้ลหรือไม่" การ downvoting จริง ๆ ควรได้รับการบันทึกไว้สำหรับคำตอบที่ร้ายแรงจริงๆ ขอบคุณ
Philip Regan

1
ดังนั้นไม่มี downvote "เป็นทางการ" :)

2
"ได้ผลและอยู่ในข้อ จำกัด " ทำให้ฉันคิดว่าเราควรมีไซต์ใหม่: rubegoldberg.stackexchange.com

2
นั่นไม่ใช่สิ่งที่thedailywtf.comมีไว้เพื่ออะไร? ;-)
Philip Regan

1
@ Juan: ขอเตือนล่วงหน้าว่าหาก Apple เปลี่ยนเค้าโครงของการตั้งค่าระบบและบานหน้าต่างการแบ่งปันด้วยการอัปเกรดสคริปต์ของฉันก็มีตัวแบ่งที่อาจเกิดขึ้นเช่นกันเนื่องจากการเขียนสคริปต์ GUI ต้องอาศัยพารามิเตอร์ที่เข้มงวดมาก
Philip Regan

2

ฉันรับคิวจากคำตอบของ mankoff และห่อไว้ใน AppleScript ฉันใช้สคริปต์นี้จาก Automator เพื่อให้ฉันสามารถใช้เป็นบริการได้อย่างง่ายดายและให้แป้นพิมพ์ลัด

สลับการแชร์อินเทอร์เน็ต:

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

ใช้งานไม่ได้กับ Lion สำหรับฉันจริงๆ มันแสดงข้อความคำรามสำเร็จและสลับตัวเลือกในการตั้งค่าระบบ แต่สัญลักษณ์ WiFi ไม่เปลี่ยนเป็นการแชร์ (และอุปกรณ์อื่นไม่สามารถเห็นได้ว่ามีการแชร์ wifi ดังนั้นฉันคิดว่ามันไม่ได้อยู่บน :(
alopix

2

ฉันมีผลลัพธ์ที่ดีกว่ามาก (สำหรับการตั้งค่าการแชร์ที่กำหนดค่าไว้แล้ว) ใน 10.11.6 ด้วยรูปแบบที่เรียบง่าย ...

sudo launchctl start com.apple.NetworkSharing

และ

sudo launchctl stop com.apple.NetworkSharing

ตามลำดับ


1

วิธีแก้ปัญหาที่ชัดเจนในการแชร์ wifi อย่างไม่หยุดหย่อนใน MacosX

ฉันได้พบระบบที่ใช้งานได้ในที่สุดและเมื่อใดก็ตามที่การแบ่งการแชร์ wifi น้อยครั้งก็จะสามารถกู้คืนได้โดยอัตโนมัติในหนึ่งนาที

การแก้ปัญหาคือ~/Library/LaunchAgents/com.me.wifisharingup.plistภูตที่มีเนื้อหาต่อไป:

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

คุณสามารถเห็นแต่ละนาทีมันเรียกใช้สคริปต์ง่าย ๆ ที่ตามมา ระวังให้ดีว่าเพลทก่อนหน้าจะเป็นเจ้าของโดยรูทและเริ่มด้วย:

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

สคริปต์ที่เปิดตัวในแต่ละนาที (อย่าลืมที่จะทำให้มันทำงานได้) คือ:

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

ฉันคิดว่าการโทรง่าย ๆ เป็นระยะ ๆ (แต่ละนาที) เพื่อipconfig getifaddr en1รีเฟรชบางสิ่งใน daemon การแบ่งปัน wifi คืออะไร ไม่ว่าจะเป็นช่วงเวลาใดก็ตามที่การแบ่งปัน wifi ล้มเหลวมันจะสูญเสียที่อยู่ IP ที่กำหนดด้วยตนเองและจากนั้นจึงipconfig getifaddr en1ล้มเหลวดังนั้นสคริปต์ของฉันจึงรีเซ็ต wifi ทั้งหมดทำให้สถานะของมันกลับมาเป็นก่อนหน้าและกู้คืนการแชร์ wifi

มันทำงานมาหลายวันแล้วใน MacMini โดยไม่ต้องใช้แป้นพิมพ์เมาส์หรือจอมอนิเตอร์ แต่เสียบเข้ากับอีเธอร์เน็ตและให้แกดเจ็ต wifi ของฉันเข้าถึงโลก


0

วิธีที่ง่ายมากที่จะทำคือการรวมคำตอบของ @ Philip กับแอปพลิเคชันNetworkLocation NL สามารถบอกได้ว่าคุณอยู่ที่ไหนและเรียกใช้ AppleScript โดยอัตโนมัติเมื่อตรวจพบว่าคุณเปลี่ยนสถานที่

ฉันคิดว่ามันเป็นซอฟต์แวร์ที่จำเป็นหากคุณมีแล็ปท็อปไม่เช่นนั้น PITA จะต้องรีเซ็ตการตั้งค่าด้วยตนเองทุกครั้งที่ฉันเปลี่ยนสถานที่


เสียงเหมือนมาร์โคโปโล ( symonds.id.au/marcopolo ) แต่ไม่มีสเตียรอยด์มาร์โคโปโล :)
เอียนซี

@Ian - หน้านั้นบอกว่า MP ทราบปัญหาเกี่ยวกับ Snow Leopard แล้ว กลุ่ม Googleกล่าวว่า "โครงการ MarcoPolo ไม่ตายต่อ se แต่มันถูกพัฒนาช้ามาก. อย่าคาดหวังว่ารุ่นใหม่เร็ว ๆ นี้." เก็บคอมไพล์แสดงให้เห็นว่าการปรับปรุงตั้งแต่เดือนกันยายน 2009 เสียงที่ฉันชอบเตียรอยด์อาจจะมีการจับกับใครสักคน ... ;-)
Dori

ไม่สามารถพูดได้ว่าฉันมีปัญหาใด ๆ กับมันใน SL saveสำหรับ BlueTooth ฉันไม่ได้ใช้คุณสมบัติเปิดใช้งาน / ปิดใช้งาน / ตรวจจับ BT และใช้งานได้อย่างยอดเยี่ยม (แต่ได้ประเด็น)
Ian C.

0

แตกต่างเล็กน้อยจาก applescript อื่นที่โพสต์ (ฉันคิดว่าดีกว่า แต่ ... ) การมีตัวเลือกบางครั้งสามารถช่วยได้

 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

0

เนื่องจากโซลูชันการเขียนสคริปต์ GUI ที่โพสต์ก่อนหน้านี้ต้องการผู้ใช้งานต่างประเทศเพื่อปรับชื่อหน้าต่างและปุ่มฉันจึงมีเวอร์ชันที่ใช้งานได้กับภาษาระบบ นอกจากนี้ยังใช้งานได้สำหรับตัวเลือกการแบ่งปันอื่น ๆ และให้ข้อเสนอแนะเกี่ยวกับสถานะการแบ่งปัน ฉันใช้บริการ Automator ที่แตกต่างกันสองบริการตามนี้หนึ่งเพื่อสลับการแชร์ไฟล์และอีกหนึ่งเพื่อสลับการแบ่งปันอินเทอร์เน็ต

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

0

ก่อน / หลังการกำหนดค่าใด ๆ อินเทอร์เฟซหรืออินเทอร์เฟซที่เกี่ยวข้องในการแชร์จะต้องปิด / เปิดด้วย:

networksetup -setairportpower en1 off

หลังจากนั้น ( networksetup -setairportpower en1 on)

wifi ของฉันถูกระบุว่าเป็นen1เพื่อค้นหาการใช้งานของnetworksetup -listnetworkserviceorderคุณ เมื่อคุณเริ่มการแชร์อินเทอร์เน็ตคุณจะต้องเพิ่มฟังก์ชั่น NAT อย่างละเอียดมากขึ้นจากนั้นเพียงแค่ตั้งค่าบิตที่เปิดใช้งาน

NAT เปิด / ปิดด้วยบิต: -int 0= off -int 1= on

สิ่งเดียวที่เขียน/Library/Preferences/SystemConfiguration/com.apple.nat.plistด้วย

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

คือ

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

คุณจะต้องเปลี่ยนไฟล์ plist เป็นดังนี้:

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

ในขณะที่คุณสามารถเห็นไฟล์ NAT ของฉันได้อย่างง่ายดายอาจต้องปรับแต่งเล็กน้อยเพื่อให้เหมาะกับความต้องการของคุณ


0

ฉันใช้สคริปต์ต่อไปนี้เพื่อสลับการใช้อินเทอร์เน็ตร่วมกันในช่วงต้นปี 2011 MacBook Pro / 10.11.3 El Capitan ดังนั้นด้วยฮาร์ดแวร์ใหม่ที่คุณอาจหนีไปด้วยความล่าช้าที่สั้นลง มันใช้ความคิดจากสคริปต์ต่าง ๆ ที่โพสต์เพื่อจุดประสงค์นี้ (การโลคัลไลซ์การเปิด / ปิด wifi โดยใช้เมื่อnetworksetupใกล้System Preferencesเสร็จ

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

0

คุณอาจต้องการที่จะดูที่นี้ (อาจจะปิดหัวข้อสำหรับกองมากเกิน) คำถามและคำตอบที่: วิธีการเริ่มต้น / หยุดการแบ่งปันการใช้อินเทอร์เน็ต AppleScript

do shell script "/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.InternetSharing.plist" with administrator privileges

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.