사용자가 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 |