Для одного и того же пользователя unix или linux разные наборы переменных среды

Я использую tcsh , и для конкретного проекта каждый член моей команды подключается к серверу с одним и тем же пользователем. (Это то, что мы не можем изменить).

Ситуация возникает из-за того, что я хочу иметь некоторые пользовательские переменные среды и псевдонимы, и для этого у меня есть свой собственный .tcshrc-файл (а именно .tcshrc_cust ), который я загружаю в качестве первого действия при подключении к этой машине:

 source .tcshrc_cust 

и даже если это работает очень хорошо, я испытываю проблему при использовании vim : если я получу оболочку изнутри vim (с :sh ), я попадаю в обычную оболочку без моего пользовательского env. вары. и псевдонимы.

Есть ли решение для этого, помимо использования другого пользователя в этой машине?


РЕШЕНИЕ (данное @Shawn):

Я префикс мой ключ в .ssh/authorized_keys с:

 command="setenv subuser noz; tcsh" 

и написал в конце файла .tcshrc следующие строки:

 if ($?subuser) then source .tcshrc_$subuser; endif 

И теперь все отлично.

Вы можете сделать .tcshrc проверить специальную переменную среды (например, subuser ) и условно source .tcshrc_cust . Когда вы subuser=nozimica tcsh в систему, запустите subuser=nozimica tcsh . Он получит эту переменную enironment и выполнит ваш собственный rc-скрипт. Кроме того, команда vim's :sh будет работать. Вы даже можете сделать это фантазией и source .tcshrc_$subuser ; таким образом, все могли это сделать.

Вы можете пропустить часть, в которой вы запускаете subuser=nozimica tcsh когда вы subuser=nozimica tcsh систему, запустив ее для ssh. Если вы настроили аутентификацию ssh-ключа, то в ~/.ssh/authorized_keys на сервере вы можете command="subuser=nozimica tcsh" свой ключ command="subuser=nozimica tcsh" , и ssh выполнит эту команду для вас.

Вы можете отправлять переменные среды с вашей локальной машины с помощью SSH.

Например, поставьте export FOO_USER="$USER" (в версии tcsh .bash_profile ) или FOO_USER=joe ssh remote-host (в командной строке) на вашем локальном компьютере. Измените свой файл ~/.ssh/config чтобы включить это: SendEnv LANG LC_* FOO_USER .

Затем на удаленном сервере вы можете проверить эту переменную в .bash_profile (или что у вас есть в tcsh ) и выполнить соответствующее действие:

 if [ "$FOO_USER" = 'joe' ]; then export PS1='--[ Joe rules ]-- \u@\h \w \$ '; source tcsh.joe; elif [ "$FOO_USER" = 'jane' ]; then alias ll='ls -Al'; fi 

По умолчанию сервер SSH принимает только LANG и LC_* , поэтому, если вы не можете редактировать /etc/ssh/sshd_config на сервере, чтобы добавить AccceptEnv LANG LC_* FOO_USER , вы можете взломать его, злоупотребляя переменными LC_* , например LC_FOO_USER=joe . Обновите свой .bash_profile (или, точнее, соответствующие локальные и удаленные файлы tcsh ) соответственно.

Мы с моей командой столкнулись с аналогичной проблемой с общей учетной записью. Мы придумали в основном то же самое решение, оптимизируя его немного.

Вот что мы делаем. (Мы используем ksh , я мало знаю о tcsh но я предполагаю, что это очень похоже).

  • .tcshrc вниз .tcshrc до минимума, так что он почти не используется.

  • .tcshrc_cust каждого пользователя использовать .tcshrc_cust

И в исходном tcshrc добавить что-то вроде этого:

  alias u1='source .tcshrc_user1' alias u2='source .tcshrc_user2' alias u3='source .tcshrc_user3' 

Идея состоит в том, что удобнее вводить всего 2 буквы, чем целая команда. Также, если вся команда делает это, она становится более принятой и более простой в обслуживании.

Я не говорю, что это идеальное решение, и я искал то же самое, что и вы, какое-то время, это лучшее, что я мог бы придумать. Будем надеяться, что у кого-то есть лучшая идея 🙂