MacOSにSSH接続するときにPATHを設定する

MacOSにSSH接続するときにPATHを設定する

私の問題は

$ ssh localhost fswatch          
bash: fswatch: command not found

SSH コマンド (つまり fswatch) がない場合でも正常に動作します。

SSHセッションのPATHはMacのデフォルトであることがわかりました

$ ssh localhost echo \$PATH        
/usr/bin:/bin:/usr/sbin:/sbin

SSHなしでは

$ echo $PATH
/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

PATH をどのように設定したかはよく覚えていませんが、 PATH 変数~/.bashrc~/.bash_profile編集していません。設定ファイルがあります/etc/paths:

$ cat /etc/paths         
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Homebrew、npm、pip は通常、プログラムを にインストールするため、インストールされたプログラムはすべてそこにあり、 MacOS では/usr/local/bin経由でアクセスできません。Linux では問題はありません。ssh localhost command

私の質問は/etc/pathsOpenSSHを設定してPATHを使用する方法/etc/paths.d?

私もハッキングを試みました:

$ ssh localhost sh -lc 'echo empty;echo $PATH'

/usr/bin:/bin:/usr/sbin:/sbin
$ ssh localhost bash -lc 'echo empty;echo $PATH'

/usr/bin:/bin:/usr/sbin:/sbin

最初の行は常に空ですが、その理由をご存知ですか?

そして私の最終的な回避策

$ ssh localhost bash -lc ':; 
    export PATH="$( cat /etc/paths /etc/paths.d/* | tr \\\\n : )"; 
    echo $PATH; 
    fswatch --version'
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Applications/VMware Fusion.app/Contents/Public
fswatch 1.14.0
Copyright (C) 2013-2018 Enrico M. Crisostomo <[email protected]>.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Enrico M. Crisostomo.

ここで最初の:;コマンドが重要な理由は、最初のコマンドが何らかの理由で実行から削除されるからです。

システム: MacOS Mojave 10.14.5
ssh -V:OpenSSH_7.9p1, LibreSSL 2.7.3
bash --version GNU bash, version 5.0.7(1)-release (x86_64-apple-darwin18.5.0)

答え1

SSH サーバーを設定して、カスタムPATH変数を含むカスタマイズされた環境をクライアントに提供することができます。次の 2 つの設定を行う必要があります。

  1. ~/.ssh/environmentサーバー上に次の内容を含むファイルを作成します。

    PATH=/Users/kyb/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  2. SSH サーバー構成ファイルを変更して/private/etc/ssh/sshd_config、次の行を追加します。

    PermitUserEnvironment PATH,LANG
    

最後に、サーバー上の SSH デーモンを再起動/リロードします。SSH ログイン クライアントはカスタマイズされた環境にアクセスできるようになります。

答え2

私のシステムでは.bashrcこれを編集して一番上に:

PATH=/my/path:$PATH

以下の前に置くことが重要です:

# If not running interactively, skip the rest
[ -z "$PS1" ] && return

答え3

私の回答では、Bourne Again SHell を使用していると想定していますが、他のほとんどのシェルにも次のことが当てはまります。

このような動作が発生する理由は、コマンドが対話型シェルではなく非対話型シェルで実行されるためです。

ユーザーの ID がサーバーによって承認されると、サーバーは非対話型セッションで指定されたコマンドを実行するか、コマンドが指定されていない場合はマシンにログインして対話型セッションとしてユーザーに通常のシェルを提供します。リモート コマンドまたはシェルとのすべての通信は自動的に暗号化されます。

-$ man ssh

.bashrcどこかで変数を拡張しているのではないかと思います。ただし、対話型シェルを実行しないと、PATHBASH はファイルを解釈しません。.bashrc

いつログイン シェルではない対話型シェルが起動されると、bash は /etc/bash.bashrc および ~/.bashrc ファイルが存在する場合、そこからコマンドを読み取って実行します。

-$ man bash

したがって、この問題の最も簡単な解決策は、次のように実行可能ファイルへの完全なパスを指定することです。$ ssh localhost /full/path/to/fswatchこれは、この問題に対する最も安定した安全な解決策であり、常に機能します。

に接続するときは、localhost次のコマンドを利用できますwhich: $ ssh localhost $(which fswatch)。ただし、別のホストに接続する場合は、おそらくこれは機能しません。

もう一つの可能​​な方法は、非対話型シェルのリモート ホストの環境変数を操作することですPATH( @hedgie の回答を参照)。ただし、これはセキュリティ上の問題を引き起こすため、本番環境では使用しないでください。

環境処理を有効にすると、ユーザーは LD_PRELOAD などのメカニズムを使用して、一部の構成でアクセス制限を回避できるようになります。

-man sshd_config

関連情報