як я можу використовувати bash як оболонку входу, коли мій sysadmin відмовляється дозволити мені змінити його


38

Unix системний адміністратор , де я працюю не хоче , щоб дати мені доступ змінити свою реєстраційну оболонку від kshдо bash. Він дав різні виправдання, найсмішнішим є те, що оскільки вони пишуть усі свої сценарії, kshвони не спрацюють, якщо я спробую запустити їх. Я не знаю, звідки у нього такі ідеї, але оскільки я не можу його переконати, чи є в мене альтернатива?

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

Відповіді:


69

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

  • Замініть оболонку входу, лише якщо вона інтерактивна. Це важливо: інакше вхід у графічний режим може не працювати (це залежить від системи: деякі, але не всі системи читаються ~/.profileпід час входу через xdm чи подібні), і такі ідіоми, як ssh foo '. ~/.profile; mycommand'помилка.
  • Перевірте, чи доступний bash, щоб ви все одно могли увійти, якщо виконуваний файл з якихось причин відсутній.

У вас є вибір, запускати bash як оболонку входу чи ні. Єдина основна відмінність у тому, щоб зробити його оболонкою для входу, це те, що він завантажується ~/.bash_profileабо ~/.profile. Отже, якщо ви запускаєте bash як оболонку входу, будьте дуже обережні, щоб мати a ~/.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 потрібна кнопка " Надіслати пиво" : я би зараз її використав.
іконоборство

Дякую спочатку і. .profileпрацює лише для оболонки входу (як це потрібно OP). Я використовую підключення до віддаленого робочого столу Windows 10 для входу в робочу станцію Linux, а потім відкриваю Terminal в 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 досить легко, додавши рядок для цього перед exec.
дероберт

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варіант? Я користуюся цим місяцями без цього, без проблем.
кокер

1

Відповідь csh/tcshнатхненника верхівки, яку проголосував @Gilles, - це

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

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

0

Solaris:

usermod -s /bin/bash root

1
Чи не вимагає адміністрування прав адміністратора, а питання "... коли мій адміністратор відмовляється ..."?
Блаженний Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.