検索: '-exec'引数がありません

検索: '-exec'引数がありません

このコマンドを使用しようとすると

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エスケープされますが、バックスラッシュは特別な理由なくエスケープされません。.+}

これでb​​ashが実行されます。

"/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今回はリモートユーザーのログインシェルはどこにありますか?)

上記は;エスケープされていないため、コマンド区切り文字として解釈され、コマンド区切り文字に渡されないため、苦情は終了しませんfindfind-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部分)に意味があるわけではありません。)

おすすめ記事