このコマンドを使用しようとすると
var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`
それは私を投げる
find: missing argument to `-exec'
この過程で私が間違えたことがあれば教えてください。
ベストアンサー1
そこでいくつかの処理を実行するシェルが多すぎます。また、バックティックを使用するのは悪い考えです。特にバックティックが含まれている場合はさらにそうです。代わりに構文を使用する必要があります$(...)
。
sudo -s
コマンドを実行するには、シェルを起動してください。ただし、sudo
シェルの特殊文字の一部をエスケープしてみてください。あなたはそれを使用したくありません。
ssh
接続された引数(引数の間にスペースを含む)で構成されるコマンドラインを解釈するために、リモートホストでシェルを実行します。
だから:
var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \;`
sudo
走る:
"/bin/bash", ["/bin/bash", "-c",
"ssh daill_scp\\@files.dc1.responsys.net find \\. -maxdepth 1 -type f -mtime \\+14 -exec ls -lh \\{\\} \\;"]
(/bin/bash
またはユーザーのログインシェルは何でも)。
、 はどのようにsudo
エスケープされますが、バックスラッシュは特別な理由なくエスケープされません。.
+
}
これでbashが実行されます。
"/usr/bin/ssh", ["ssh", "[email protected]", "find", ".", "-maxdepth", "1", "-type", "f", "-mtime", "+14", "-exec", "ls", "-lh", "{}", ";"]
ssh
これを接続し、リモートホストで実行します。
"$SHELL", ["$SHELL", "-c", "find . -maxdepth 1 -type f -mtime + 14 -exec ls -lh {} ;"]
($SHELL
今回はリモートユーザーのログインシェルはどこにありますか?)
上記は;
エスケープされていないため、コマンド区切り文字として解釈され、コマンド区切り文字に渡されないため、苦情は終了しませんfind
。find
-exec
希望する場所は次のとおりです。
var1=$(
sudo -u psoadmin -H ssh [email protected] '
find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \;' |
awk '{print $5, $9}' |
egrep -v '^./upload|^./download|^./archive|^\.'
)
(このコマンド(特にそのegrep
部分)に意味があるわけではありません。)