기계 제어 환경에 사용하는 Linux 시스템이 있습니다. 운영 요구 사항에는 다시 시작 또는 종료가 전용(종이) 노트북에 문서화되고 특정 절차가 컴퓨터에서 수행되는 한 다시 시작해도 괜찮다고 명시되어 있습니다.
reboot
및 shutdown
명령이 명령을 실행하는 사용자(대개 루트)에게 사용자 정의 메시지를 표시하기를 원합니다 . 메시지에서 사용자가 Enter 키나 다른 키를 눌러 메시지를 확인하도록 하면 도움이 될 것입니다.
웹에 있는 대부분의 문서는 로그인한 다른 사용자에게 표시할 메시지를 정의하는 데 중점을 두고 있으며, 향후 일정 기간 동안 종료가 예정되어 있습니다. 나는 거의 반대가 필요합니다. 메시지는 루트의 추적을 중지하고 로그와 함께 테이블로 보내야 합니다. ;-)
어딘가에 구성할 수 있나요?
답변1
다음과 같이 함수를 생성하여 reboot
루트의 쉘 시작에 넣을 수 있습니다:
reboot () {
echo "Did you enter this in the logbook? Type yes if you did."
read answer
case $answer in
(Yes | YES | yes | Y | y) command reboot "$@" ;;
(*) echo "Sorry mate, not going to space today.";;
esac
}
이는 ( 또는 기능을 제거하여 command reboot
) 쉽게 우회할 수 있으므로 1차 방어선으로만 사용해야 합니다.
약간 어렵지만 불가능하지는 않은 것은 바이너리의 이름을 바꾸고 reboot
call이라는 스크립트를 만드는 것입니다(질문에 긍정적으로 대답한 경우). 그러나 이 접근 방식은 다른 스크립트나 프로그램이 이를 호출/포크하고 질문에 답할 준비가 되어 있지 않은 경우 문제가 될 수 있습니다. 그들은 전화를 끊거나 이상한 방식으로 나쁜 행동을 할 수도 있습니다.reboot
the_real_reboot
reboot
답변2
이를 달성하는 방법은 종료 기능을 노출하는 인터페이스에 따라 다릅니다. 로컬 또는 원격 GUI가 없고 webmin과 같은 웹 인터페이스가 없고 가상 머신이나 컨테이너가 아닌 물리적 인스턴스인 경우 (아마도) ACPI 종료, 종료, 다시 시작, init, telinit에 대해서만 걱정하면 됩니다. systemctl 종료/다시 시작 명령.
ACPI 동작을 방해하지 않는 것이 좋습니다. 응급조치로 사용하십시오(플러그를 뽑기 전).
다른 사용자의 경우 모든 사용자에 대한 별칭이나 함수를 만듭니다(bash를 사용하는 시스템에서는 구성 파일이 아닌 bashrc에 있어야 합니다). 대부분의 Linux 배포판에서 기본 구성은 /etc에 공통 구성 파일과 bashrc가 있고 $HOME에 사용자별 파일이 있는 것입니다. 이 경우 공용 파일은 모든 사용자 파일에서 호출되므로 이러한 상황이 이미 존재하는지 확인하거나 구현하기가 쉽습니다.
Jens가 암시했듯이 bash 함수가 $PATH(또는 내장)의 명령과 동일한 이름으로 정의된 경우 셸에 이 명령을 입력하면 명령 대신 함수가 트리거됩니다. command
이는 명령 앞에 키워드를 붙여서 억제할 수 있습니다. 전체 경로를 지정하면 함수 대신 저장된 실행 파일도 실행됩니다.
별칭도 비슷하게 동작합니다. 함수와 별칭이 모두 있는 경우 어느 것이 실행될지는 모르겠지만 테스트하는 것은 간단합니다.
Jens의 코드와 관련하여 systemctl은 종료뿐만 아니라 다른 많은 작업에도 사용될 수 있으므로 몇 가지 추가 논리 검사를 추가해야 합니다. 또한 이를 구현하라는 요청을 받으면 성공 및 실패한 시도에 대한 일부 로깅을 추가합니다(참고자료 참조 man logger
).