Czy istnieje standardowy symboliczny link do bieżącego katalogu domowego użytkowników?

9

Powłoka może rozwinąć się ~do twojego katalogu domowego. $HOMEzwykle ma tę samą ofertę, ale często chcesz odwoływać się do katalogu domowego bieżących użytkowników z kontekstu, który może nie obsługiwać takiego rozszerzenia.

Miałem pliki konfiguracyjne, w których $HOMEdziała, ale ~nie działa i odwrotnie.

Domyślam się, że bezpiecznik może zapewnić coś w tym stylu, coś w stylu /var/myself->$HOME

Dzięki temu mogłem umieszczać wartości w plikach konfiguracyjnych, aby wskazywały na takie rzeczy /var/myself/backdrops/pornography/wtf/yarly.jpg

Czy jest już coś takiego? Jeśli nie, to czy istnieją dobre powody, aby czegoś takiego nie było?

Lerc
źródło
2
To naprawdę wydaje się być naprawdę dobrym pomysłem, a bezpiecznik mógłby to zrobić dość trywialnie, jeśli dobrze pamiętam interfejs
Michael Mrozek

Odpowiedzi:

6

Rozumiem twoją troskę, ale odpowiedź brzmi „nie”, nie ma czegoś takiego.
Typową metodą jest zapytanie systemu operacyjnego o ścieżkę domową użytkownika lub uzyskanie zmiennej $ HOME.

Wszystkie te opcje wymagają zawsze trochę kodowania z aplikacji. Wiele aplikacji, takich jak bash, oferuje „alias” ~ (open (2) tego nie tłumaczy).

Oczywiście w tym celu można zaimplementować moduł VFS lub moduł bezpieczników. Prawdopodobnie jest coś do zrobienia, zapytam o to!

Ale czy to naprawdę potrzebne? Możesz użyć obejścia takiego jak:

Keymon
źródło
Proszę o narzędzie VFS: unix.stackexchange.com/questions/1811/…
Keymon
0

Jedną sztuczką (przynajmniej w systemie Linux) byłoby przejście do katalogu $HOMEprzed uruchomieniem aplikacji, a następnie użycie go /proc/self/cwd/...w pliku konfiguracyjnym.

Neil Mayhew
źródło
Podoba mi się hackactwo tego, ale przypuszczalnie miałoby to problemy, gdy proces zmienia bieżący katalog. Chciałbym / proc / PID / iwd dla początkowego katalogu roboczego.
Lerc
... a jeśli o to chodzi, to / proc / PID / home
Lerc
@Lerc, jeśli to się dzieje w pliku konfiguracyjnym to musi być /proc/selfnie /proc/PID, ponieważ nie można z góry wiedzieć, co PID będzie.
Neil Mayhew
@Lerc, tak, jeśli proces zmieni katalog, to się nie powiedzie, ale zwykle programy czytają plik konfiguracyjny raz, gdy się uruchamiają, a następnie buforują wartości w pamięci. Wszystko zależy od programu, z którym pracujesz, a jeśli program nie oferuje wystarczającej elastyczności, czy to w wierszu poleceń, czy w składni pliku konfiguracyjnego, utkniesz.
Neil Mayhew
Tak, miałem na myśli / proc / PID / home, co oznaczało, że wszystkie katalogi proc / PID powinny to wspierać, a tym samym obejmują / proc / self
Lerc
0

Większość programów pozwala określić ścieżkę do pliku konfiguracyjnego w wierszu poleceń. Możesz więc napisać opakowanie, które pobiera standardowy plik konfiguracyjny, filtruje go, aby zastąpić rzeczy takie jak $HOMEdla bieżącego użytkownika, a następnie przekazuje zmodyfikowany, tymczasowy plik konfiguracyjny do programu.

Neil Mayhew
źródło
Jeśli to zrobisz, skutecznie zabierzesz możliwość określenia ścieżki do pliku konfiguracyjnego od użytkownika. Może być wykonalne, jeśli masz ochotę na rajd z exe opakowania.
Lerc
0

Możesz uzyskać identyfikator pid użytkownika i zapytać system jego katalogu domowego. Więc jest to możliwe.

Nie jestem jednak pewien, czy nie ma programów SUID, które zakładałyby FS jako statyczny.

Edytować:

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
} 

Powyższy kod nie jest idealny, ale powinien działać w typowych przypadkach.

Maciej Piechotka
źródło
Jak znajdziesz jego katalog domowy po tym, jak dowiesz się, jaki to użytkownik?
WhyNotHugo
Za pomocą getpwuidlub getpwuid_r.
Maciej Piechotka,