現在、認証に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
ログインシェルが一部のマシンで実行できない場合、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 '。