尝试安全地从收购时来到我们的严重受感染的
Windows XP和2003机器中检索文件.我有类似的需要自动化在PXE启动的DRBL机器上运行的脚本到rsync到我们的服务器.
以下代码生成单引号,将整个’–filter =”’参数包装到rsync中.注意echo会删除单引号,但不会删除rsync.我究竟做错了什么?将每个参数作为数组中的条目会有帮助吗?
失败因为包裹单引号:
'--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\'' '
当我运行相同的命令但手动删除包装单引号时,rsync运行正常.
作品:
--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\''
没有和没有–protect-args尝试过.
#!/bin/sh -x PROTECTARGS=--protect-args EXCLUDE=( '- "Default User/"' '- "Application Data/"' ) echo EXCLUDE="${EXCLUDE[*]}" FILTER=() for X in "${EXCLUDE[@]}"; do FILTER=( "${FILTER[@]}" "--filter='${X}' " ); done; echo FILTER="${FILTER[*]}" if [ "1" == "1" ]; then rsync --dry-run -vv --stats \ --recursive \ "$PROTECTARGS" \ "${FILTER[*]}" \ '/hddOld/Documents and Settings' \ '/hddNew/' fi;
OUTPUT:
FILTER=--filter='- "Default User/"' --filter='- "Application Data/"' + '[' 1 == 1 ']' + rsync --dry-run -vv --stats --recursive --protect-args '--filter='\''- "Default User/"'\'' --filter='\''- "Application Data/"'\'' ' '/hddOld/Documents and Settings' /hddNew/ Unknown filter rule: `'- "Default User/"' --filter='- "Application Data/"' ' rsync error: Syntax or usage error (code 1) at exclude.c(817) [client=3.0.6]
bash-4.1.2-14.el6.x86_64 rsync version 3.0.6 protocol version 30 rsync-3.0.6-9.el6.x86_64 CentOS 6.4 x64
工作……不,它没有:
FILTER+=( --filter=""${X}"" ); RESULTS IN: '--filter=- "Default User/" --filter=- "Application Data/"'
rsync不会抱怨此过滤规则,但实际上并未过滤掉“Application Data /”.
我这样做是为了工作:
我变了:
EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
至
EXCLUDE=( '-_Default User/' '-_Application Data/' )
这删除了双引号并在“ – ”后面使用了替换下划线“_”语法.先前的回答提示了这一点,但我必须添加“_”语法才能让它适合我.
也改变了:
FILTER=( "${FILTER[@]}" "--filter='${X}' " );
至
FILTER=( "${FILTER[@]}" "--filter=${X}" );
这从X变量替换中删除了撇号.
并改变了:
"${FILTER[*]}"
至
"${FILTER[@]}"
这会导致数组的每个元素被视为单个参数,而不是如前所述的整个数组.