【问题标题】:Path is different depending on how you connect to container路径因您连接到容器的方式而异
【发布时间】:2021-03-31 14:29:45
【问题描述】:

我有一个 Alpine docker 容器,根据我使用 ssh 连接的方式,路径会有所不同。如果我使用 PTY shell 连接:

ssh root@localhost sh -lc env | grep PATH

打印出来:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

但是如果不使用这个外壳:

ssh root@localhost sh -c env | grep PATH

打印出来:

PATH=/bin:/usr/bin:/sbin:/usr/sbin

为什么会这样?我需要做什么才能使第二个命令产生与第一个命令相同的输出?

【问题讨论】:

  • 如果你真的 ssh'ing 到一个容器,那么$PATH 的值不是你最大的问题,真的。 jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil
  • @CarlosGranados 您到底在使用什么高山图像?我认为 SSH 不是默认 alpine 映像的一部分。实际上我不明白为什么人们总是想通过 SSH 连接到容器中。为什么不使用docker exec
  • @dpr 和另一个名字不可能的人:我不是自愿选择 ssh'ing,它是一个正在这样做的工具,我正在尝试修复该工具。

标签: docker ssh path alpine


【解决方案1】:

使用sh -l,您可以启动一个登录shell:

当作为交互式登录 shell 或带有 --login 选项的非交互式 shell 调用时,它首先尝试从 /etc/profile 和 ~/.profile 读取和执行命令,以该顺序。 --noprofile 选项可用于禁止此行为。
...
使用名称 sh 调用的非交互式 shell 不会尝试读取任何其他启动文件。

来自https://linux.die.net/man/1/sh

也就是说,您可能可以编辑配置文件以使登录 shell 的行为类似于 noprofile,但反过来可能会变得困难。

【讨论】:

    【解决方案2】:

    我会回答我自己的问题。此堆栈溢出帖子包含所需的主要信息:Where to set system default environment variables in Alpine linux?

    鉴于此,有两种选择:

    • 使用DockerfileENV 选项声明PATH

    • 或者将PermitUserEnvironment yes添加到sshd_config文件并在~/.ssh/environment中定义PATH

    【讨论】:

    • 这如何解释不同 sh 选项之间的区别?
    • 如果您传递 -l(或 --login)选项,它将读取 /etc/profile 文件。如果你不这样做,它就不会读取它,你需要使用我发布的其他替代方法之一
    • 好的,我以为你提到图像中没有/etc/profile...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多