ユーザーが/bin/bash
シェルを持ってい/etc/passwd
て、ssh user@host command
Bashを使ってコマンドを実行するとします。ただし、シェルはログインも操作もできません。つまり、ログインもソースも提供できない~/.bash_profile
ことを意味します~/.bashrc
。この場合、PATH
実行ファイルを見つけて実行できるように環境変数をどのように設定する必要がありますか?実際のコマンドの前にプレフィックスを付けることをお勧めしますsource ~/.bashrc
か?
編集する。この問題は(人々が指摘したように)Bashにとってはマイナーな問題です。~/.bashrc
はいこのような状況から来ています。最終的な回答は次の節にありますman bash
。
Bashは、リモートシェルデーモン(通常はrshd)またはセキュアシェルデーモンsshdによって実行されている場合など、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとします。
bash
このように実行中であると判断された場合、~/.bashrc
ファイルが存在し、読み取れる場合はコマンドを読み込み実行します。として呼び出されると、これは行われませんsh
。この--norc
オプションを使用すると、この動作を抑制し、--rcfile
他のファイルを強制的に読み取るために使用できます。ただし、rshdまたはsshdは通常、これらのオプションを使用してシェルを呼び出すか、指定を許可しません。
答え1
いくつかの可能性があります:
PATH
サーバーで設定します~/.ssh/environment
(PermitUserEnvironment yes
経由で有効にする必要がありますsshd_config
)。- バイナリファイルのフルパスを使用してください。
- 前述のように手動でsource
.bashrc
:コマンドの前に. ~/.bashrc
(またはsource
)を付けます。
どの方向に行くかは、ユースケースによって大きく異なります。
答え2
あなたは同等です地元のに設定離れて設定。
ローカルで現在実行されているシェルであるbashインスタンスに次のものを作成できます。
ssh user@host command
sshコマンドはクライアントsshとして実行されます(それ以上ではありません)。
このために、地元の住宅要件いいえサブシェルまたは新しいシェルを起動またはログインします。
このコマンドの実行モードはls
ローカルです。
これは、コンピュータへのネットワーク接続を開くために使用されるクライアントSSHコマンドです。離れてシステムが正しく認証された場合新しいシェルは ssh 引数で作成されたコマンドの実行を開始します。引数が指定されていない場合は、接続でより多くのコマンドが実行されると予想されます。
その新しいもの離れてリモートユーザー(システム)がログインするには認証が必要なので、シェルは必ずログインシェルです。あるいは、特定のコマンドが提供されたら、認証されたユーザー権限でそのコマンドを実行するだけです。
$file sourced
各ファイルの先頭にを追加すると、どのファイルがどこから来たのかを確認できます。離れてシステム)(/etc/
ファイルを変更するにはルートが必要です):
$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done
次にSSHコンソールを起動します。
$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read
この場合、bashrc
両方のファイルを読み取る理由は、profile
ログインシェルがファイルを直接インポートするのではなく、各ファイルにそのファイルを含むコマンドがあるためです。
$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read
このシステムでは、bashrc
両方のケースでwhereを読み込みます。
source ~/.bashrc
実行するコマンドにaを追加する必要はありません。
パスの変更
/etc/bash.bashrc
このシステムでシェルを実行しているすべてのユーザーの正しい設定を含む「$ PATH」を変更するだけです。または~/.bashrc
必要なすべてのユーザーに適しています。作成した新しいユーザーが正しいファイルを使用できるように、.bashrc
ユーザーのフレームを追加(または編集)できます。/etc/skel/
上記はbashでのみ機能します。この設定をすべてのシェルに適用する必要がある場合は、SSHファイルを使用して~/.ssh/environment
必要なユーザーごとに環境変数PATHを設定できます。または、/etc/ssh/sshrc
SSHサーバーを実行しているシステムのグローバル設定の場合(man sshd
詳細については、マニュアルのセクションを参照してください)
答え3
ワンタイム動作が必要でリモートホストのSHELLがbashの場合は、次のように直接実行できます。
ssh user@host "PATH=/foo/bar command"
SHELLがbashではない場合は、次のことができます。
ssh user@host "bash -c 'PATH=/foo/bar command'"
答え4
~/.ssh/rc
ファイルからコマンドを実行し、PATHまたは他の環境変数を設定できます。 ~から人間SSH:
~/.ssh/rc
このファイルのコマンドは、ユーザーがログインしたときにユーザーのシェル(またはコマンド)が開始される直前にsshによって実行されます。詳細については、sshd(8) のマニュアルページを参照してください。
SSHDマニュアルLogin process
これは完全な説明に記載されています:
- ~/.ssh/rcがある場合は実行し、そうでない場合は/etc/ssh/sshrcがある場合は実行し、そうでない場合はxauthを実行します。 「rc」ファイルにはX11認証プロトコルと標準入力Cookieがあります。以下のSHRCCを参照してください。
このファイルの主な目的は、ユーザーのホームディレクトリにアクセスする前に必要な初期化ルーチンを実行することです。 AFSは、この種の環境で特別なケースです。
これは2013 BSDマニュアルからのものです。最新の2020 Arch Linux BSDマニュアルには、次の詳細が記載されています。
- ~/.ssh/rc が存在し、sshd_config(5) PermitUserRC オプションが設定されている場合はこれを実行し、そうでない場合は /etc/ssh/sshrc が存在する場合はそれを実行し、そうでない場合は xauth を実行します。 「rc」ファイルにはX11認証プロトコルと標準入力Cookieがあります。以下のSHRCCを参照してください。
~/.ssh/rc
おそらく、この設定が私には適していないからです。
sshd
ユーザーのログインスクリプトが実行される手順が見つかりません。たぶんssh設定スクリプトに設定されているかもしれません(この場合はディストリビューションによって異なります)。