스크립트에서 인터넷 공유를 시작 / 중지 하시겠습니까?


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 (네트워크 주소 변환 데몬)도 시작된다는 것입니다. 현재이 작업을 수행하는 방법을 조사 하면서이 프로세스를 시작 해야하는지 궁금합니다.이 프로세스를 시작하는 데 복잡한 인수가 필요한 것 같습니다.

답변:


19

CLI에서 인터넷 공유를 시작하려면

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

중지하려면 로드언로드로 변경하십시오 .

이 창을 실행할 때 준비 창이 열려 있으면 변경 사항이 즉시 적용되지 않지만 (UI는 업데이트되지 않음) 작동합니다.


이상한데 잠시 후 작동이 멈췄습니다. 명령을 실행 한 다음 pref 창을 열면 공유가 활성화 된 것을 볼 수 있지만 실제로는 연결이 공유되지 않습니다. pref 창에서 수동으로 중지하고 공유를 시작하면 문제없이 다시 작동합니다. 무엇이 잘못 될 수 있는지에 대한 단서가 있습니까?
Juan A. Navarro

2
켄의 영수증이 작동합니다! 하지만 ... 버그가 있습니다 (사냥 중). 다시 unload할 수 있으려면 30 초 후에 기다려야 load합니다. 좋은 점검 명령 중 하나는 ps ax | egrep '[ /](PID|boo|nat)'입니다.
dan

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
시스템 환경 설정 앱은 인증이 필요하지 않으므로 sudo / root를 사용하지 않고 어떻게 인증 할 수 있습니까?
Michele Dall'Agata 12

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의 질문의 제약 조건 내에 있습니다. "명령 줄이나 애플 스크립트 에서 인터넷 공유를 시작 / 중지하는 방법이 있습니까?" 다운 토팅은 정말 엄청난 답변을 위해 저장되어야합니다. 감사합니다
Philip Regan

1
따라서 "공식적인"공감대는 없습니다. :).

2
"작동하며 제약 조건 내에 있습니다"라는 새 사이트가 있어야한다고 생각합니다. rubegoldberg.stackexchange.com

2
dailywtf.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

실제로 라이온을 위해 일하지는 않습니다. 그것은 으르렁 성공 메시지를 표시하고 시스템 환경 설정에서 옵션을 토글하지만 WiFi 기호는 공유로 변경되지 않습니다 (그리고 다른 장치는 wifi가 공유되어 있음을 알 수 없으므로 켜져 있지 않다고 생각합니다 :(
alopix

2

간단한 변형으로 10.11.6에서 훨씬 더 나은 결과 (이미 구성된 공유 설정의 경우)를 보았습니다 ...

sudo launchctl start com.apple.NetworkSharing

sudo launchctl stop com.apple.NetworkSharing

각기.


0

가장 쉬운 방법 은 @Philip답변NetworkLocation 애플리케이션 을 결합하는 것입니다 . NL은 현재 위치를 알려주고 위치가 변경된 것을 감지하면 AppleScript를 자동으로 실행합니다.

랩톱을 사용하는 경우 소프트웨어가 필요하다고 생각합니다. 그렇지 않으면 위치를 변경할 때마다 항상 여러 설정을 수동으로 다시 설정해야하는 것은 PITA입니다.


Marco Polo ( symonds.id.au/marcopolo )와 비슷하지만 Marco Polo 스테로이드는 없습니다. :)
Ian C.

@Ian-이 페이지는 MP에 Snow Leopard의 알려진 문제가 있다고 말합니다. Google 그룹은 "는 마르코 폴로 프로젝트 자체가 죽은 것이 아니라 아주 천천히 개발되고 있습니다. 곧 새 버전을 기대하지 마십시오."라는 자식 저장소는 스테로이드 누군가와 잡기 될 수도처럼 2009 년 9 월은 나에게 소리 때문에 더 업데이 트를 보여줍니다 ... ;-)
도리

SL 에서 BlueTooth의 저장 에 문제가 있다고 말할 수 없습니다 . BT 활성화 / 비활성화 / 감지 기능을 사용하지 않고 오히려 훌륭하게 작동합니다. (그러나 취한 포인트)
Ian C.

0

게시 된 다른 애플 스크립트와 약간 다릅니다 (더 나은 방법으로 생각하지만 ...). 옵션이 있으면 도움이 될 수 있습니다.

 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>

보시다시피 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

MacosX에서 Wi-Fi 공유 끊임없는 끊임없는 해결 방법

나는 마침내 작동 하는 시스템을 발견했으며 Wi-Fi 공유가 덜 자주 끊어지면 1 분 안에 자동으로 복구 할 수 있습니다.

해결책은 ~/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>

알다시피, 매분마다 다음과 같은 간단한 스크립트가 실행됩니다. 이전 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 en1WiFi 공유 데몬이 무엇인가 를 새로 고치는 간단한 주기적 호출 (매 순간)을 생각합니다 . 그것이 무엇이든간에, wifi 공유가 실패하는 순간, 자체 할당 된 IP 주소를 잃은 다음 ipconfig getifaddr en1실패합니다. 그래서 스크립트는 wifi를 완전히 재설정하여 이전 상태를 재구성하고 wifi 공유를 복구합니다.

키보드, 마우스 또는 모니터가없는 MacMini에서 며칠 동안 작동했지만 이더넷에 연결되어있어 Wi-Fi 가제트가 세계에 액세스 할 수 있습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.