Bắt đầu / dừng chia sẻ internet từ một kịch bản?


21

Có cách nào để bắt đầu / dừng chia sẻ internet từ dòng lệnh hoặc có thể là một tập lệnh apple không?

Có điều là tôi di chuyển xung quanh máy tính xách tay của tôi giữa nhà và nơi làm việc. Ở một nơi tôi có internet không dây (và do đó tôi phải vô hiệu hóa chia sẻ internet), và ở nơi khác tôi nhận internet từ cáp ethernet và thiết lập máy tính để chia sẻ internet với các thiết bị khác bằng cách tạo một mạng không dây nhỏ.

Nhưng sẽ hơi tẻ nhạt khi phải truy cập Tùy chọn hệ thống và bắt đầu / dừng chia sẻ internet mỗi khi tôi chuyển đổi vị trí, vì vậy tôi muốn có một lệnh hoặc tập lệnh nhanh để khởi chạy và thực hiện chuyển đổi theo yêu cầu.

Bất kỳ gợi ý hoặc ý tưởng?


Mankoff, khi tôi chạy đề xuất của bạn: sudo launchctl load -w /System/L Library / LaunchDaemons / com.apple.INETShared.plist dường như chạy tốt và ngay cả các tùy chọn chia sẻ gui cũng được cập nhật chính xác khi được làm mới đang làm việc. Nếu tôi chạy lại lệnh, nó thậm chí không thành công vì nó nghĩ rằng nó đã được tải. Ngoài ra, nếu tôi chạy lệnh "trên cùng" để xem quy trình đang chạy, tôi không thấy "InternetShared" nhưng nếu tôi khởi động nó trong gui tùy chọn, tôi sẽ thấy quá trình "InternetShared" thực sự đang chạy và kết nối hoạt động. Bất cứ ý tưởng tại sao tôi là h

Không chắc chắn tại sao bạn có được hành vi đó. Tôi thấy "InternetShared" ở trên cùng (hoặc dễ dàng hơn, ps aux | grep -i internet ).

Tôi đang chạy OS X 10.6. Nếu bạn có một phiên bản khác, có lẽ đó là lý do tại sao ...

Ngoài ra, đây có lẽ nên là một nhận xét cho câu trả lời của tôi, không phải là một câu trả lời. Có thể muốn xóa câu trả lời ...

Vâng, chắc chắn đây sẽ là một nhận xét cho câu trả lời của bạn, nhưng vì một số lý do tôi không thể nhận xét về câu trả lời trừ khi ai đó đã đưa ra nhận xét. Có lẽ bởi vì tôi là một người dùng mới. Tôi đang chạy OS X 10.6.4. Một điều khác tôi nhận thấy là khi tôi khởi chạy chia sẻ internet trong gui ưu tiên là quy trình natd (daemon dịch địa chỉ mạng) cũng được bắt đầu. Tôi tự hỏi nếu tôi cũng cần khởi chạy quá trình này, hiện đang điều tra làm thế nào để làm điều này, dường như có những lập luận phức tạp cần thiết để bắt đầu quá trình này.

Câu trả lời:


19

Để bắt đầu Chia sẻ Internet từ CLI:

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

Để dừng, thay đổi tải để dỡ .

Lưu ý rằng nếu bạn có khung pref mở khi bạn chạy, bạn sẽ không thấy thay đổi có hiệu lực ngay lập tức (UI sẽ không cập nhật), nhưng nó vẫn hoạt động.


Lạ thật, sau một lúc, nó ngừng hoạt động. Nếu tôi chạy lệnh và sau đó mở khung pref, tôi thấy rằng chia sẻ được bật, tuy nhiên kết nối không thực sự được chia sẻ. Nếu tôi dừng thủ công và bắt đầu chia sẻ trên khung pref, thì nó hoạt động trở lại mà không gặp vấn đề gì. Bất kỳ manh mối về những gì có thể sai?
Juan A. Navarro

