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

52

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

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

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

goodcow
источник
2
Да, просто добавьте zshв .bashrcфайл. Выйдите из системы и войдите и все готово!
Федорки
Прости за это. Но чтобы закончить вопрос, я просто поставил 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
konsolebox
источник
Что если администратор Linux (root) изменит оболочку по умолчанию на что-то отличное от 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 shell).
пирократизм
@pyrocrasty Действительно. Как сказано в руководстве: «После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения. «.
konsolebox
Он работал для настройки нового профиля терминала с помощью команды « Выполнить пользовательскую» вместо того, чтобы моя оболочка была изменена на zsh. .bash_profileи .profileне работал (файлы даже не выполнялись, Fedora 26 на университетском компьютере).
lmaooooo
12

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

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

Если вы не можете использовать chshили его варианты на своем сайте, тогда организуйте для вашей оболочки входа execвашу любимую оболочку и установите 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 и read .bash_profile, поэтому даже там вы должны быть осторожны, чтобы не вызывать execнеинтерактивную оболочку.

  • Если ваша оболочка входа - csh или tcsh, см. Пример в разделе Изменение оболочки по умолчанию без привилегий chsh или администратора.

Жиль "ТАК - перестань быть злым"
источник
1

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

cinsk
источник
Некоторые системы также имеют это как passwd -s.
Стефан Шазелас
1

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

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

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

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

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

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

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

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

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

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

цыпленок
источник
-3

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

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

usermod -s /path/to/shell username 

Вы должны быть пользователем root, чтобы сделать это.

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

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

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

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

PradyJord
источник
4
Вопрос довольно ясно говорит о том, что модификация базы данных пользователей системы (бит, который вам нужен, чтобы сделать root в этом ответе) не вариант.
Калеб
3
chsh -s /path/to/zshявляется более стандартным и обычно (но не всегда) не требует root-доступа, в отличие от того, usermodкоторый всегда есть. Таким образом, ваш ответ имеет больше проблем, чем то, что вопрос уже утверждает, что не работает.
Жиль "ТАК - перестань быть злым"