SSHログインにデフォルト以外のログインシェルを使用する方法

SSHログインにデフォルト以外のログインシェルを使用する方法

現在、認証にLDAPを使用するネットワークで作業しています。zshログインシェルに設定した後、まだインストールされてsshいないように見えるネットワーク上のコンピュータからリモートでアクセスできませんでしたzsh。ログインが失敗して表示されます。

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

したがって、質問は基本的に次のようになります。 LDAPで設定されているものとは異なるログインシェルを使用するようにリモートコンピュータにどのように指示しますか?

OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e

ベストアンサー1

一部のシステムでログインシェルが実行されていない場合は、SSHまたは他のほとんどの方法でそのシステムにログインできません。 SSH サーバーは常にログインシェルを実行します。コマンドラインからコマンドを渡すと、sshコマンド文字列1を引数として使用してログインシェルが実行されます。-cそれ以外の場合、ログインシェルは引数なしでログインシェルとして実行されます。

ログインシェルをバイパスする方法がある場合、これはセキュリティホールになります。アカウントのログインシェルを1つの特定のタスクのみを実行するプログラムに設定することで、アカウントを制限付きアカウントとして構成できます。git-shellgitリポジトリへのアクセスのみを許可するrssh、等。

このコンピュータにログインするには、/bin/zsh存在するように準備するか、ログインシェルが存在するように変更する必要があります。

このような異機種環境では、/bin/shどこにでも存在するログインシェルを使用することをお勧めします。 zshを対話型シェルとして使用できるように、環境変数を(存在する場合)SHELLに設定します。/bin/zsh

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

これにより、ハードコーディングを避けることができますzsh

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

テキストモードログイン用にzshを自動実行するには.profile.zprofile存在しないので推奨しません)。対話型ログインの場合にのみこれを実行し、.profileスクリプトによって実行されるか、GUIモードのログイン中に実行しないでください。

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

1 SSH クライアントは、オプションではなく引数を中間スペースに関連付け、結果の文字列を接続を介して送信します。 SSHプロトコルは、コマンドを文字列リストではなく文字列として定義します。

おすすめ記事