Создание оболочки zsh по умолчанию без доступа root

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

Есть ли способ, которым я могу поместить что-то в свой .bashrc или что-то, что автоматически вызывает zsh при его открытии в качестве обходного пути?

Чтобы уточнить, zsh уже установлен.

Создайте .bash_profile в своем домашнем каталоге и добавьте следующие строки:

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

Обновление: .profile может работать как общее решение, если по умолчанию shell не bash. Я не уверен, что .profile может вызывать .profile может быть лишним, но мы можем сделать это безопасно с простой проверкой:

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

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

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

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

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

Если вы не можете использовать chsh или его варианты на своем сайте, тогда организуйте свою оболочку для входа в свою любимую оболочку и установите для переменной SHELL свою любимую оболочку.

  • Если ваша оболочка входа – sh , dash или ksh : файл, который вам нужно изменить, – ~/.profile . Помните, что этот файл читается в начале интерактивного сеанса, а также с помощью некоторых неинтерактивных сценариев запуска сеанса (например, для сеансов X11), поэтому вам нужно позаботиться: только вызов exec (который заменяет текущий процесс), когда текущая оболочка является интерактивной. За исключением оболочки Bourne ( /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 или администратора

Я считаю, что команда, chsh для этой цели. Хотя, я не уверен, что каждый дистрибутив Linux / Unix поддерживает это. Проверьте страницу man chsh .

Если вы не можете запустить chsh потому что у вас нет прав администратора, поговорите с тем, кто это делает .

Скорее всего, вы не можете использовать chsh как non-root, потому что используемая вами система настроена так, что 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 specific startup, так что это не проблема для вас.

Большинство оболочек задают переменные, которые определяют, какую оболочку вы используете ( $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. zsh не находится в /etc/shells , и OP хочет использовать его без необходимости вводить zsh в командной строке. Возможные решения.

    a) использовать трюки профиля, чтобы выполнить их при входе в систему. Это так же эффективно, как и фактическое изменение оболочки.

    b) попросите администратора добавить zsh в /etc/shells чтобы вы могли chsh к нему

    c) попросите администратора изменить оболочку. это не мудро, потому что это потеряет вам возможность ftp . Вы можете использовать ftp только в том случае, если у вас есть оболочка в /etc/shells

  2. пользователь хочет избежать ограниченной оболочки, скорее всего, rbash или rsh .

    Если .profile доступен для редактирования, PATH можно расширить, отредактировав его. Как только /bin находится в пути, вы можете запустить bash изнутри rsh/rbash , получив доступ к команде chsh чтобы вы могли менять оболочки. Многие команды имеют оболочки, которые можно использовать для выхода из ограниченной оболочки и восстановления доступа к chsh .

  3. chsh действительно не работает из-за какой-то другой причины. решение а от возможности 1 также является ответом.

Сценарий 2 является единственной причиной фактического изменения оболочки по умолчанию (она слишком ограничительная).

Я не думаю, что предоставленный ответ на самом деле делает zsh оболочкой по умолчанию. Он просто меняет оболочку на zsh, как только пользователь входит в свою оболочку по умолчанию . Пользователь по-прежнему будет входить в свой DEFAULT SHELL но с этим оболочка изменится на zsh

Чтобы изменить использование оболочки по умолчанию:

 usermod -s /path/to/shell username 

Для этого вы должны быть root.

В противном случае это решение будет полезно.

Добавлено из комментария

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

и он может быть вызван пользователем для него самого.