web-dev-qa-db-ja.com

Unixは、sshを実行するときにパス内のワイルドカードが機能しないことを検出します

検索パスに*が含まれるこのコマンドは、ローカルサーバーで正常に機能します

Svr1$ find /path/*/foo/ -name "*20160208"

別のサーバーからリモートでこれを試してみると、機能しません

Svr2$ ssh Svr1 find '/path/*/foo/' -name "*20160208*"

エラーメッセージは次のとおりです。

find: stat() error /path/*/foo/: No such file or directory

ただし、*を使用しないように検索パスを変更すると、正常に機能します。このような:

Svr2$ ssh Svr1 find '/path/' -name "*20160208*"

私が間違っていることについて何か考えはありますか?

どうもありがとう。

3
LLJ

問題は、findコマンドがディレクトリグロブ(シークする必要のあるディレクトリリスト)を補間/解釈せず、一致する必要のあるグロブとしてパターンを補間するだけであるということです。ディレクトリグロブを解釈するのは、実行するシェル自体ですfind内部。 ssh経由でfindを実行すると、このジョブを実行するシェルはありません。

幸いなことに、sshを介してシェルを実行することに対する規則はなく、必要なすべてのものを補間し、残りのワイルドカードをfind自体に保持して、シェルにコマンドを実行させます。

私が自分のマシンで使用したもののようなもの:

ssh lx@localhost "bash -c '/usr/bin/find /tmp/d* -name \"f*\" '"
lx@localhost's password:
/tmp/d1/f1
/tmp/d2/f2
4
Gombai Sándor

あなたがそれを書く方法はローカルホストで評価されます、それは通常あなたが望まないものです。他のホストで評価するには、シーケンスをエスケープする必要があります。このような何かがそれをするべきです:

Svr2$ ssh Svr1 "find /path/*/foo/ -name \"*20160208*\""
0
Jakuje