検索パスに*が含まれるこのコマンドは、ローカルサーバーで正常に機能します
Svr1$ find /path/*/foo/ -name "*20160208"
別のサーバーからリモートでこれを試してみると、機能しません
Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/Sudo -S find /path/*/foo/ -name "*20160208*"
エラーメッセージは次のとおりです。
find: stat() error /path/*/foo/: No such file or directory
ただし、*を使用しないように検索パスを変更すると、正常に機能します。このような:
Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/Sudo -S find /path/ -name "*20160208*"
私は何が間違っているのですか?文字列の一部を引用またはエスケープする必要があると思いますが、理解できません。
どうもありがとう。
*
はローカルシェルによって展開されます。あなたはあなたの議論を引用するべきです
ssh Svr1 /usr/local/bin/Sudo -S find '/path/*/foo/' -name "20160208"
@Matteoが言ったように、ローカルシェルから*
をエスケープする必要があります。彼は最初の例でそれを行いました:
ssh Svr1 /usr/local/bin/Sudo -S find '/path/*/foo/' -name "20160208"
別の方法として、一重引用符('...'
)と円記号(\
)がローカルシェルから*
ワイルドカードを「非表示」にするので、これらのいずれかも機能するはずです。
ssh -t Svr1 /usr/local/bin/Sudo 'find /path/*/foo/ -name *20160208'
または
ssh -t Svr1 /usr/local/bin/Sudo find /path/\*/foo/ -name \*20160208
補足として、ssh
に-t
引数を含めて、Sudo
がパスワードを要求するためのttyを持っていることを確認してください。これは[〜#〜]はるかに[〜#〜]コマンドラインIMOにパスワードを入力するよりも優れています。 Sudo
パスワードをパイプする必要がある場合は、cat secret.txt | find ...
を介して行うことをお勧めします。これにより、ps
やアクセス権を持つすべてのユーザーにパスワードが表示されないようになります。シェルの履歴(~/.history
およびバリアントを含む)