web-dev-qa-db-ja.com

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

現在、認証にLDAPを使用するネットワークで作業しています。ログインシェルとしてzshを設定すると、sshを介して、明らかにzshがインストールされていないネットワーク上のマシンの1つにリモートアクセスするという問題に遭遇しました。ログインは失敗します

_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

9
Sascha

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

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

そのマシンにログインするには、/bin/zshが存在するように調整するか、ログインシェルを存在するものに変更する必要があります。

このような異種環境では、ログインシェルとして/bin/shを使用することをお勧めします。これは、あらゆる場所に存在するためです。 Shell環境変数を/bin/zshに設定します(存在する場合)。これにより、対話型シェルとして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からzshを呼び出します。 .zprofileを使用して設定する場合は、ログインシェルにします(ただし、zshが存在しないマシンでは同じ環境を取得できないため、お勧めしません)。これは、.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

¹ SSHクライアントは、オプション以外の引数をスペースで連結し、結果の文字列を接続経由で送信します。 SSHプロトコルは、コマンドを文字列のリストではなく文字列として定義します。

別の方法でアクセスできる場合は、指定したマシンにシェルをインストールするか、管理者に要求してこれを実行するか、LDAPのシェルをリモートマシンに存在するシェルに変更します。

(open)sshdはalwaysユーザーシェルを確認し、実行に渡されたものは何でもalwaysそのシェルを実行します。別のシェルが渡されて実行されると、ユーザーシェルの引数として渡されて実行されます。たとえば、ユーザーシェルは '/ bin/sh'で、引数としてcshシェルを渡すと、 "/ bin/sh -c/bin/csh '。

1
nkms