저는 리눅스 우분투 16.04를 사용하고 있습니다.
이번 챌린지에서는 Linux 셸에서 일부 명령을 제거하고 싶습니다.
특히 이 명령을 제거하고 싶습니다 exit
.
사용자가 이 명령을 사용하여 셸을 종료하려고 하면 불가능하고 일부 메시지가 전송될 수도 있기를 바랍니다.
어떻게 할 수 있는지 아시나요?
다음과 같은 프로그램을 검색했습니다 exit
.
find / -name exit
그러나 디렉토리만 찾습니다.
/usr/src/linux-headers-4.13.0-41-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-41-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.13.0-43-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-43-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.13.0-36-generic/include/config/have/exit
/usr/src/linux-headers-4.13.0-36-generic/include/config/have/irq/exit
/usr/src/linux-headers-4.15.0-43-generic/include/config/have/exit
/usr/src/linux-headers-4.15.0-43-generic/include/config/have/irq/exit
편집하다:
나는 읽었다여기trap
이렇게 사용하는 것에 관해서는 trap "ENTER-COMMAND-HERE" EXIT
시도해 보았지만 trap "sh" EXIT
여전히 쉘이 있습니다.
답변1
또한테덴이 뭐라고 했어?exit
(기본적으로 별칭이나 함수로 특수 내장 명령을 무시함) bash
쉘을 사용하면 다음도 수행할 수 있습니다.장애를 입히다내장 명령.
exit
내장 명령을 비활성화하려면 :
enable -n exit
다시 활성화하려면 enable
내장 명령도 비활성화하십시오.
enable -n enable
terdon의 답변과 마찬가지로 이는 시스템 전체 쉘 시작 파일의 일부로 구현되지 않는 한 현재 쉘 세션에만 영향을 미칩니다.
개인적으로 나는 거의 독점적으로 Ctrl+D종료를 사용합니다.인터렉티브쉘 세션. 에서 이 문제를 피하려면 큰 정수로 bash
설정 IGNOREEOF
하고 읽기 전용으로 만드십시오.
readonly IGNOREEOF=1000
이로 인해 1000번을 누른 후에 쉘이 Ctrl+D종료됩니다.
넌 아직 할 수 있어죽이다예를 kill -s HUP "$$"
들어 쉘. 쉘이 끊김 신호를 무시하도록 할 수 있습니다
trap '' HUP
사용자가 signal 을 사용하여 쉘을 강제로 종료하는 것을 방지할 수 있는 방법은 없지만 KILL
위와 같이 내장 기능을 제거 kill
하고 대체 쉘 함수 또는 별칭을 설치할 수 있지만 여전히 사용하기 쉽습니다 /bin/kill
.
enable -n kill
kill () { echo 'kill: Operation not permitted' >&2; }
다음을 통해 쉘을 종료할 수도 있습니다.
set -e
false
...내장 기능을 비활성화하지 않는 한 분명히 그렇습니다 set
. 하지만 이는 너무 지나친 일입니다. 덜 분명한 여러 가지 방법으로 종료를 방지하려고 시도하는 것입니다(이 중 일부는 이를 방지하려면 소스 bash
코드를 수정해야 함). .
문제
trap 'bash' EXIT
현재 쉘이 종료될 때 새 쉘이 생성된다는 것입니다. 그러나 새 쉘은 트랩을 쉘 시작 파일의 일부로 설치하지 않은 경우 아직 트랩을 설정하지 않았기 때문에 쉽게 종료됩니다.
이것은 당신을 방해하지 않습니다그만두다쉘, 엄밀히 말하면 쉘이 실제로 실행될 때까지 트랩이 실행되지 않기 때문입니다.그만두다. 그것이 당신에게 주는 것은 새로운 껍질입니다.
답변2
실행 파일 이 없습니다 exit
. 이것은 쉘의 내장 명령 중 하나입니다(어떤 쉘인지 말하지 않았으므로 가정합니다 bash
). 따라서 이를 완전히 제거하는 유일한 방법은 쉘의 소스 코드를 편집하고 다시 컴파일하는 것입니다(그러나 다음을 살펴보십시오.@Kusalananda의 답변더 나은 접근 방식을 위해).
대안으로 다음과 같은 것을 추가할 수 있습니다 /etc/bash.bashrc
.
alias exit='echo "You can check-out any time you like, but you can never leave!"'
하지만 *nix에 대해 조금이라도 아는 사람이라면 누구나 이 문제를 쉽게 피할 수 있습니다.