Я установил свою среду в .profile
. Мой .profile
является идемпотентом, и .bash_profile
, .bashrc
, .kshrc
и .zshrc
все исходные файлы .profile
. Таким образом, я всегда получаю одно и то же окружение, независимо от того, какую оболочку, совместимую с bourne, я использую, и независимо от того, является ли оболочка интерактивной или оболочкой входа в систему.
Это работает и с неинтерактивным использованием ssh(1)
, хотя я точно не знаю, почему.
iridium:aram$ ssh sunos.mgk.ro 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/sunos:/home/aram/bin/sunos/amd64:/home/aram/bin/sunos/386:/home/aram/go/bin:/opt/local/bin:/opt/local/sbin:/usr/gnu/bin:/usr/bin:/sbin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/local/sbin:/home/aram/plan9/bin
iridium:aram$ ssh iridium 'env|grep ^PATH'
PATH=.:/Users/aram/bin:/Users/aram/bin/darwin:/Users/aram/bin/darwin/amd64:/Users/aram/bin/darwin/386:/Users/aram/go/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/plan9/bin
iridium:aram$ ssh crimson 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/linux:/home/aram/bin/linux/amd64:/home/aram/bin/linux/386:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/bin:/usr/local/sbin
На меньшинство систем, однако, это не работает.
iridium:aram$ ssh ci20 'env|grep ^PATH'
PATH=/usr/bin:/bin
Я пытался сделать эту работу, но безуспешно. Я пытался:
- переключиться на другую оболочку вместо Bash
- отключить PAM в sshd_config
- с включенным PAM, установите BASH_ENV в /etc /environment
Это не имело никакого эффекта, кажется, что /etc /environment вообще не читается независимо от настроек PAM.
Пожалуйста, не предлагайте, чтобы я либо заставлял bash быть интерактивным в моем ssh-вызове, либо чтобы я вручную вводил окружение в мой ssh-вызов, я пытаюсь исправить основную проблему здесь.
Пытаясь решить эту проблему, я узнал кое-что о bash. Похоже, что bash всегда будет исходным кодом bashrc, даже если это неинтерактивная оболочка, если стандартный ввод - сокет. Некоторые версии OpenSSH запускают bash таким образом, но в других версиях стандартным вводом является труба. Также в bash есть код, который пытается определить, запущен ли он в сеансе ssh, и в этом случае он также будет источником bashrc независимо от интерактивного состояния, но в некоторых случаях этот код отключается во время компиляции. Эти факты кажутся связанными с моей проблемой, но не ясно, как я могу решить свою проблему.