때로는 전화를 통해 연결해야 할 때도 있습니다. 문제는 이 작업을 수행할 때 임의의 개인 IP를 네트워크 게이트웨이로 사용한다는 것입니다. Google은 귀하가 아니라 자신들이 귀하의 휴대전화를 소유하고 있다고 생각하는 것 같습니다. 따라서 저는 이러한 행동을 통제할 수 없습니다. 또한 프록시 응용 프로그램을 실행합니다. 제가 하고 싶은 것은 자동으로 설정하는 것입니다.
다음 스크립트가 있습니다.
#!/usr/bin
router=$(route -n | awk '{print $2}' | grep 192.168)
sed "s/\[PROXY-IP\]/$router/g" ~/pac/wpad.template > ~/pac/wpad.dat
export http_proxy="http://$router:8080"
export https_proxy="https://$router:8080"
export ftp_proxy="http://$router:8080"
그런데 환경변수를 확인해 보니 아직 설정이 되어 있지 않은데 wpad.dat가 업데이트 되어 있습니다. 그래서 스크립트가 실행되었다는 것을 알고 있습니다.
쉘 스크립트는 시스템 환경 변수에 액세스하지 않는다는 것을 배웠습니다. 그냥 로컬 복사본입니다. 이러한 변수를 시스템 전체에서 설정하는 방법이 있습니까? 내가 찾을 수 있는 유일한 조언은 네트워크가 변경될 때마다 재부팅해야 한다는 것입니다. 이것은 매우 해로울 것입니다. 기본적으로 스크립트를 .bashrc로 하드코딩합니다.
소스 명령을 살펴봤지만 이것은 소위 스크립트에서만 작동하는 것 같습니다. 이러한 변경 사항은 시스템 및 사용자 변수로 전파되지 않습니다. 스크립트를 호출하는 모든 소스는 환경 변수의 자체 로컬 복사본에서 실행되기 때문에 어떻게 수행하는지 모르겠습니다.
답변1
WPAD 파일 업데이트는 Firefox와 같은 GUI 브라우저에서 제대로 작동합니다(사용하도록 구성되어 있다고 가정).
lynx
또는 훨씬 더 어려운 wget
명령줄 도구 :curl
- PAC 또는 WPAD 파일을 사용할 수 없습니다.
- 전역적으로는 말할 것도 없고 프로세스의 부모 내에서 환경 변수를 변경할 수도 없습니다.
- 그리고 파일이 변경될 때 파일을 리소스로 지정하도록 쉘에 지시할 방법이 없습니다.
거기 빼고는예마지막 항목을 완성하는 방법. bash
적어도 안으로. PROMPT_COMMAND 변수를 사용하여 bash
쉘 프롬프트가 표시될 때마다 스크립트를 가져오도록 지시할 수 있습니다. 예를 들어:
*_proxy 변수 설정을 파일로 출력하도록 스크립트를 수정하세요. 예를 들어 /var/tmp/proxy-settings.sh
확장자가 chmod a+r
.
그것은 다음과 같습니다:
cat <<__EOF__ > /var/tmp/proxy-settings.sh
export http_proxy="http://$router:8080"
export https_proxy="https://$router:8080"
export ftp_proxy="http://$router:8080"
EOF
그런 다음 파일을 가져오고(변경된 경우) 다음과 같이 저장하는 쉘 스크립트를 작성하십시오 /usr/local/bin/update-proxy-vars.sh
. 다시 말하지만, 이는 단어( )로 읽을 수 있어야 합니다 chmod a+r
. 실행되지 않고 가져오기 때문에 실행 가능하지 않아도 됩니다.
# each individual shell needs it's own timestamp, because each one will
# read the proxy settings file at different times.
mkdir -p /tmp/.proxy-timestamps
tsfile="/tmp/.proxy-timestamps/time/var/tmp/proxy-settings.sstamp.$$"
if [ -e "$tsfile" ] ; then
timestamp=$(< "$tsfile")
fi
# get the timestamp of the proxy-settings.sh file
# not all versions of `stat` can do this, and those that do
# have different and incompatible options. The following works
# for GNU `stat`.
proxy_timestamp=$(stat -c %Y /var/tmp/proxy-settings.sh)
# has the timestamp changed? if so, source the file.
if [ "$timestamp" != "$proxy_timestamp" ] ; then
. /var/tmp/proxy-settings.sh
echo "$proxy_timestamp" > "$tsfile"
fi
마지막으로 프롬프트가 표시될 때마다 이 스크립트를 가져오도록 PROMPT_COMMAND를 설정합니다.
PROMPT_COMMAND='. /usr/local/bin/update-proxy-vars.sh'
또한 rm -f /tmp/.proxy-timestamps/timestamp.$$
bash가 종료될 때 정리하려면 ~/.bash_logout 스크립트를 실행해야 합니다.
제 생각에는 이것은 추악하고 성가신 해킹이며 프롬프트가 표시될 때마다 실행 해야 하기 때문에 속도가 느려집니다 bash
(애초에 속도 악마는 아닙니다) . update-proxy-vars.sh
명령이 실행될 때마다. 또는 아무 명령도 입력하지 않고 Enter 키를 누르기만 하면 됩니다. 메시지가 표시될 때마다 이 스크립트를 실행하고, 타임스탬프 파일을 읽고, 실행하고 stat
, 타임스탬프를 비교하고, 타임스탬프가 변경된 경우 다른 파일을 가져와야 합니다.
/var/tmp/proxy-settings.sh
변경 여부에 관계없이 매번(존재하는 경우) 소스를 가져오고 타임스탬프에 대해 걱정하지 않는 것이 더 빠를 수 있습니다.
그냥 설정하세요:
PROMPT_COMMAND='[ -e /var/tmp/proxy-settings ] && . /var/tmp/proxy-settings.sh'
하지만 그것은 효과가 있고 그게 전부입니다. 그렇죠?
/var/tmp/proxy-settings.sh
또는 파일이 필요한 모든 셸에서 와 같이 파일을 수동으로 가져오는 것을 기억하는 습관을 들일 수 있습니다 .
$PS1
이 변수(예 ash
: dash
, , zsh
, 등)를 사용하여 다른 셸에서 ksh
동일한 작업을 수행 할 수 있습니다. 그러나 PROMPT_COMMAND를 사용하는 이 버전은 충분히 보기 흉하고 해킹적입니다. 그렇게 하는 것이 PS1
더 나쁠 것입니다 .
답변2
파일에 대한 소스 호출을 수행해야 합니다(파일 호출 전 지점). . ./myfile.sh
일반적으로 파일은 상위 환경의 복사본만 가져오며 환경의 하위 프로세스에 대한 세션 기회를 닫은 후에는 손실됩니다.