web-dev-qa-db-ja.com

sshコマンドの実行時にPATHを設定するにはどうすればよいですか?

ユーザーが/bin/bashのシェルとして/etc/passwdを持っていると仮定します。次に、ssh user@Host commandはBashを使用してコマンドを実行します。ただし、そのシェルはログインでもインタラクティブでもありません。つまり、~/.bash_profile~/.bashrcも供給されません。その場合、実行可能ファイルを見つけて実行できるようにPATH環境変数を設定する方法は?実際のコマンドの前にsource ~/.bashrcを付けることをお勧めしますか?

20
Cyker

あなたにはいくつかの可能性があります:

  • サーバーのPATH~/.ssh/environmentに設定します(PermitUserEnvironment yessshd_configで有効にする必要があります)。
  • バイナリへのフルパスを使用します
  • あなたが言及したように、手動でソース.bashrc:コマンドの前に. ~/.bashrc(またはsource)を付けます

それは、ユースケースに大きく依存します。

21
Jakuje

local設定をremote設定と同一視しています。

ローカルでは、bashインスタンス、現在実行中のシェルで記述します。

ssh user@Host command

コマンドssh(それ以上)をクライアントsshとして実行します。
これを行うには、localシェルがサブシェルまたは新しいシェルを起動するか、ログインするためにnotが必要です。

コマンドは、lsコマンドとしてローカルで実行されます。

remoteシステムへのネットワーク接続を開くのはクライアントのsshコマンドであり、正しく認証された場合はnew Shell sshの引数として記述されたコマンドの実行を開始するか、引数が指定されていない場合は、その接続でさらにコマンドが実行されることを期待します。

その新しいRemoteシェルは、ログインするために認証される必要がある(そのシステムへの)リモートユーザーとしてログインシェルになります。または、特定のコマンドが指定されている場合は、認証されたユーザー権限でそのようなコマンドを実行するだけです。

各ファイルの先頭に$file sourcedを追加することで、どのファイルがソースであるかを確認できます(remoteシステム内)(/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が読み取られます。

実行するコマンドにsource ~/.bashrcを追加する必要はありません。

パスを変更

このシステムでシェルを起動するすべてのユーザーの/etc/bash.bashrcに "$ PATH"を変更するための正しい設定を含めるだけです。または、それを必要とするユーザーごとに~/.bashrcで。ユーザーのスケルトン.bashrc/etc/skel/に追加(または編集)して、新しいユーザーを作成し、正しいファイルを利用できるようにすることができます。

上記はbashにのみ有効です。すべてのシェルで機能する設定が必要な場合は、環境変数PATHを、それを必要とするユーザーごとにsshファイル~/.ssh/environmentを使用して設定するとよいでしょう。または、sshサーバーが実行されているシステムのグローバル設定に/etc/ssh/sshrcを使用します(詳細については、man sshdのファイルセクションをお読みください)。

5
Isaac