사용자가 C에서 root인지 확인하시겠습니까?
사용자가 루트인지 확인하려면 어떻게 해야 합니까?
일반적으로 사용자가 루트인지 테스트하는 것은 실수입니다.POSIX는 루트 사용자를 필요로 하지 않지만 권한이 작동하는 방식을 결정하기 위해 구현에 맡깁니다.다음과 같은 코드:
if (i_am_root) do_privileged_op(); else print_error();
루트가 필요한 권한 작업을 수행할 필요가 없는 고급 권한 모델을 사용하여 사용자를 정말 짜증나게 합니다.나는 리눅스에서 CD를 굽던 초기에, 나는 모든 것을 해킹해야 했던 것을 기억합니다.cdrecord읽을 수 있는 권한으로 제대로 작동했을 때 루트로 실행되고 있는지 확인하기 위해 모든 쓸모없는 검사를 제거하는 소스./dev/sga.
대신 항상 수행해야 하는 권한 있는 작업을 시도하고 다음을 확인해야 합니다.EPERM권한이 충분하지 않다는 것을 사용자에게 알리지 않는 경우(루트로 실행을 다시 시도해야 할 수도 있음) 유사합니다.
루트를 확인하는 데 유용한 한 가지 경우는 프로그램이 "suid-root"로 호출되었는지 확인하는 것입니다.합리적인 테스트는 다음과 같습니다.
uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
/* We might have elevated privileges beyond that of the user who invoked
* the program, due to suid bit. Be very careful about trusting any data! */
} else {
/* Anything goes. */
}
저는 uid/euid를 얻기 위한 호출 중 하나가 실패할 수 있다는 가능성을 고려했습니다. 그리고 실패한 경우에는 우리가 suid이고 악의적인 사용자가 우리가 syscall을 실패하게 하여 우리가 suid임을 숨기려 했다는 것을 가정해야 합니다.
getuid 또는, 당신이 진정으로 의미하는 바에 따라.어느 쪽이든0루트를 의미합니다.
#include <stdio.h>
#include <unistd.h>
if (geteuid() != 0) {
fprintf(stderr, "App needs root\n");
exit(1);
}
R에 의해 만들어진 요점은 유효합니다.시행착오 또는 루트가 명시적으로 필요하지 않은 다른 접근 방식을 고려해야 합니다.
getuid 또는 getuid를 사용하는 것이 더 좋지만 zconf에 있습니다.h 헤더 파일 및 아래와 같이 입력해야 합니다.
#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use a=geteuid();
//euid is effective user id and uid is user id
// both euid and uid are zero when you are root user
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
}
언급URL : https://stackoverflow.com/questions/4159910/check-if-user-is-root-in-c
'programing' 카테고리의 다른 글
| 스크립트 캐시 유형을 정리하는 방법은 무엇입니까? (0) | 2023.06.17 |
|---|---|
| Y 축에서 텍스트와 제목 사이의 거리 증가 (0) | 2023.06.17 |
| 선호하는 성능 튜닝 요령 (0) | 2023.05.28 |
| 저장소에서 파일을 제거하지만 로컬에 보관 (0) | 2023.05.28 |
| npm: 패키지에 대한 설치 후 스크립트 사용 안 함 (0) | 2023.05.28 |