2
Biên lai của Ken hoạt động! Nhưng ... có một lỗi (Tôi đang săn lùng). Bạn phải để lại độ trễ 30 giây sau khi unloadcó thể thực hiện loadlại. Một lệnh kiểm tra tốt là ps ax | egrep '[ /](PID|boo|nat)'.
dan

1
Không hoạt động vào ngày 10.11.2 El Capitan:/System/Library/LaunchDaemons/com.apple.InternetSharing.plist: No such file or directory
Yohaï Berreby

3
thử: /System/Library/LaunchDaemons/com.apple.NetworkSharing.plist thay;)
guerrerocarlos

1
Vì ứng dụng Tùy chọn hệ thống không yêu cầu xác thực, làm thế nào chúng ta có thể làm điều đó mà không cần sử dụng sudo / root?
Michele Dall'Agata

4

Một cách để làm điều này là theo kịch bản GUI GUI Tùy chọn hệ thống không có bất kỳ hỗ trợ Applescript nào theo mặc định.

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
Có lẽ, nhưng nó hoạt động và câu trả lời nằm trong giới hạn của câu hỏi của OP: "Có cách nào để bắt đầu / dừng chia sẻ internet từ dòng lệnh hoặc có thể là một tập lệnh apple ?" Downvote thực sự nên được lưu cho các câu trả lời thực sự nghiêm trọng. Cảm ơn
Philip Regan

1
Do đó không có downvote "chính thức". :).

2
"

2
Đó không phải là những gì thed Dailywtf.com dành cho? ;-)
Philip Regan

1
@Juan: Chỉ cần báo trước rằng nếu Apple thay đổi bố cục của Tùy chọn hệ thống và ngăn Chia sẻ với bản nâng cấp, thì tập lệnh của tôi cũng có khả năng thực sự bị phá vỡ vì kịch bản GUI phụ thuộc vào các tham số rất nghiêm ngặt.
Philip Regan

2

Tôi lấy một gợi ý từ câu trả lời của mankoff và gói nó trong một AppleScript. Tôi đang sử dụng tập lệnh này từ Automator để tôi có thể dễ dàng sử dụng nó như một dịch vụ và cung cấp cho nó một phím tắt.

Chuyển đổi chia sẻ 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

Nó không thực sự hoạt động trên Lion đối với tôi. Nó hiển thị thông báo thành công gầm gừ và bật tùy chọn trong tùy chọn hệ thống nhưng biểu tượng WiFi không thay đổi thành chia sẻ (và các thiết bị khác không thể thấy rằng wifi được chia sẻ, vì vậy tôi nghĩ rằng nó không bật :(
alopix

2

Tôi đã có kết quả tốt hơn nhiều (đối với thiết lập chia sẻ đã được định cấu hình) vào ngày 10.11.6 với các biến thể đơn giản ...

sudo launchctl start com.apple.NetworkSharing

sudo launchctl stop com.apple.NetworkSharing

tương ứng.


1

Giải pháp dứt khoát cho việc chia sẻ wifi liên tục bị hỏng trong MacosX

Tôi đã tìm thấy một hệ thống cuối cùng hoạt động và khi ít bị gián đoạn chia sẻ wifi, nó sẽ tự động khôi phục hệ thống trong một phút.

Giải pháp là một ~/Library/LaunchAgents/com.me.wifisharingup.plistdaemon với nội dung tiếp theo:

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

Bạn có thể thấy, mỗi phút nó chạy đoạn script đơn giản theo sau. Hãy cẩn thận làm cho bản gốc trước đó được sở hữu bởi root và khởi chạy nó với:

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

Kịch bản mà nó khởi chạy mỗi phút (đừng quên làm cho nó có thể thực thi được) là:

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

Tôi nghĩ rằng cuộc gọi đơn giản định kỳ (mỗi phút) để ipconfig getifaddr en1làm mới một cái gì đó trong daemon chia sẻ wifi. Dù là gì đi nữa, bất cứ lúc nào việc chia sẻ wifi không thành công, nó sẽ mất địa chỉ IP tự gán, và sau đó ipconfig getifaddr en1, vì vậy, tập lệnh của tôi hoàn toàn đặt lại wifi, khiến nó xây dựng lại trạng thái trước đó và khôi phục việc chia sẻ wifi.

Nó đã hoạt động trong nhiều ngày cho đến nay trong MacMini mà không cần bàn phím, chuột hoặc màn hình, mà chỉ cắm vào Ethernet và cho phép các thiết bị wifi của tôi truy cập vào thế giới.


0

Cách thực sự dễ dàng là kết hợp câu trả lời của @ Philip với ứng dụng NetworkLocation . NL có thể cho biết bạn đang ở đâu và tự động chạy AppleScript khi nó cảm nhận được bạn đã thay đổi địa điểm.

Tôi nghĩ đó là phần mềm bắt buộc nếu bạn có máy tính xách tay khác, đó là PITA để luôn phải đặt lại thủ công một số cài đặt bất cứ khi nào tôi thay đổi vị trí.


Âm thanh như Marco Polo ( symonds.id.au/marcopolo ) nhưng không có steroid Marco Polo. :)
Ian C.

@Ian - Trang đó nói rằng MP có vấn đề với Snow Leopard. Các Tập đoàn Google cho biết "dự án Marcopolo là chưa chết, cho mỗi gia nhập, nhưng nó đang được phát triển rất chậm. Đừng mong đợi một phiên bản mới sớm." Các kho git chương trình không có bản cập nhật kể từ tháng Chín năm 2009. Âm thanh với tôi như các steroid có thể bắt kịp với một ai đó ... ;-)
Dori

