web-dev-qa-db-ja.com

sshで非対話型コマンドを実行すると、.bashrcが読み取られるのはなぜですか

各bash構成ファイル(~/.bashrc~/.bash_profile~/.profile)の前にecho NAME_OF_FILEを追加しました。つまり、~/.bashrcでソースを取得すると「.bashrc」を取得します。

私を困惑させているのは、sshでコマンドを実行すると、〜/ .bashrcが含まれることを示す理由です。例:私がそうする場合:

ssh localhost echo hi

私は得る

.bashrc
hi

このコンテキストで~/.bashrcを取得するのはなぜですか?これは非対話型のbashセッションを実行する必要があるため、ソースを取得するべきではありませんか?

確かに、ssh localhost ttyは私に「ttyではなく」を取得します(「.bashrc」の前に、~/.bashrcがそれにもかかわらずソースされることを示します)。

~/.bashrcでソースするコマンドのすべての構成ファイルを明示的にgreppedしましたが、それを説明するものはありません。

tty -s && shopt -q login_Shell && [[ -r ~/.bashrc ]] && . ~/.bashrcには.bash_profileしかないので、インタラクティブなログインシェルでも「.bashrc」を取得できますが、これはsshの問題を説明していません。コメントアウトできますが、上記のsshの例でも同じ動作が得られます)

どうすればこれをデバッグできますか?

4
PSkocik

bashのマニュアルページから:

Bash attempts to determine when it is being run with its standard input
connected to a a network  con‐nection,  as  if  by  the remote Shell daemon,
usually rshd, or the secure Shell daemon sshd.  If bash
determines it is being run in this fashion, it reads and executes commands
from  ~/.bashrc,  if  that file  exists and is readable.

つまり~/.bashrcは、ttyを持っているかどうかに関係なく、sshを介して呼び出すと実行されます。

インタラクティブなときに.bashrcのみを実行したい場合は、上部でこれを試してください。

# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return

それがうまくいかない場合は、これを試してください:

[ -z "$PS1" ] && return
8
Lqueryvg