このコマンドを使用しようとすると
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
部分)に意味があるわけではありません。)
答え2
次の方法を試してください。
...-exec ls -lh {} \;...
(中括弧の前のバックスラッシュを削除)二重引用符:
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|^\.'`
答え3
このコマンドを使用しようとすると
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'
以下を使用する必要があります。
var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \; | tr -s [:space:] | cut -d ' ' -f 5,9 | egrep -v '^./upload|^./download|^./archive|^\.'"`
- 使用
"find [..]"
使用
tr
-s, --squeeze-repeats replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character
使用
cut
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter -f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified