web-dev-qa-db-ja.com

rootアクセスなしでzshをデフォルトのシェルにする

学校のコンピュータを使用しており、zshではなくbashを使用したいと考えています。デフォルトのシェルにしたいのですが、管理者権限がないため、$ chsh -s $(which zsh)などのコマンドを実行できません。

.bashrcに何かを入れたり、回避策として開いたときに自動的にzshを呼び出す方法はありますか?

明確にするために、zshはすでにインストールされています。

56
goodcow

ホームディレクトリに.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を使用して、$PATHの値に依存するzshの動的パスを取得することもできます。

export Shell=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$Shell" -l
73
konsolebox

通常、chshは非rootユーザーとして使用できます。ただし、通常はNISやLDAPなどの何らかのネットワークユーザーデータベースを使用するサイトでは、この機能が無効になることがあります。代わりにypchsh(NIS)またはchsh.ldap(LDAP)が存在する可能性があります。

chshは通常、一部の承認済みシェルも許可します。通常、/etc/shellsにリストされているシェルです。

サイトでchshまたはそのバリアントを使用できない場合は、ログインシェルをexecにお気に入りのシェルに配置し、Shell変数が好きなシェル。

  • ログインシェルがshdashまたはkshの場合:編集する必要があるファイルは~/.profileです。このファイルはインタラクティブセッションの最初と一部の非インタラクティブセッションスタートアップスクリプト(X11セッションの場合など)によって読み取られるため、注意が必要です。execのみを呼び出します(現在のプロセス)現在のシェルがインタラクティブな場合。 Bourneシェル(Solaris 10以前の/bin/sh)を除いて、オプションリスト($-)に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を実行できない場合は、実行する人と話してください

使用しているシステムがchshが機能しないように構成されているため、たとえば、システムがNISまたはLDAPではなくNISまたはLDAPを使用しているため、chshを非ルートとして使用できない可能性があります。 _/etc/passwd_ファイルだけです。あるいは、システムの管理者が何らかの制御を維持したいだけかもしれません。

シェルを変更する手順は、組織のポリシーによって異なります。 chshが通常行うことを実行するローカルコマンドがある場合があります。または、シェルの変更をリクエストするサポートチケットを送信する必要がある場合があります。

他のほとんどの回答は適切ですが、管理者が合理的に対応している場合は、起動スクリプトをハッキングする必要はありません。ログイン後、管理者が自分のアカウントを更新するまで_zsh -l_を手動で呼び出すだけです。

留意すべきもう1つのこと:異なるシェルが同じ起動ファイルを使用することがあります。たとえば、shbashはどちらも_$HOME/.profile_を実行でき、cshtcshはどちらも_$HOME/.login_と_$HOME/.cshrc_(ただし、_.bashrc_、_.bash_profile_、_.tcshrc_などのシェル固有の起動ファイルはこれらをオーバーライドできます)。デフォルトのシェルが_/bin/csh_であり、_/bin/tcsh_を使用する場合、_.login_を更新して_/bin/tcsh -l_を呼び出すと、無限ループが発生する可能性があります。 zshbash固有の起動ファイルを実行することはないので、それは問題ではありません。

ほとんどのシェルは、実行しているシェルを識別する変数を設定します(_$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_を実行した可能性があります。これは、未定義の変数への参照をエラーにするオプションです。)

2
Keith Thompson

コマンドchshはまさにこの目的のためだと思います。ただし、すべてのLinux/Unixディストリビューションがそれをサポートしているとは限りません。 chshのmanページを確認してください。

1
cinsk

いくつかのシナリオを考えることができます。

  1. zsh/etc/shellsにはなく、OPはコマンドプロンプトでzshと入力せずにそれを使用したいと考えています。可能な解決策。

    a)ログイン時にプロファイルトリックを使用して実行します。これは、実際にシェルを変更するのと同じくらい効果的です。

    b)管理者にzsh/etc/shellsに追加して、chshを追加できるようにしてください

    c)管理者にシェルを変更するよう依頼してください。 ftpを使用できなくなるため、これは賢明ではありません。/etc/shellsにシェルがある場合にのみ、ftpを使用できます。

  2. ユーザーは制限付きのシェル(ほとんどの場合rbashまたはrsh)をエスケープしたい。

    .profileが編集可能な場合、PATHは編集して展開できます。 /binがパスに含まれると、rsh/rbash内からbashを起動し、chshコマンドにアクセスしてシェルを変更できます。多くのコマンドには、制限付きのシェルをエスケープしてchshへのアクセスを回復するために使用できるシェルエスケープがあります。

  3. chshは、他の何らかの理由で実際には機能しません。可能性1からのソリューションaもここでの答えです。

シナリオ2は、デフォルトのシェルを実際に変更する唯一の理由です(制限が厳しすぎます)。

1
Chuck