보관 중에 tar --transform
DOCUMENTNAMES 배열을 기반으로 문서 이름을 바꾸기 위해 SSH 호출을 사용하고 있습니다.
tar -uvf /tmp/$TARGET''TVL_document.tgz'' --transform='s|'\${doc}'|'\$docname'|' -C /appl-doc/a-mc-acc-dms/DATA \${doc}
DOCUMENTNAMES에 공백이 없으면(예: "application.pdf") tar 출력을 얻을 수 있습니다. 공백이 있는 DOCUMENTNAMES(예: "project form.pdf")의 경우 셸이 이를 올바르게 확장하지 못하고 오류가 발생합니다.tar invalid transform expression
--transform='s|'\${doc}'|'\$docname'|'
DOCUMENTNAMES의 공백을 올바르게 이스케이프하는 방식으로 시퀀스를 이스케이프하려면 어떻게 해야 합니까 ?
전체 코드:
DOCUMENTNAMES=("project form.pdf" "application.pdf")
# SSH to Linux fileshare to create tar
sshpass -p $IPA_PASS ssh -tt -o StrictHostKeyChecking=no $IPA_NAME@$TARGET "sudo su - jboss <<'EOF'
# create an empty tar
tar -cvf /tmp/$TARGET''TVL_document.tgz'' -T /dev/null
# transfer local array to remote
eval `typeset -p DOCUMENTNAMES`
index=0
for doc in "${DOCUMENTIDS[@]}"
do
docname=\${DOCUMENTNAMES[\$index]}
# Update tar with one document at a time and update name using transform
tar -uvf /tmp/$TARGET''TVL_document.tgz'' --transform='s|'\${doc}'|'\$docname'|' -C /appl-doc/a-mc-acc-dms/DATA \${doc}
index=$((index+1))
done
EOF
"
답변1
당신이 원하는 것 같습니다 :
DOCUMENTNAMES=("project form.pdf" "application.pdf")
# never pass password on the command line. Here passing it via an env var
# instead
SSHPASS=$IPA_PASS sshpass -e \
ssh -o StrictHostKeyChecking=no "$IPA_NAME@$TARGET" '
sudo -Hu jboss bash' << EOF
# pass variables across by dumping their definition on the client shell
# into the code interpreted by the remote shell
$(typeset -p TARGET DOCUMENTNAMES DOCUMENTIDS)
# rest in a heredoc with quoted delimiter so no expansion happens.
$(cat << 'END_OF_SCRIPT'
# never put files with fixed name in world writable directories
# here using a ~/tmp dir instead. You could also use things like:
# tmpdir=$(mktemp -d) || exit
tmpdir=~/tmp
tarfile=$tmpdir/${TARGET}TVL_document.tgz
mkdir -m 700 -p ~/tmp || exit
# create an empty tar
tar -cvf "$tarfile" -T /dev/null
index=0
for doc in "${DOCUMENTIDS[@]}"
do
docname=${DOCUMENTNAMES[index]}
tar -uvf "$tarfile" --transform="s|$doc|$docname|" -C /appl-doc/a-mc-acc-dms/DATA "$doc"
(( index++ ))
done
END_OF_SCRIPT
)
EOF