Створення оболонки zsh за замовчуванням без доступу до кореня


52

Я користуюся комп’ютерами моєї школи і хотів би використовувати zshзамість них bash. Я хотів би зробити його оболонкою за замовчуванням, але я не можу запустити таку команду, як, наприклад, $ chsh -s $(which zsh)тому, що у мене немає привілеїв адміністратора.

Чи є спосіб я помістити щось у своє .bashrcабо щось, що автоматично дзвонить, zshколи воно відкриється як вирішення?

Для уточнення, zshвже встановлено.


2
Так, просто додайте zshу .bashrcфайл. Вихід і вхід і зроблено!
fedorqui

Вибач за те. Але для закінчення питання я просто поставив zshна перший рядок?

3
Якщо розмістити zsh в .bashrc, це зробить його завжди виконаним, навіть коли bashявно викликано. Краще помістіть його .bash_profileзамість цього.
konsolebox

Ви можете встановити zsh як стандартну оболонку в налаштуваннях терміналу (створити новий профіль).
lmaooooo

Відповіді:


68

Створіть .bash_profileу своєму домашньому каталозі та додайте ці рядки:

export SHELL=/bin/zsh
exec /bin/zsh -l

Оновлення: .profileможе працювати як загальне рішення, коли оболонка за замовчуванням не є bash. Я не впевнений, чи .profileможе викликати Zsh також, що це може бути зайвим, але ми можемо це зробити безпечно за допомогою простої перевірки:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

Ми також можемо використовувати whichдля отримання динамічного шляху, zshякий спирається на значення $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

Що робити, якщо адміністратор (root) Linux змінить вашу стандартну оболонку на щось інше, ніж bash (але не zsh), наприклад ksh? Тоді .bash_profileне буде посилатися. Як щодо цього .profileзамість цього?
Джошуа Хубер

@JoshuaHuber Останній тест, який я зробив, .profileне працював. Також не .profileназивали б Zsh? Це може стати зайвим. Це ще не перевірили. (Оновлення. Це працювало зараз, не впевнений, яку помилку я раніше робив.) Будь-які думки щодо можливих недоліків використання .profile?
konsolebox

1
@konsolebox Bash лише джерела, .profileякщо їх .bash_profileнемає (звичайно, якщо ви його не вручаєте .bash_profile, звичайно). В Зокрема, джерела Баша перші один з файлів [ .bash_profile> .bash_login> .profile] він знаходить. Він шукає лише .profileфункцію сумісності POSIX (оболонка Bourne).
пірокрастія

@pyrocrasty Дійсно. Так само, як сказано в посібнику: "Після прочитання цього файлу він шукає ~ / .bash_profile, ~ / .bash_login та ~ / .profile у такому порядку та зчитує та виконує команди з першого, який існує та є читабельним. . "
konsolebox

