web-dev-qa-db-ja.com

sysadminが変更を許可しない場合、bashをログインシェルとして使用するにはどうすればよいですか

私が働いているUNIXシステム管理者は、ログインシェルをkshからbashに変更するアクセス権を与えることに消極的です。彼はさまざまな言い訳をしてきましたが、おもしろいのは、kshのすべてのスクリプトを記述しているので、実行しようとしても機能しないことです。私は彼がこれらのアイデアをどこで手に入れているのかわかりませんが、私は彼を説得することができないので、私に代案はありますか?

(これらのマシンにはchshがインストールされていますが、ログインには公開鍵と秘密鍵のペアを使用しているため、パスワードがありません。そのため、chshからパスワードの入力を求められてもそれを与える。 )

38
iconoclast

ログインすると、ファイル_~/.profile_がログインシェル(ksh)によって読み取られます。そのログインシェルに、自分自身をbashに置き換えるように指示できます。いくつかの予防策を講じる必要があります。

  • 対話型の場合にのみ、ログインシェルを置き換えます。これは重要です。それ以外の場合は、グラフィックモードでのログインが機能しない可能性があります(これはシステムに依存します。一部のシステム(ただしすべてのシステムではxdmなどを使用してログインすると_~/.profile_を読み取るわけではありません))、および_ssh foo '. ~/.profile; mycommand'_などのイディオム失敗します。
  • Bashが使用可能であることを確認します。何らかの理由で実行可能ファイルが存在しない場合でもログインできるようにします。

ログインシェルとしてbashを実行するかどうかを選択できます。ログインシェルにする唯一の大きな違いは、それが_~/.bash_profile_または_~/.profile_をロードすることです。そのため、bashをログインシェルとして実行する場合は、_~/.bash_profile_を使用するか、_~/.profile_から再帰的にbashを実行しないように注意してください。 _~/.profile_をkshではなくbashで実行することには実質的な利点がないため、実行しないことをお勧めします。

また、Shell環境変数をbashに設定して、ターミナルエミュレータなどのプログラムがそのシェルを呼び出すようにします。

これがbashに切り替えるコードです。 _~/.profile_の最後に置きます。

_case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export Shell="$bash"
        exec "$bash"
      fi
    fi
esac
_

これは少し面倒ですが、ホームディレクトリに.profileファイルを作成して、ログイン時にbashをシェルとして使用できます。

Shell=`type -P bash`
exec bash -l

これにより、kshセッションがbashセッションに置き換えられます。ログインするたびに新しいexitセッションを手動で開始する場合のように、bash(または^D)を2回入力する必要はありません。

echo $Shell

bashへのパスも返します。

12
iconoclast

Gilesの回答には、bashの実行時に-lフラグを追加する必要があります。これにより、すべてのログインプロファイルスクリプトが新しいbashシェルで提供されます。 (たとえば、RHELの/etc/profile.d/にあるもの)。スクリプトは次のようになります。

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export Shell="$bash"
        exec "$bash" -l
      fi
    fi
esac
4
rleelr

@Gillesの上位投票に触発されたcsh/tcshの回答は、

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif
1
sameers

Solaris:

usermod -s /bin/bash root
0
hienbuithanh88