WIFI 어댑터를 다시 연결하는 방법을 찾았습니다.이 게시물. 그러나 구현하기 전에 어떻게 작동하는지 알아보고 싶습니다.
- 로 이동하여
/etc/ifplugd/action.d/
파일 이름ifupdown
을ifupdown.original
.- 그런 다음 다음을 수행하십시오
cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
.- 마침내:
sudo reboot
- 언제
/etc/ifplugd/action.d/ifupdown
전화하나요? /etc/wpa_supplicant/ifupdown.sh
일반인의 관점에서 볼 때 이 스크립트가 본질적으로 수행하는 작업은 호출될 때 매우 복잡해 보입니다.- 1~3단계를 따르면 WIFI 작동을 방해하는 다른 예상치 못한 문제가 발생합니까? 접근하기 어려운 위치에 키보드와 모니터를 배치하지 않고도 SSH를 통해 Raspberry PI에서 이 기능을 구현하려고 합니다.
온갖 정보를 인터넷 검색해 보았지만 조금 헤매었습니다!
답변1
ifplugd는 이더넷 커넥터의 제거 또는 재연결을 감지하도록 설계되었습니다. 연관된 디렉토리 /etc/ifplugd/action.d/는 커넥터가 삽입(또는 제거)될 때 호출되는 스크립트를 호스팅합니다.
절차의 2단계에서는 커넥터가 삽입(또는 제거)되고 연결이 WPA로 간주될 때 wpa 연결이 (재)협상되도록 합니다. 설명하는 이름 바꾸기/복사 프로세스는 기존 ifupdown 스크립트에서 수행된 기존 처리를 비활성화합니다. 이는 아마도 무시할 수 있는 수준입니다. 기존 ifupdown 스크립트(예: 끝 부분)에 /etc/wpa_supplicant/ifupdown.sh를 추가하여 /etc/wpa_supplicant/ifupdown.sh를 호출하는 것을 고려할 수도 있지만 이는 기존 스크립트에 이미 무엇이 있는지 아는지에 따라 달라집니다. 뭔가(보통 간단합니다).
커넥터의 물리적 연결 끊김을 처리하는 대신 Wi-Fi 연결이 끊어진 경우에만 재협상하려는 경우 다음 접근 방식을 사용하는 것이 좋습니다.
https://raw.githubusercontent.com/dweeber/WiFi_Check/master/WiFi_Check
스크립트는 강력하고 대부분 무해하며 작업을 안정적으로 완료해야 합니다.
답변2
간결한 버전
Dudk는 이미 답변했습니다. 이 디렉토리는 연결되거나 연결 해제된 작업을 시스템에 알려주는 스크립트용입니다.
문제의 스크립트를 내가 어떻게 이해했는지 설명하려면 "긴 버전"을 참조하세요. 기본적으로 몇 가지 검사를 실행하고 일부 외부 기능을 로드한 후
start
일련의 명령을 실행해야 하는지stop
또는 오류가 발생하여 종료되는지 확인합니다 .아, 그렇습니다. Raspberry Pi가 별로 좋아하지 않는 방식으로 네트워크 구성을 터치하면 원격 액세스가 차단될 가능성이 높습니다. 과거에 RPi의 네트워크 구성을 대략적으로 수정했기 때문에 새로 설치하는 것이 더 쉬울 것입니다. 쉽게 로그인할 수 있는 로컬 위치로 Raspberry Pi를 일시적으로 이동하는 것이 좋습니다.
긴 버전
내 RPi에서 이 파일을 보면 주석이 잘 달린 것 같고 외부 함수 호출에는 많이 사용되지 않습니다. 하지만 당신이 요구하는 것은 일반인의 용어이므로 당신이 나와 같은 RPi 사용자인 것처럼 보이기 때문에 이러한 유형의 스크립트를 어떻게 이해하게 되었는지 설명하려고 노력할 것입니다(헤드리스 원격 서버 설정). 확인하고 싶을 수도 있습니다 위의 내용에 대해 내가 쓴 것RPiStack교환서버 요구 사항에 대한 다른 유용한 트릭이 있을 수 있으므로 숨겨진 WiFi 네트워크에 자동으로 다시 연결하는 데 사용됩니다.
귀하의 질문에 대한 답변을 돕기 위해 다음은 몇 가지 쉘 스크립트 구문 설명입니다.
쉘 ~.sh
스크립트 에서는흔한다음과 같이 정의된 함수를 찾으세요.
function_name () {
echo "doing stuff for function_name"
}
그런 다음 function_name
스크립트에서 후자를 통해 호출되고 때로는 다른 함수에서 호출됩니다. 함수, 스크립트 파일 및 if 문은 단순히 실행할 명령 목록입니다. 함수의 경우 {
및 사이에 있는 것을 실행하고 }
, 명령문의 경우 if
및 사이에 있는 것을 실행하며, 인스턴스의 경우 조건에 따라 또는 문 내에 있는 것을 사용합니다.then
fi
else
elif
if
프로파일링 중인 파일에는 이라는 이름의 함수가 있고 다른 파일에 정의된 함수도 있습니다. "이 다른 함수는 어떤 파일에 정의되어 있나요?" 또는 "스크립트 a가 파일 b에서 함수를 로드하는지 어떻게 확인하나요? do_start
" do_stop
?" 우리가 먼저 대답해야 할 두 가지 질문은 다음과 같습니다.
48
해당 줄 주위에 /etc/wpa_supplicant/ifdown.sh
주석 줄이 있고 (예: #
simble로 시작하는 줄; 스크립트 침입자에 의해 무시됩니다...대부분의 경우) source functions
다음 줄의 의도된 효과를 미묘하게 표시합니다 ~
# source functions
if [ -f /etc/wpa_supplicant/functions.sh ]; then
. /etc/wpa_supplicant/functions.sh
else
exit
fi
이는 파일이 존재한다고 가정하기 전에 파일이 존재하는지 확인하는 스크립트 동작의 좋은 예입니다.
첫 번째 단계 if [ -f
는 정의된 파일 경로에서 파일을 확인하는 것입니다. 존재하는 경우 then
파일 내용은 경로에 의해 정의된 파일을 통해 로드됩니다(명령의 약칭은 이지만 다른 명령에 의해 잘못 설치될 수 있으므로 스크립트에서는 사용하지 않지만 다른 방향으로 전환했습니다) . 다음은 파일을 찾을 수 없는지 확인하고 스크립트 상태로 종료합니다. 그런 다음 문은 첫 번째 문이 실패할 경우 수행할 작업을 닫는 것으로 끝납니다. 즉, /etc/wpa_supplicant/functions.sh가source
source
.
cp
else
exit 0
0
if
fi
아니요존재하는 경우 종료하고, 그렇지 않은 경우 이러한 함수를 로드하고 처리를 계속합니다. 값이나 파일이 존재하는지에 대한 이중 확인은 스크립트뿐만 아니라 다른 스크립트 전체에서 반복되어 -f
파일 확인, -n
문자열 길이 확인, -x
파일 존재 확인뿐만 아니라 파일. 스크립트를 실행하는 사용자에게 정의된 파일에 대한 실행 권한이 있는 경우 -s
파일이 비어 있는지 확인하고, -n
문자열이 비어 있지 않거나 null
값이 아닌지 확인하고, =
명령문의 문자열(또는 값)을 비교합니다. Linux의 쉘 및 bash 스크립트에 있는 명령문에 대한 다른 내용도 볼 수 있지만 if
이는 나중에 다루겠습니다. 다른 것도 있습니다if
elif
기술if
문 외에도 ||
"or", &&
"and", "not" !
등의 연산자를 사용할 수도 있습니다 55
~
# quit if executables are not installed
if [ ! -x "$WPA_SUP_BIN" ] || [ ! -x "$WPA_CLI_BIN" ]; then
exit 0
fi
~ 간단히 말해서 파일이 다음 $WPA_SUP_BIN
과 같이 정의된 경우아니요실행 파일 또는 정의된 파일 $WPA_CLI_BIN
은 다음과 같습니다.아니요0
그런 다음 실행 파일은 추가 처리 없이 상태 표시와 함께 종료됩니다 . 처음에는 복잡해 보일 수 있지만 보다 사용자 친화적인 구문을 사용하여 큰 소리로 읽으면 간단한 내용을 처음 배울 때 도움이 될 수 있으며, #
복잡한 내용에 메모를 추가하면 나중에 해당 주제를 배우거나 다시 돌아올 때 매우 도움이 됩니다. .
또한 내용이 확실하지 않은 경우 내부 소스에서 파일을 확인해야 합니다 ifupdown.sh
. 그런 다음 더 알고 싶은 기능 이름을 nano /etc/wpa_supplicant/functions.sh
사용 ^w
하거나 검색하는 것이 좋습니다 . 왜냐하면 Ctrl+w
이 스크립트를 호출하는 모든 퀘스트와 대부분의 퍼즐 내용 functions.sh
사이에서 발견되기 때문입니다.
135
이제 명령문이 시작 되는 "둥근 선"으로 인해 상황이 조금 다르게 보이기 시작합니다. case
이러한 유형의 명령문은 디코딩 작업을 지원하는 데 사용할 수 있는 특정 구조를 갖습니다.
case $some_variable in
start)
echo "The word [start] was detected in \$some_variable"
;;
stop)
echo "The word [stop] was detected in \$some_variable"
;;
*)
echo "The word [$some_variable] was detected in \$some_variable but not understood"
;;
esac
위의 예에서는 다른 명령문과 마찬가지로 본질적으로 case
정의된 키워드의 내용을 검색합니다. 즉, 키워드가 발견되면 후행 및 선행 키워드 사이에 있는 명령을 실행합니다. 이 명령은 다음에서 찾은 단어를 구분하는 데 사용됩니다. 다양한 키워드에 대해 다양한 조치를 취합니다. 일부 스크립트에서는 루프 내에서 이러한 명령문을 찾을 수 있지만 이는 또 다른 이야기입니다.$some_variable
start
stop
)
;;
case
for
case
스크립트 의 명령문 에 대해 ifupdown.sh
먼저 변수의 또는 상태를 일치시키고 start
값을 사용하여 명령 시퀀스를 호출해야 하는지 여부를 일치시킵니다.stop
$MODE
$PHASE
pre-up
post-up
또는또는 명령 시퀀스를 호출해야 하는지 여부 pre-down
. 둘 다 감지 되지 post-down
않으면 오류가 기록되고 인쇄되며 스크립트는 오류 상태로 종료됩니다.start
stop
1