쉘은 ~
홈 디렉토리로 확장될 수 있습니다. $HOME
일반적으로 동일한 처리가 있지만 이러한 확장을 지원하지 않을 수 있는 컨텍스트에서 현재 사용자의 홈 디렉터리를 참조하려는 경우가 많습니다.
내 프로필은 $HOME
작동하지만 ~
작동하지 않으며 그 반대도 마찬가지입니다.
퓨즈가 다음과 같은 것을 제공할 수 있을 것 같아요 /var/myself
->$HOME
이렇게 하면 구성 파일에 값을 넣어 다음과 같은 항목을 가리킬 수 있습니다./var/myself/backdrops/pornography/wtf/yarly.jpg
벌써 그런 일이 있나요? 그렇지 않다면 이런 일이 일어나서는 안되는 타당한 이유가 있습니까?
답변1
귀하의 우려를 이해하지만 대답은 "아니오"입니다. 그런 것은 없습니다.
일반적인 접근 방식은 운영 체제에 사용자의 홈 경로를 요청하거나 $HOME 변수를 얻는 것입니다.
이러한 모든 옵션에는 항상 애플리케이션의 일부 코딩이 필요합니다. Bash와 같은 많은 응용 프로그램은 "별칭"을 제공합니다 ~ (open(2)에서는 이를 번역하지 않습니다).
물론 이 목적으로 vfs나 퓨즈 모듈을 사용할 수 있습니다. 할 일이 있을 수도 있으니 물어봐야겠어요!
하지만 정말 필요한가요? 다음 해결 방법을 사용할 수 있습니다.
$HOME을 상대 경로나 알려진 위치에 연결하는 프로그램을 시작하는 스크립트를 만듭니다.
pam_exec를 사용하여 $HOME 디렉터리를 알려진 위치에 연결합니다.http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_exec.html
답변2
한 가지 비결(적어도 Linux에서는)은 $HOME
애플리케이션을 실행하기 전에 디렉토리를 변경한 다음 /proc/self/cwd/...
구성 파일에서 사용하는 것입니다.
답변3
대부분의 프로그램에서는 명령줄에서 구성 파일의 경로를 지정할 수 있습니다. 따라서 표준 구성 파일을 사용하고 이를 필터링하여 $HOME
현재 사용자와 같은 항목을 대체한 다음 수정된 임시 구성 파일을 프로그램에 전달하는 래퍼를 작성할 수 있습니다 .
답변4
요청하는 사용자의 pid를 얻고 시스템에 홈 디렉토리를 요청할 수 있습니다. 그래서 가능합니다.
그러나 SUID가 없는 프로그램이 FS를 정적이라고 가정하는지 확실하지 않습니다.
편집하다:
struct fuse_context *ctx = fuse_get_context ();
struct passwd pwd, *ppwd;
char buffer[1024];
int status = getpwuid_r (ctx->ui, &pwd, buffer, sizeof(buffer), &ppwd);
if (status == 0) {
if (ppwd == NULL) {
// No record found
} else {
// Handle record
}
} else {
// Handle error
}
위의 코드는 이상적이지는 않지만 일반적인 상황에서는 작동합니다.