SSH 経由で見つからないコマンドがいくつかあります

SSH 経由で見つからないコマンドがいくつかあります

ローカルホストで SSH 経由でいくつかのコマンドを実行する際に問題が発生しています。Mac で zsh を使用しています。

% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/TeX/texbin:/usr/local/munki:/opt/X11/bin:/opt/cisco/anyconnect/bin

% ssh localhost echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Library/TeX/texbin:/usr/local/munki:/opt/X11/bin:/opt/cisco/anyconnect/bin

% which docker
/usr/local/bin/docker

% ssh localhost which docker
docker not found

ここで何が間違っているのか分かりませんが、試してみましssh -tたが同じ結果でした。

編集:

コメントありがとうございます。実際は違いますが、なぜでしょうか?

% ssh localhost printenv PATH
/usr/bin:/bin:/usr/sbin:/sbin

答え1

変数の解釈は、コードを実行する前にコマンドラインで行われます。変数をエスケープするか、シングルクォートで囲むことで、SSHサーバーに送信できます。例:

% echo $HOST
tabasco
% ssh mesquite echo $HOST
tabasco
% ssh mesquite "echo $HOST"
tabasco
% ssh mesquite 'echo $HOST'
mesquite
% ssh mesquite echo \$HOST
mesquite
% ssh mesquite "echo \$HOST"
mesquite
% ssh mesquite 'echo \$HOST'
$​HOST
% printenv HOST
tabasco
% ssh mesquite printenv HOST
mesquite

(すべてのホストが$HOSTデフォルトで変数を持っているわけではないことに注意してください。たとえば、BSD など)。

関連情報