Sshでコマンドを使用したい:
ssh myuser@myhost mycommand
しかしそうすることで、私はいつも得ます:
sh: mycommand: command not found
以下を使用すると明らかに機能します:
ssh myuser@myhost /usr/local/bin/mycommand
そして、私はその理由を理解します。それは、コマンドが何らかの理由で非ログインシェルで実行されるためです。
Sshコマンドで完全なコマンドまたはその他のパラメーターを使用することは、私のシナリオではオプションではありません。私のコマンドは、このホスト以外のすべてのホストで操作および操作できないスクリプトによって実行されます。
問題を引き起こしているホストはSynology NASであり、その/ etc/passwd設定myuserは次のとおりです。
myuser:x:1048:100::/var/services/homes/myuser:/bin/sh
再び:
できます:
私はしたくないわけではありません:
さて、さらなる調査で、他のすべてのホストでmycommandが実際に/ usr/binnot/ usr/local/bin内これは、synologyの奇妙な "ソフトウェアストア"(またはそれが何であれ)を除いて、すべてのパッケージマネージャーが/ usr/binにインストールしているためです。
私は「汚い」方法をとり、シンボリックリンクを作成しました:/ usr/bin/mycommand>/usr/local/bin/mycommand:
ln -s /usr/local/bin/mycommand /usr/bin/mycommand
ここで、同様の問題に直面しているすべての人のために:/ usr/local/binが存在する理由があり、私の解決策にはリスクがあるかもしれません。しかし、それが最も簡単で最速であり、私はすでにこの問題に多くの時間を費やしてきました。私の状況では、すべてのsshキーはいずれにしても1つのコマンドのみに制限されるため、私は特に気にしません。
とにかく:これら2つの場所の違いについてもっと知りたい場合は、この投稿をお勧めします: https://askubuntu.com/a/308048
おそらく、あなたの$PATH
には/usr/local/bin
が含まれていません。これはSSHなので、3つの方法が頭に浮かびます。
Sshd構成でPermitUserEnvironment
が有効になっている場合、~/.ssh/environment
にPATH
を設定できるはずです(これはサーバーのホームディレクトリにあるファイルです— NAS)。
Sshd設定を編集できる場合は、SetEnv PATH=/bin:/usr/bin:/usr/local/bin
(など)を使用してパスを設定できるはずです。少なくともOpenSSHを使用している場合は。
サーバーの設定によっては、ssh client'sSetEnv
オプションを使用してサーバーにPATHを送信することができます。これは、クライアントマシンの~/.ssh/config
ファイルで設定できます。
OpenSSHサーバーとクライアント構成ファイルの両方に、特定のクライアント/サーバーに限定されたオプションを含めることができることに注意してください。たとえば、クライアント設定では、次のようなことができます。
Host myhost
SetEnv PATH=/bin:/usr/bin:/usr/local/bin
1つのサーバーに対してのみそれを行うには。ブロックは次のブロックが始まるまで続きます(たとえば、別のHost …
ブロック)。インデントは視覚的にわかりやすくするためのものです。
OpenSSH構成ファイルは、ssh_config
およびsshd_config
のマニュアルページに記載されています。