Він працював над тим, щоб створити новий профіль терміналу із командою Виконати спеціальну команду замість зміни моєї оболонки на zsh. .bash_profileі .profileне працювали (файли навіть не виконувалися, Fedora 26 на університетському комп'ютері).
lmaooooo

12

Зазвичай ви можете використовувати його chshяк некористувацького користувача. Але це час від часу вимикається, як правило, на сайтах, які використовують певну форму мережевої бази користувачів, як NIS та LDAP. Натомість може бути ypchsh(NIS) або chsh.ldap(LDAP).

chshзазвичай також дозволять лише деякі затверджені оболонки, як правило, перелічені в /etc/shells.

Якщо ви не можете використовувати chshабо його варіанти на своєму веб-сайті, то організуйте свою оболонку для входу до execулюбленої оболонки та встановіть SHELLзмінну, щоб вона вказувала на вашу улюблену оболонку.

  • Якщо ваша оболонка для входу sh, dashабо ksh: файл, який потрібно відредагувати, це ~/.profile. Слідкуйте за тим, щоб цей файл читався на початку інтерактивного сеансу, а також деякими сценаріями запуску неінтерактивної сесії (наприклад, для сеансів X11), тому вам потрібно подбати: лише дзвінок exec(який замінює поточний процес), коли поточний оболонка інтерактивна. За винятком оболонки Борна ( /bin/shз Solaris 10 і раніше), ви можете сказати, що оболонка є інтерактивною через наявність iу списку опцій ( $-).

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    Якщо ви хочете, щоб zsh прочитав своє .zprofile, перейдіть до цього -lпараметра.

  • Якщо ваша оболонка для входу bash, ви можете продовжити, як описано вище. Крім того, ви можете поставити ці команди ~/.bash_profile. Більшість сценаріїв запуску сеансу читаються тільки ~/.profileне ~/.bash_profile, але я бачив деякі, які працюють під bash і читають .bash_profile, тому навіть там вам слід бути обережними, щоб не зателефонувати execв неінтерактивну оболонку.

  • Якщо оболонка для входу є csh чи tcsh, див. Приклад у розділі Зміна оболонки за замовчуванням без chsh чи адміністратора


1

Я вважаю, що команда chshсаме для цієї мети. Хоча я не впевнений, що кожен дистрибутив Linux / Unix це підтримує. Перевірте сторінку людини chsh.


Деякі системи також мають його як passwd -s.
Стефан Шазелас

1

Якщо ви не можете запустити, chshоскільки у вас немає привілеїв адміністратора, поговоріть із тим, хто це робить .

Швидше за все, ви не можете використовувати chshяк некореневу, оскільки система, яку ви використовуєте, налаштована так, що chshне працюватиме, наприклад, оскільки система використовує NIS або LDAP, а не просто /etc/passwdфайл. Або, можливо, адміністратор вашої системи просто хоче підтримувати деякий контроль.

Порядок зміни оболонки залежить від політики вашої організації. Може існувати локальна команда, яка робить те, що chshзазвичай робить. Або вам може знадобитися подати квиток на підтримку, який вимагає зміни оболонки.

Більшість інших відповідей хороші, але якщо ваші адміністратори сприятливо реагують, ви, можливо, не захочете зламати хакерські сценарії. Я, мабуть, просто посилаюся zsh -lвручну після входу в систему, поки адміністратор не захоче оновити мій обліковий запис.

Ще одна річ, яку слід пам’ятати: іноді різні оболонки можуть використовувати одні й ті ж файли запуску. Наприклад, shі bashможе одночасно виконувати $HOME/.profile, і cshта tcshможе одночасно виконувати $HOME/.loginі $HOME/.cshrc(хоча оболонки конкретні завантажувальні файли , такі як .bashrc, .bash_profileі .tcshrcможуть перевизначати). Якщо ваша оболонка за замовчуванням є, /bin/cshі ви її хочете використовувати /bin/tcsh, оновлення її .loginдля виклику /bin/tcsh -lможе створити нескінченний цикл. zshне трапляється виконувати спеціальні bashфайли запуску, тому це не є проблемою для вас.

Більшість снарядів встановити змінні , які визначають , яку оболонку ви використовуєте ( $BASH_VERSION, $tcsh, $ZSH_VERSION). Якщо ви збираєтеся написати код запуску, щоб викликати бажану оболонку, це не погана ідея, щоб укласти її в ifтак, що вона виконується лише в тому випадку, якщо ви вже не працюєте з цією оболонкою. Використання коду з відповіді konsolebox :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(Додане ускладнення перевірки, "${ZSH_VERSION:-unset}"а не просто "$ZSH_VERSION"дозволяє перед вами можливість, що ви зробили set -o unset, варіант, який викликає посилання на невизначену змінну як помилку.)


1

Я можу придумати кілька сценаріїв.

  1. zshне входить /etc/shells, і ОП бажає використовувати його без необхідності набору zshв командному рядку. Можливі рішення.

    а) використовуйте трюки з профілем, щоб виконати його під час входу. Це так само ефективно, як і фактично зміна оболонки.

    б) благаю адміністратора додати zshйого, /etc/shellsщоб ви могли chshдо нього

    в) благайте адміністратора змінити вашу оболонку. це не мудро, тому що це втратить вам здатність до участі ftp. Ви можете користуватися лише в тому ftpвипадку, якщо у вас є оболонка/etc/shells

  2. Користувач бажає вийти з обмеженої оболонки, швидше за все, rbashабо rsh.

    Якщо .profileвін редагується, його PATHможна розширити, відредагувавши його. Отримавши /binшлях, ви можете починати bashзсередини rsh/rbash, отримуючи доступ до chshкоманди, яка дозволяє вам змінювати оболонки. У багатьох командах є вхідні оболонки, які можна використовувати для виходу з обмеженої оболонки та відновлення доступу до неї chsh.

  3. chshнасправді не працює з якоїсь іншої причини. рішення a з можливості 1 - це також відповідь і тут.

Сценарій 2 - єдина причина фактично змінити оболонку за замовчуванням (вона занадто обмежує).


-3

Я не думаю, що надана відповідь насправді робить zshоболонку за замовчуванням. Це просто змінює оболонку на zsh, як тільки користувач увійде в свою оболонку за замовчуванням . Користувач все одно увійде до свого, DEFAULT SHELLале при цьому оболонка зміниться наzsh

Щоб змінити стандартну оболонку:

usermod -s /path/to/shell username 

Ви повинні мати корінь для цього.

Інакше вищезгадане вирішення стане корисним.

Додано з коментаря

chsh -s /path/to/zsh  # considered as standard as compared to usermod

і користувач може викликати його на себе.


4
У запитанні досить чітко зазначено, що змінювати базу даних користувачів системи (біт, який потрібно зробити root у цій відповіді) - це не варіант.
Калеб

3
chsh -s /path/to/zshє більш стандартним і зазвичай (але не завжди) не вимагає кореневого доступу, на відміну від usermodцього завжди. Тож у вашій відповіді є більше проблем, ніж у тому, що в цьому запитанні вже не працює.
Жил 'ТАК - перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.