web-dev-qa-db-ja.com

sshセッションのシェルを指定する

ユーザーwww-dataとしてssh経由でリモートサーバーにログを記録しています。サーバー上のユーザーwww-dataのデフォルトシェルは/bin/shに設定されており、ログインすると、シェルとしてダッシュが表示されます。次に、bashと入力してbash Shellを取得します。

Sshでログインするときにbashに直接ログインしたいのですが、サーバーのデフォルトのシェルを変更したくありません。私の変更はsshセッションにのみ影響します。

公開鍵の前にcommand="/bin/bash".ssh/authorized_keysに入れてみましたが、これには別の副作用があります。ログイン時にbashがデフォルトのシェルとして機能する一方で、scpが機能しなくなりました。リモアサーバーとの間でファイルをscpできなくなりました。

他のアプリケーションを壊すことなく、bashをsshセッションのデフォルトのシェルとして設定するにはどうすればよいですか?

3
Martin Vegter

使用している1つのシステムで同様の問題があります(デフォルトのシェルはbashですが、ksh93が必要ですが、chshが機能しません)。

私の解決策は、あなたの状況に合わせて、exec~/.profileから目的のシェルを起動することです。これは、Dashが起動時に読み取るものです。 ~/.profileまたは~/.bash_profileが見つからない場合を除き、Bashは~/.bash_loginに触れません(この順序で、Bashのマニュアルを参照してください)。

# in ~/.profile:
if [ "$Shell" != "/usr/bin/bash" -a -n "$SSH_TTY" -a -x /usr/bin/bash ]; then
    export Shell="/usr/bin/bash"
    exec $Shell -l
fi

SSHはインタラクティブなSSHセッションでSSH_TTYを設定するため、Bashが使用可能であることを確認して実行する前に、それが設定されているか(空でない文字列)を確認します。他のアプリケーションがそれを見た場合に備えてShellを設定してエクスポートし、~/.bash_profile~/.bash_loginの両方が欠落しているためにBashが無限ループに陥って実行を試みないようにします~/.profile再び。

5
Kusalananda