偽造不存在完整路徑的目錄路徑

偽造不存在完整路徑的目錄路徑

我正在使用一個依賴引用原始檔案等的絕對路徑的建置系統。問題是我的主機上的 src 目錄的路徑非常複雜 - 比方說 /a/b/c/d/src - 並且它必須與安裝的路徑相符。

我希望能夠將我的src 目錄掛載在/mnt/src 之類的地方,但我總是最終需要創建一個符號鏈接/a/b/c/d/src 到/mnt/src,或者只是將掛載點設定為直接/a/b/c/d/src。

檔案系統中包含 /a/b/c/d 感覺很髒,通常您甚至可能沒有在 /a/b/c/d (或任何父目錄)中建立檔案的權限。有沒有辦法偽造這條路徑來安撫我的建置系統?

答案1

最好的解決方案是告訴建置系統來源路徑和安裝路徑不是同一件事,但我假設你不能這樣做。

最直接的方法是將來源路徑安排為可以輕鬆複製的路徑,例如/var/tmp/mybuild.如果建置系統不是太令人討厭,那麼將其作為檔案所在位置的符號連結就足夠了。如果建立系統堅持規範化符號鏈接,您應該能夠透過使用綁定掛載反而。使用bindfs,您不需要root權限,您只需要對要讓檔案出現的位置具有寫入權限。

如果您無法對來源系統進行操作,另一種方法是預先載入重定向某些檔案存取的動態庫。這假設將運行的所有可執行檔都是動態連結的。連結範例中的程式碼示範如何從特定檔案執行此操作;可以對其進行調整以重定向路徑以特定前綴開頭的所有檔案。代替

if (!strcmp(path, FROM)) {
    path = TO;
}
return ret;

通過類似的東西(未經測試)

char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
    other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
    if (other_path == NULL) return -ENOENT; // return NULL in fopen
    memcpy(other_path, TO, strlen(TO));
    memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
    path = other_path;
}
free(other_path);
return ret;

答案2

如果您的目標是避免測試建置的殘留物污染“主機”,那麼在firejail具有持久覆蓋層的內部建置應該是一個不錯的選擇。透過這種方法,它可以像真實的一樣建置並可能安裝,但檔案最終會出現在覆蓋層中,而不是污染「真實的」檔案系統。

缺點是您需要在覆蓋層中找到測試建置結果,但同時這可能具有保留連續測試建置結果的優點,例如,用於比較它們,或您可能需要的任何其他後續取證做。

相關內容