SSH経由でコマンドを使用したいです。
ssh myuser@myhost mycommand
しかし、これを行うと、常に次のような結果が得られます。
sh: mycommand: command not found
以下を使用すると明らかに動作します。
ssh myuser@myhost /usr/local/bin/mycommand
理由を理解します。コマンドはログインではなくシェルで実行されるためです。
私のシナリオには、コマンド全体またはsshコマンドの他のパラメータを使用するオプションはありません。私のコマンドは私が触れることができないスクリプトによって実行され、それ以外のすべてのホストで動作します。
私に問題を引き起こすホストは、Synology NASとその/etc/passwd設定です。私のユーザー例:
myuser:x:1048:100::/var/services/homes/myuser:/bin/sh
再:
私はできます:
- myuserでmyhostへのSSH接続
- 下記の絶対パスを使用してmyuserとして実行します。私のコマンドは
- すでにmyhostにある場合(ssh経由)、mycommand(絶対ではない)を実行します。
私は助けることはできませんが、欲しい:
- 実行:ssh myuser@myhost mycommand(絶対ではない、追加のパラメータなし)
答え1
おそらくあなたのものにssh$PATH
は含まれていません/usr/local/bin
。私は3つの方法を考えました。
sshd構成で有効になっている場合は、
PermitUserEnvironment
これを設定できる必要がありますPATH
(~/.ssh/environment
これはサーバー(NAS)のホームディレクトリにあるファイルです)。SetEnv PATH=/bin:/usr/bin:/usr/local/bin
sshd設定を編集できる場合は、(etc)を使用してパスを設定できる必要があります。少なくともOpenSSHを使用している場合。SSHを使用できます顧客の
SetEnv
サーバー構成に応じてサーバーにPATHを送信するオプション。~/.ssh/config
クライアントコンピュータのファイルでこれを設定できます。
OpenSSHサーバーとクライアント構成ファイルの両方は、特定のクライアント/サーバーに制限されるオプションを持つことができます。たとえば、クライアント構成で次のことができます。
Host myhost
SetEnv PATH=/bin:/usr/bin:/usr/local/bin
1つのサーバーに対してのみこれを実行してください。このブロックは、次のブロック(他のHost …
ブロックなど)が始まるまで続きます。インデントは視覚的な明確さのためにのみ使用されます。
OpenSSH設定ファイルは、ssh_config
およびsshd_config
マニュアルページに文書化されています。
答え2
さて、追加調査の後、他のすべてのホストで私のコマンドが実際に位置していることがわかりました。/usr/bin いいえ存在する/usr/ローカル/空。その理由は、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
答え3
openssh-clientパッケージをアンインストールしてからインストールしてみましたが、動作が始まりました。依存関係パッケージを確認して再インストールしてみてください。
使用されるコマンドは次のとおりです。
sudo apt-get remove openssh-client
sudo apt-get install openssh-client