非対話型ログインシェルでテキストを表示する方法

非対話型ログインシェルでテキストを表示する方法

私は必要です:

次のsshコマンドを入力すると、シェルが特定のテキストを表示できるように/ etc / bashrcを変更したいと思います。

ssh user@ip "whoami"

ただし、シェルが非対話型ログインシェルの場合に実行する操作を表すファイルの行を理解していないため、ここで正確に何を変更する必要があるのか​​わかりません。

私が試したこと:

/etc/bashrcを変更しないと、シェルはこのコマンドの後にユーザー名を返すため、$ PS1の値を変更する必要があるようです。変更してみましたが、成功しませんでした。

また、BASH_ENVが非対話型非ログであるシェルにとって重要であることを検索しましたが、私の場合、シェルは非対話型です。ログインシェル。それでは、$BASH_EVNも使用する必要がありますか?これを/etc/bashrcに追加する必要がありますか?

答え1

~/.bashrc同等のシステム全体のファイル(存在する場合)は/etc/bash.bashrc通常、非対話型呼び出しとして読み込まれませんbash。また、呼び出しを介して対話的に読み込まれません。ログインシェル呼び出しは通常バグのある機能と見なされますが、しばしばbash_configファイル調達を通じてこれを解決するための文書化bashrc対話するとき。

ssh user@host 'some shell code'(実行中のログインシェルの場合)はbash、対話型呼び出しでもログインシェル呼び出しでもありません。userhostsshdhostbash -c 'some shell code'

これで、システムのインタプリタが構築されたときにbash呼び出されたときにbashrcファイルを取得できます。sshdbash/* #define SSH_SOURCE_BASHRC */コメントはありません。config-top.hソースファイルの一部のオペレーティングシステム(Debian のような)する。

bashこれらのシステムを使用している場合は、次のことを確認してbashrcが呼び出すかどうかを確認する必要があります。ssh host 'some bash code'

  • これは非対話型呼び出しですbash[[ $- != *i* ]]
  • それは次のように呼ばれますbash -c <some-code>[[ $- = *c* ]]。ランタイムを使用すると、-cbashは通常対話型ではないため、以前の確認は重複していると見なすことができます。bashとして実行する場合は例外ですbash -ic 'some code'
  • bashと同じヒューリスティックをssh使用するとします。[[ -v SSH_CLIENT || -v SSH2_CLIENT ]]
  • $SHLVLbash例1(Sshセッションで再実行される状況を避けるために、この場合は非対話式でbashrc実行してはいけませんが、bashrc明示的にソースがある場合のみ扱います。)[[ $SHLVL = 1 ]]1.これはまだ完璧ではありません。

だから上にbashrc:

if [[ $- != *i* && $- = *c* && (-v SSH_CLIENT || -v SSH2_CLIENT) && $SHLVL = 1 ]]; then
  printf>&2 'I was most likely invoked as ssh host %q\n' "$BASH_EXECUTION_STRING"
  if [[ $BASH_EXECUTION_STRING = whoami ]]; then
    echo Something specific here
  fi
fi

1以下のように(数値$SHLVL = 1比較)ではなく(文字列比較)を実行することに注意してください。$SHLVL -eq 1後者を実行すると、コマンド注入の脆弱性が発生します。。これは$SHLVL、01、0x1...などの数字1の異なる表現を含めたくないため、同じでなければなりません。

関連情報