我有一个Alpine docker容器,根据我使用ssh连接的方式,路径不同。如果我使用PTY外壳进行连接:
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
为什么会发生这种情况?我需要做什么才能使第二个命令产生与第一个命令相同的输出?
使用sh -l
启动登录shell:
当作为交互式登录shell或带有--login选项的非交互式shell调用时,它首先尝试按顺序读取和执行/etc/profile和~/.profile中的命令。--noprofile选项可用于禁止此行为
使用名称sh调用的非交互式shell不会尝试读取任何其他启动文件。
来源https://linux.die.net/man/1/sh
也就是说,您可能可以编辑配置文件,使登录shell的行为类似于noprofile
,但反过来可能会变得困难。
我会回答我自己的问题。这个堆栈溢出帖子提供了所需的主要信息:在Alpinelinux中,在哪里设置系统默认环境变量?
鉴于此,有两种选择:
-
使用
Dockerfile
的ENV
选项声明PATH
-
或者将
PermitUserEnvironment yes
添加到sshd_config
文件中,并在~/.ssh/environment
中定义PATH