システム管理者が変更を許可していないときにログインシェルとしてbashを使用するにはどうすればよいですか


38

私が働いているUNIXシステム管理者は、ログインシェルをからkshに変更するアクセス権を与えたがりませんbash。彼はさまざまな言い訳をしてきましたが、最もおかしいのは、スクリプトをすべて書いているので、ksh実行しようとしても動作しないことです。彼がこれらのアイデアをどこから得ているのかわかりませんが、私は彼を納得させることができないので、私が持っている代替案はありますか?

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

回答:


69

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

  • ログインシェルは、対話型の場合にのみ交換してください。これは重要です。さもないと、グラフィックモードでのログインが機能しない場合があり(これはシステム依存です。一部のシステムではなく~/.profile、xdmなどを使用してログインする場合)、イディオムssh foo '. ~/.profile; mycommand'は失敗します。
  • 何らかの理由で実行可能ファイルが存在しない場合でもログインできるように、bashが利用可能であることを確認してください。

ログインシェルとしてbashを実行するかどうかを選択できます。そのログインシェル作るの唯一の大きな違いは、それがロードだろうということです~/.bash_profile~/.profile。したがって、bashをログインシェルとして実行する場合は、aを使用する~/.bash_profileか、bashから再帰的にbashを実行しないように注意して~/.profileください。~/.profilekshではなく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

17
素晴らしい答えです!stackexchangeには、Send A Beerボタンが必要です。これは、私が使用する時間です。
iconoclast

最初にありがとう。.profileログインシェルでのみ機能します(OPが必要)。Windows 10のリモートデスクトップ接続を使用してLinuxワークステーションにログインし、gnomeでターミナルを開きます。zsh私のシステム管理者が私にくれてbashいる間に欲しい。この場合、の.bashrc代わりにスニペットを追加する必要があり.profileます。
週末

12

これは少し厄介ですがbash、ログイン時に使用しているシェルになるように作成することができます.profileホームディレクトリに

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

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

echo $SHELL

へのパスも返しますbash


3
もちろん、実行前に行を追加することで、$ SHELLをかなり簡単に変更できます。
-derobert

2
新しいシェルをログインシェルにもしたい場合は、おそらくそうするべきexec bash -lです。
jw013

1
最後のコメント:typeお勧めwhichます。
jw013

1
わかりません!このようにbash読んで.profile、無限ループを生成しませんか?に沿った何かexec bashがあなたが望むものであることに同意しますが、あなたはあなたのログインkshに対してのみそれを確実にする必要があるので、いくつかのif文が必要です!
バナンイン

1
@ user1129682ないがある場合~/.bash_profile~/.bash_login
ウルリッヒDangel

4

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

-lオプションを追加する理由を説明できますか?私はこれを何ヶ月も問題なく使用しています。
cokedude

1

csh/tcsh@Gillesによる上位投票の1つに触発された答えは

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.