Không thể nói rằng tôi có bất kỳ vấn đề nào với nó trên SL lưu cho BlueTooth. Tôi chỉ không sử dụng tính năng bật / tắt / phát hiện BT và nó hoạt động khá tuyệt vời. (Nhưng lấy điểm)
Ian C.

0

Hơi khác một chút so với các bản applescript khác được đăng (Tôi nghĩ theo cách tốt hơn nhưng trừ). Có lựa chọn đôi khi có thể giúp đỡ.

 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

Do giải pháp kịch bản GUI được đăng trước đây yêu cầu người dùng quốc tế điều chỉnh tên cửa sổ và nút, tôi đã đưa ra một phiên bản hoạt động với bất kỳ ngôn ngữ hệ thống nào. Nó cũng hoạt động cho tùy chọn chia sẻ khác và cung cấp phản hồi cục bộ về trạng thái chia sẻ. Tôi sử dụng hai dịch vụ Automator khác nhau dựa trên điều này, một để chuyển đổi chia sẻ tệp và một để chuyển đổi chia sẻ 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

0

Trước / sau bất kỳ cấu hình nào, giao diện hoặc giao diện liên quan đến chia sẻ cần được tắt / bật với:

networksetup -setairportpower en1 off

sau đó ( networksetup -setairportpower en1 on)

Wifi của tôi đã được liệt kê là en1, để tra cứu việc sử dụng của bạn networksetup -listnetworkserviceorder. Hơn nữa, khi bắt đầu chia sẻ internet, bạn sẽ cần thêm chức năng NAT chi tiết hơn sau đó chỉ cần thiết lập bit được kích hoạt.

NAT được bật / tắt với bit: -int 0= off -int 1= on

Điều duy nhất được viết /Library/Preferences/SystemConfiguration/com.apple.nat.plistbằng

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>

Bạn sẽ cần phải thay đổi tập tin plist của mình để trông giống như sau:

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

Như bạn có thể thấy tệp NAT plist của tôi có thể cần một chút tùy chỉnh để phù hợp với nhu cầu của bạn.


0

Tôi sử dụng tập lệnh sau để chuyển đổi chia sẻ internet trên MacBook Pro / 10.11.3 El Capitan đầu năm 2011, vì vậy với phần cứng mới hơn, bạn có thể thoát khỏi sự chậm trễ ngắn hơn. Nó thông qua các ý tưởng từ một số tập lệnh được đăng cho mục đích này (nội địa hóa, bật / tắt wifi bằng cách sử dụng networksetup, đóng System Preferenceskhi hoàn thành).

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


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

Điều này có chuyển đổi chia sẻ?
Greenonline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.