추가 읽기

추가 읽기

이것은"Linux는 쉘 없이도 작동할 수 있나요?"하지만 다른 문제에 방해받지 않고 껍질을 제거하는 메커니즘에만 집중하세요.

동일한 시스템을 고려해보세요. Ubuntu Linux Server LTS 버전 16에는 최종 사용자(또는 실제로 관리자) 로그인이 필요 없이 systemd 서비스로 실행되는 컴파일된 바이너리로 구성된 사용자 지정 시스템이 있습니다.

껍질을 제거하는 방법? 그렇게 하면 어떤 결과가 발생합니까? Bourne Identity 케이스를 제거하시겠습니까? 제거된 /bin/sh시스템은 얼마나 더 실행될 수 있습니까?

참고로 이 질문은아니요사람들이 이 작업을 수행하려는 이유, 터미널 사용, 시스템 보안 방법 또는 사용할 수 있는 명령 사용에 관심을 가지십시오.도망가다껍데기. 여기서 초점은 껍질, 제거 메커니즘 및 결과에 있습니다.

답변1

이는 상당히 복잡한 고려 사항입니다. 첫 번째:

  • 단일 Unix 사양이라고도 알려진 POSIX 표준은 일관된 시스템이 sh특정 셸 언어를 구현하는 호출 가능한 프로그램을 갖도록 보장합니다. 주어진 실제 시스템에서는 sh실제로 Z 쉘, Almquist 쉘, Korn 쉘, Bourne Again 쉘 등과 같은 실제 쉘 중 하나이며 일반적으로 이름으로 호출되는 것으로 인식됩니다 sh.POSIX 모드.
  • 10여년 전, 데비안과 우분투 커뮤니티는 POSIX 모드에서도 Bourne Again 셸이 제공하는 확장에 대한 운영 체제의 다양한 부분의 의존성을 제거하기 위해 열심히 노력했습니다. 인터프리터로 지정된 스크립트는 #!/bin/sh소위 말하는 스크립트에 의존할 필요가 없습니다.바시즘, 반대로 Bashism을 사용하는 스크립트는 Bourne Again 쉘을 인터프리터로 명시적으로 선언해야 합니다 sh.
  • systemd 사람들은 2011년에 시스템 및 서비스 관리의 일부로 셸 스크립트 사용을 제거하는 것을 목표 중 하나로 삼았습니다.

껍질을 제거하는 방법은 다소 간단합니다. 하나는 ash, bash, posh, , 등과 같은 패키지를 제거합니다 . 예를 들어 패키지 관리 도구를 사용합니다. 어려운 부분은 그 중 두 개가 "필수"로 표시되어 있다는 것입니다 mksh. 이는 다른 패키지가 명시적으로 없이도 존재한다고 가정할 수 있음을 의미합니다. 이에 대한 종속성을 선언하고 패키지 관리자의 의지에 따라 의도적으로 제거하는 것은 간단한 일이 아니며 실제로 제거할 것인지 확인하기 위해 추가 과정을 거쳐야 합니다.pdkshtcshdashaptitudedashbash

그렇게 하면 문제가 발생합니다.

  • 데비안과 우분투 사람들의 작업 덕분에 이제 다음을 수행하는 스크립트가 있습니다.분명히#!/bin/bash스크립트 인터프리터로 선언되었습니다 . Bourne Again 쉘이 제거되면 Debian Almquist 쉘이 남아 있어도 해당 스크립트는 작동하지 않습니다.
  • Debian Almquist 쉘을 제거하면 POSIX 호환 쉘에 의존하는 스크립트가 실행되지 않습니다.
  • Debian Almquist 쉘이 제거되면 POSIX 호환 쉘에 의존하는 컴파일된 프로그램은 더 이상 실행되지 않습니다. 이러한 프로그램은 system()라이브러리 함수나 명시적 유틸리티 호출과 execvpe()같은 작업을 수행합니다 sh.

그러므로:

  • 응용 프로그램이 실행되지 않을 수 있습니다. 예, 쉘 스크립트가 아닌 컴파일된 언어로 작성되었습니다. 이는 애플리케이션 프로그래머가 여기저기서 이상한 쉘 프로세스를 빠르게 분기하고 실행하는 것을 막지 못합니다.
  • 시스템 프로그램이 실행되지 않을 수 있습니다. 같은 이유로.
  • 시스템 프로그램은 실제로 쉘 스크립트이기 때문에 실행되지 않을 수 있습니다.
    • 시작 및 종료 프로세스에서 쉘 스크립트 제거가 완료되지 않았습니다. 많은 서비스가 여전히 van Smoorenburg 스크립트에 의해 제어되며 해석되지 않으면 rc실패합니다 . sh달리기

      systemctl 목록 단위
      설명 시작 부분에 "LSB:" 또는 "SYSV:"가 있는 모든 서비스가 작동하려면 셸 인터프리터가 필요합니다. 마찬가지로 서비스로 사용되는 프로그램(또는 등 rabbitmq-server) 이 mysqld_safe실제로는 쉘 스크립트인 경우도 있습니다.
    • 많은 도우미 프로그램과 유틸리티는 쉘 스크립트입니다. 데비안은 /lib/systemd/systemd-sysv-install단지 예일뿐입니다. 다른 것에는 /usr/sbin/service, , /usr/sbin/invoke-rc.d심지어 가 포함됩니다 /bin/fgrep.
  • 구조 및 비상 모드 부트로더는 작동하지 않습니다. (Ubuntu 16의 systemd 버전부터 시작) rescue.serviceemergency.service/bin/sh.

추가 읽기

관련 정보