как я могу использовать bash в качестве оболочки для входа в систему, когда мой системный администратор отказывается позволить мне изменить его


38

Системный администратор Unix, в котором я работаю, не хочет давать мне доступ для изменения оболочки входа в систему с kshна bash. Он приводил различные оправдания, самое смешное, что, поскольку они пишут все свои сценарии, kshони не будут работать, если я попытаюсь их запустить. Я не знаю, откуда у него эти идеи, но, поскольку я не могу его убедить, есть ли какая-нибудь альтернатива, которая у меня есть?

( chshустановлен на этих машинах, но мы используем открытые / закрытые пары ключей для входа в систему, и у меня нет пароля, поэтому, когда chshзапрашивает пароль, мне нечего дать.)

Ответы:


69

Когда вы входите в систему, файл ~/.profileчитается оболочкой входа (ksh для вас). Вы можете указать этой оболочке входа в систему заменить себя на bash. Вы должны принять некоторые меры предосторожности:

  • Замените оболочку входа только в том случае, если она интерактивная. Это важно: в противном случае вход в систему в графическом режиме может не работать (это зависит от системы: некоторые, но не все системы читают ~/.profileпри входе в систему через xdm или аналогичный), и такие идиомы, как, ssh foo '. ~/.profile; mycommand'могут быть неудачными.
  • Убедитесь, что bash доступен, чтобы вы могли войти в систему, если исполняемый файл по какой-то причине отсутствует.

У вас есть выбор: запускать bash в качестве оболочки для входа или нет. Единственное существенное отличие от создания оболочки для входа - это то, что она загружается ~/.bash_profileили ~/.profile. Поэтому, если вы запускаете bash в качестве оболочки входа в систему, будьте очень осторожны, чтобы иметь ~/.bash_profileили избегать рекурсивного выполнения bash из ~/.profile. Нет реального преимущества в ~/.profileвыполнении bash, а не в ksh, поэтому я бы рекомендовал не делать этого.

Также установите SHELLпеременную окружения на bash, чтобы такие программы, как эмуляторы терминала, вызывали эту оболочку.

Вот код для переключения на bash. Поместите это в конце ~/.profile.

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
Отличный ответ! stackexchange нуждается в кнопке Send A Beer : это было бы время, когда я бы ее использовал.
иконоборчество

Сперва спасибо. .profileработает только для логина (как требуется ОП). Я использую подключение к удаленному рабочему столу Windows 10 для входа на рабочую станцию ​​Linux, затем открываю терминал в gnome. Я хочу, чтобы zshмой системный администратор дал мне bash. В этом случае я должен добавить фрагмент .bashrcвместо .profile.
Выходные

12

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

SHELL=`type -P bash`
exec bash -l

Это приведет kshк замене bashсеанса сеансом. Вам не придется вводить exit(или ^D) дважды, как если бы вы вручную запускали новый bashсеанс при каждом входе в систему.

echo $SHELL

даже вернет путь к bash.


3
Конечно, вы можете довольно легко изменить $ SHELL, добавив строку для этого перед выполнением.
Дероберт

2
Если вы хотите, чтобы новая оболочка также была оболочкой входа в систему, вам, вероятно, следует это сделать exec bash -l.
jw013

1
Один последний комментарий: typeэто рекомендуется в течение which.
jw013

1
Я не понимаю! bashТакже не будет читать, .profileтаким образом генерируя бесконечный цикл? Я согласен с тем, exec bashчто вам нужно что-то подобное , но вы должны убедиться, что вы делаете это только для своей учетной записи ksh, поэтому требуются некоторые операторы if!
Bananguin

1
@ user1129682 нет, если есть ~/.bash_profileили~/.bash_login
Ульрих Дангел

4

В ответе Джайлса должен быть добавлен флаг -l при выполнении bash, чтобы любые скрипты профиля входа в систему были получены из новой оболочки bash. (Например, что-нибудь в /etc/profile.d/ на RHEL). Сценарий должен быть:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

Можете ли вы объяснить, почему вы говорите, чтобы добавить -lопцию? Я использую это в течение нескольких месяцев без каких-либо проблем.
Cokedude

1

Ответом для csh/tcshвдохновленного победителем от @Gilles является:

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.