사용자가 무언가에 액세스할 수 있는 권한이 있다고 가정하면 어떻게 geteuid()와 같은 시스템 호출을 직접 수행할 수 있습니까? bash에서 유효한 사용자 ID를 가져옵니다(이것은 단지 예일 뿐입니다). 어떻게 해야 합니까?
답변1
시스템 호출을 통한 사용자 공간 커널 공간 통신은 메모리 위치와 머신 레지스터를 기반으로 수행됩니다. 이는 주로 텍스트 문자열로 작동하는 셸의 추상화 수준보다 훨씬 낮습니다.
즉, bash에서는 다음을 사용할 수 있습니다.https://github.com/taviso/ctypes.shC 수준 세분성으로 텍스트 문자열을 추상화하는 플러그인:
$ . ctypes.sh
$ dlcall -r long geteuid
long:1001
그러나 이 특정 작업의 경우 bash의 매직 변수를 사용하는 것이 더 간단하고 관용적이며 효율적입니다 $UID
.
$ echo "$EUID" #effectively a cached geteuid call
1001
답변2
uid를 얻으려면 자신만의 C 프로그램(또는 쉘이 이를 허용하는 경우 일부 쉘 플러그인, 참고)을 작성하십시오.다루기 힘든라는 플러그인이 있을 수 있습니다.기준 치수.) 또는 더 간단하게 실행번호(1)주문하다.
다른 시스템 호출의 경우(다음에 나열됨)시스템 호출(2)), 동일합니다. 일부 프로그램(또는 일부 내장 또는 일부 플러그인)을 사용하여 실행합니다. 프로그램은 어셈블러에서 직접 코딩할 수 있으며 SYSCALL
기계 SYSENTER
명령어를 사용하여 시스템 호출을 수행하거나 (더 일반적으로)C 표준 라이브러리그리고 해당 시스템 호출을 수행하는 함수를 사용하십시오 libc
. 실행 파일은 C 소스 코드에서 얻을 필요가 없습니다(예:바쁜 상자어셈블러, 프로그램 코딩뼈컴파일러는 libc를 사용하지 않습니다.) 하지만,당신 libc
은 초석입니다귀하의 시스템.
프로세스의 특정 수정 가능하고 상속 가능한 속성을 변경하는 시스템 호출은 셸에 내장되어야 합니다( cd
예:목차(2), ulimit
을 위한제한 설정(2)등...), 쉘 프로세스 자체의 속성을 변경하려고 할 수 있기 때문입니다(그리고 쉘에 의해 시작되는 향후 명령 프로세스에 의해 상속됨). 따라서 cd
프로그램인 경우 해당 프로그램을 실행하는 셸 하위 프로세스에만 적용됩니다.
그런데,시스템 호출누군가가 완료해야만 의미가 있습니다.프로세스. 프로세스는 쉘 프로세스이거나 쉘에 의해 시작된 하위(또는 하위) 프로세스일 수 있습니다.
참고하세요유닉스 쉘모두 일반적인 절차입니다. 그 중 많은 것들이 있습니다 (예 :다루기 힘든,물고기,서쪽,영어등...)... 자신만의 쉘을 작성하는 것은 흥미로운 연습입니다(간단하게 수행할 수 있습니다. 참조).허리띠예를 들면 다음과 같습니다.이것와일드카드에 대한 힌트). ~에 대해 읽다리눅스 프로그래밍. 다른 쉘을 사용하는 것이 만족스럽지 않은 경우 bash
(아마도 다음을 사용하여 로그인 쉘을 변경하십시오)chsh(1)) 또는 직접 작성해 보세요. 반품,GNU 배쉬대부분의 다른 껍질과 마찬가지로무료 소프트웨어. 원한다면 소스 코드를 연구하고 개선할 수 있습니다.