web-dev-qa-db-ja.com

sshおよび非絶対コマンドを使用する場合の「コマンドが見つかりません」

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

再び:

できます:

  • myhostにmyuserとしてssh
  • which mycommandによって提供される絶対パスを使用して、myuserとして実行します
  • すでにmyhostにあるときに(sshを介して)mycommand(非絶対)を実行する

私はしたくないわけではありません:

  • 実行:ssh myuser @ myhost mycommand(非絶対、追加パラメーターなし)
2
Simon

さて、さらなる調査で、他のすべてのホストで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

2
Simon

おそらく、あなたの$PATHには/usr/local/binが含まれていません。これはSSHなので、3つの方法が頭に浮かびます。

  1. Sshd構成でPermitUserEnvironmentが有効になっている場合、~/.ssh/environmentPATHを設定できるはずです(これはサーバーのホームディレクトリにあるファイルです— NAS)。

  2. Sshd設定を編集できる場合は、SetEnv PATH=/bin:/usr/bin:/usr/local/bin(など)を使用してパスを設定できるはずです。少なくともOpenSSHを使用している場合は。

  3. サーバーの設定によっては、ssh client'sSetEnvオプションを使用してサーバーにPATHを送信することができます。これは、クライアントマシンの~/.ssh/configファイルで設定できます。

OpenSSHサーバーとクライアント構成ファイルの両方に、特定のクライアント/サーバーに限定されたオプションを含めることができることに注意してください。たとえば、クライアント設定では、次のようなことができます。

Host myhost
    SetEnv PATH=/bin:/usr/bin:/usr/local/bin

1つのサーバーに対してのみそれを行うには。ブロックは次のブロックが始まるまで続きます(たとえば、別のHost …ブロック)。インデントは視覚的にわかりやすくするためのものです。

OpenSSH構成ファイルは、ssh_configおよびsshd_configのマニュアルページに記載されています。

2
derobert