私は必要です:
次の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
、対話型呼び出しでもログインシェル呼び出しでもありません。user
host
sshd
host
bash -c 'some shell code'
これで、システムのインタプリタが構築されたときにbash
呼び出されたときにbashrcファイルを取得できます。sshd
bash
/* #define SSH_SOURCE_BASHRC */
コメントはありません。config-top.h
ソースファイルの一部のオペレーティングシステム(Debian のような)する。
bash
これらのシステムを使用している場合は、次のことを確認してbashrcが呼び出すかどうかを確認する必要があります。ssh host 'some bash code'
- これは非対話型呼び出しです
bash
。[[ $- != *i* ]]
- それは次のように呼ばれます
bash -c <some-code>
:[[ $- = *c* ]]
。ランタイムを使用すると、-c
bashは通常対話型ではないため、以前の確認は重複していると見なすことができます。bash
として実行する場合は例外ですbash -ic 'some code'
。 - bashと同じヒューリスティックを
ssh
使用するとします。[[ -v SSH_CLIENT || -v SSH2_CLIENT ]]
$SHLVL
bash
例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の異なる表現を含めたくないため、同じでなければなりません。