3

Я установил свою среду в .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 независимо от интерактивного состояния, но в некоторых случаях этот код отключается во время компиляции. Эти факты кажутся связанными с моей проблемой, но не ясно, как я могу решить свою проблему.

1 ответ1

3

Я полностью понял, в чем проблема.

Sshd должен действительно сделать неинтерактивный сеанс входа в систему, а не неинтерактивный сеанс входа в систему, но это не так. Bash очень старается обнаружить использование ssh и использует bashrc, если считает, что он запущен sshd, независимо от того, интерактивный он или логин. Только Bash делает это. Поскольку я использовал bash, я полагался на это поведение источника, хотя оно не работало с другими оболочками.

Есть два способа обнаружения ssh. Он смотрит, является ли stdin сокетом (1), и если это не удается, он ищет некоторые переменные SSH_ (2). Не так давно openssh изменил способ работы, поэтому (1) больше никогда не будет работать, потому что теперь stdin - это канал, а не сокет. (2) включено в некоторых дистрибутивах Linux, но отключено в других. Я использовал дистрибутивы, где он был включен.

Поскольку то, что сделал bash, было ужасно, и поскольку это все равно не работает надежно, я теперь устанавливаю BASH_ENV в ~/.ssh/environment, так что теперь всегда работает, но, к сожалению, теперь мне нужно установить PermitUserEnvironment yes в sshd_config .. ,

Также неясно, почему я не могу установить его в /etc/environment , поэтому он работает для всех пользователей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .