AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 789607
Accepted
L. Cornelius Dol
L. Cornelius Dol
Asked: 2025-01-15 09:53:31 +0800 CST2025-01-15 09:53:31 +0800 CST 2025-01-15 09:53:31 +0800 CST

Linux 文件系统可以在解析符号链接之前解析相对路径吗?

  • 772

这里是新的 Linux 用户,刚刚从 Windows 10 过渡到 Fedora 41。对许多操作系统有丰富的经验,包括各种 *nix 和类 Unix 文件系统。

我有一个标准做法,即使用从测试文件夹到代码存储库的符号链接,以便在本地重新创建已部署的生产文件夹结构以进行测试,同时保持测试和代码存储库完全分离。我有许多像这样设置的项目用于本地测试。

例如,如下所示:

~/dev
  test
    a-project
      app => ../../code/a-project/src
        (cfg)
        (web)
      dta
        cfg
  code
    a-project
      src
        cfg
        web

这个问题的关键在于src/cfg文件夹(在生产环境中就是app/cfg文件夹)包含的文件具有对可选文件的相对引用,dta/cfg如果这些文件在生产环境中存在,则加载这些文件,这些文件应相对于文件夹。app/cfg因此,../../dta/cfg/Optional.json部署时会引用dta文件夹。PWD 是应用程序根目录(在测试环境中,这是~/dev/test/a-project并且软件中的所有路径都是相对于 PWD 指定的。这些路径在 Java 代码中使用 Java 的类进行操作File,因此这不是 shell 行为问题。

这在 Windows 上运行良好,因为文件系统将路径app/cfg/../../dta/cfg/Optional.json理解为其确切的含义,并首先解析相对引用,从而导致dta/cfg/Optional.json(前导app/cfg被以下消除../..)。

但是 Linux 显然首先解析符号链接( app/cfg/=>dev/code/project/src/)然后才应用相对路径段../../dta/cfg/Optional.json,导致找不到文件,因为该文件当然不在中~/dev/code/project/dta/cfg。

不管这在技术上是否正确,有没有什么方法可以让我在任何级别告诉 Linux 在解析符号链接之前解析相对路径段,以免发生这种意外和不可预测的行为?除了让我感到困惑和违反直觉之外,我有很多现有的代码,它们期望路径首先解析相对引用,即使用表观路径,而不是底层路径。

我的开发工作所用的文件系统是启用了大小写折叠的 ext4(来自 Windows,需要与使用 Mac 和 Windows 的其他开发人员保持兼容),我真的非常希望避免在将路径传递给操作系统之前对一堆 Java 类进行不稳定的侵入性更改以实现相对路径解析;因为它可能很脆弱,导致安全漏洞,而且它只需要用于我的测试,因为生产系统(Ubuntu Linux 服务器)不需要这些符号链接。

symlink
  • 1 1 个回答
  • 94 Views

1 个回答

  • Voted
  1. Best Answer
    Philip Couling
    2025-01-15T18:21:51+08:002025-01-15T18:21:51+08:00

    简单的答案是“不”。如果不更改 Java 代码,符号链接将无法执行您所要求的操作。

    为什么?

    那是因为..它不是你所想的那样……

    这种行为并非不可预测。它之所以令人惊讶,只是因为该cd命令做了一些奇怪的事情。在所有其他情况下,..内核都会将其解释为文件系统中的真实事物。每个目录实际上都包含一个名为的子目录..,该子目录直接引用其父目录。

    因此foo/..告诉内核跟随符号链接foo,然后在该目录中查找名称..。内核实际上并没有做与路径不同的任何事情foo/bar。

    选项

    替代配置布局

    观察结果显示:您遇到的问题似乎是由于您的配置也存储在源代码目录中。这是一种不寻常的模式。

    通常,您会将配置放在测试目录中,使其特定于测试。配置可能引用应用程序的位置,或者您的运行脚本知道布局。

    您始终可以将单个配置文件符号链接到test/app/cfg目录中。只要目录路径本身不是符号链接,配置文件本身的实际路径就可以是符号链接。

    使用绑定挂载/docker

    我个人更喜欢使用绑定挂载来实现这种类型,并且为此我通常使用 Docker 和 docker compose 作为设置测试的方式。

    您可能更喜欢使用 shell 脚本来为您设置绑定挂载,因为 java 通常需要某种运行脚本。

    例如:测试目录中的docker-compose.yaml文件

    services:
      test:
        image: openjdk:25-jdk-bullseye
        volumes: 
        - ../../code/a-project/src:/app/
        - ./data:/data/
        # Whatever your run script is...
        run: run.sh 
    

    也可以在脚本中使用unshare和mount --bindfinally手动设置。但这更复杂。exec

    • 7

相关问题

  • 别名路径扩展

  • 如何让 tar 跟随除一个递归符号链接之外的所有符号链接

  • ln 中带有硬链接和软链接的路径

  • 意外创建了指向该文件夹中某个文件夹的符号链接

  • 是否可以在符号链接目录中创建影子文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve