첫째, 우리 개발 환경은 방금 RHEL 7.5(Maipo)로 업그레이드되었으며 이전에는 Oracle Solaris 10을 사용하고 있었습니다. 이 문제는 Solaris에서 Red Hat으로 전환한 이후부터 시작되었습니다. 아래 Korn 쉘 스크립트는 프로덕션 환경에서는 잘 작동하지만 여전히 Solaris 10에서는 작동합니다. 그래서 나는 이것이 문제와 관련이 있다고 가정합니다. 압축되어 다운로드되는 zip 파일은 zip 폴더에 저장되지 않습니다. 방금 데스크탑에 다운로드한 zip 폴더를 열면 zip 폴더가 비어 있습니다.
아래 이미지는 파일 목록을 보여줍니다. 사용자는 다운로드하려는 파일의 확인란을 선택한 다음 압축 및 다운로드 링크를 클릭합니다. 그러면 선택한 파일이 압축되어 데스크탑에 저장됩니다. 안타깝게도 zip 폴더가 비어 있습니다. 어떤 아이디어가 문제가 될 수 있습니까?
이것은 아래와 같이 호출되는 쉘 스크립트입니다.
1 #!/bin/ksh
2 #
3 # Utility to zip up files in the configuration_aerodynamic_properties area.
4 # Script takes two arguments the directory and the file list.
5 # The file list is tab seperated.
6 # This script returns the zip file.
7 #
8 # $Log: vmdb_zip_files.sh,v $
9 # Revision 1.4 2014/10/21 19:53:31 wmorris1
10 # ASR 13563 - Change incorrect mime type text/text to text/plain.
11 #
12 # Revision 1.3 2012/04/30 18:46:03 wmorris1
13 # ASR 12774 - Fix SSL and IE issue found after going to SSL.
14 #
15 # Revision 1.2 2004/11/11 12:49:33 bmorris
16 # ASR 55414 - removed UNIX groups for zipped file.
17 #
18 # Revision 1.1 2004/10/18 20:10:32 bmorris
19 # Initial revision
20 #
21 #set -x
22 #set -v
23 function error_message {
24 echo "Content-Type: text/plain;"
25 echo "Content-Disposition: attachment; filename=\"download_error.txt\";"
26 COMMAND="unix2dos "
27 echo ""
28 echo "$(${COMMAND} <<-EOF
29 Error: $1
30
31 EOF
32 )"
33 }
34 if [ "$#" -lt 2 ]; then
35 error_message "Insufficient arguments to $(basename $0)!"
36 return 1
37 fi
38 CONTENT="application/x-zip-compressed"
39 # Parse the directory path.
40 # Internal Field Sep (IFS) empty, cause spaces in file names, directories are important
41 IFS=$""
42 FULL_DIRECTORY_PATH=$(echo "${1}" | tr -d '~\\')
43 # File lists are seperated by tabs, parse them
52 IFS=$(printf '\t')
53 set -A FILE_LIST ${2}
54 # Make each of the file parameters in the file list protected.
55 let count=0
56 while (( $count < ${#FILE_LIST[*]} )); do
57 FILE_LIST[count]="\"${FILE_LIST[count]}\""
58 let count="count +1"
59 done
60 # Reset the IFS to the default.
61 IFS=$(echo " \n\t")
62 if [[ -n $3 ]]; then
63 WEB_FILENAME="$3"
64 fi
65 # Don't let the user download stuff.
66 if [[ "${1}" = *..* ]] || [[ "${1}" = *~* ]] || [[ "${2}" = *..* ]] || [[ "${2}" = *~* ]]; then
67 error_message "Path ${1}/${2} violates security."
68 return 1
69 elif [[ ! -f ${FULL_DIRECTORY_PATH} ]] && [[ ! -d ${FULL_DIRECTORY_PATH} ]]; then
70 error_message "${FULL_FILE_PATH} does not exist or is not regular."
71 return 1
72 elif [[ ! -r ${FULL_DIRECTORY_PATH} ]]; then
73 error_message "${FULL_FILE_PATH} is not readable from the web."
74 return 1
75 fi
76 # Zip up the f
79 COMMAND="cd \"${FULL_DIRECTORY_PATH}\"; zip -rX - ${FILE_LIST[*]}"
82 echo "Content-Type: ${CONTENT};"
83 if [[ -z $HTTP_USER_AGENT || $HTTP_USER_AGENT != *MSIE* ]]; then
84 # IE Can't handle ssl and zip files
85 echo "Pragma:no-cache"
86 fi
87
88 echo ""
98 eval "$COMMAND"
디버깅을 위해 set -x를 사용했는데 이는 서버의 오류 로그입니다.
cat vmdb_zip_files_8862.err
+ [ 3 -lt 2 ]
+ CONTENT=application/x-zip-compressed
+ IFS=''
+ tr -d '~\\'
+ echo /isweb/www/ss/issapt/vmdb/data_downloads/power_export
+ FULL_DIRECTORY_PATH=/isweb/www/ss/issapt/vmdb/data_downloads/power_export
+ printf '\t'
+ IFS=$'\t'
+ set -A FILE_LIST flight_dependent_heater_data_443949.txt flight_dependent_data_443949.txt
+ let count=0
+ (( 0 < 2 ))
+ FILE_LIST[0]='"flight_dependent_heater_data_443949.txt"'
+ let count='count +1'
+ (( 1 < 2 ))
+ FILE_LIST[1]='"flight_dependent_data_443949.txt"'
+ let count='count +1'
+ (( 2 < 2 ))
+ echo ' \n\t'
+ IFS=' \n\t'
+ [[ -n power_export.zip ]]
+ WEB_FILENAME=power_export.zip
+ [[ /isweb/www/ss/issapt/vmdb/data_downloads/power_export == *..* ]]
+ [[ /isweb/www/ss/issapt/vmdb/data_downloads/power_export == *~* ]]
+ [[ $'flight_dependent_heater_data_443949.txt\tflight_dependent_data_443949.txt' == *..* ]]
+ [[ $'flight_dependent_heater_data_443949.txt\tflight_dependent_data_443949.txt' == *~* ]]
+ [[ ! -f /isweb/www/ss/issapt/vmdb/data_downloads/power_export ]]
+ [[ ! -d /isweb/www/ss/issapt/vmdb/data_downloads/power_export ]]
+ [[ ! -r /isweb/www/ss/issapt/vmdb/data_downloads/power_export ]]
+ COMMAND='cd "/isweb/www/ss/issapt/vmdb/data_downloads/power_export"; zip -rX - "flight_dependent_heater_data_443949.txt" "flight_dependent_data_443949.txt"'
+ echo 'Content-Type: application/x-zip-compressed;'
+ [[ -z 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' ]]
+ [[ 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' != *MSIE* ]]
+ echo Pragma:no-cache
+ echo ''
+ eval 'cd "/isweb/www/ss/issapt/vmdb/data_downloads/power_export"; zip -rX - "flight_dependent_heater_data_443949.txt" "flight_dependent_data_443949.txt"'
+ cd /isweb/www/ss/issapt/vmdb/data_downloads/power_export
+ zip -rX - flight_dependent_heater_data_443949.txt flight_dependent_data_443949.txt
eval: zip: cannot execute [Exec format error]
zip이 패키지를 통해 설치되었는지 수동으로 컴파일되었는지 확실하지 않은 경우 시스템 운영진에게 문의해야 하지만 이는 /usr/bin/zip
제공한 파일의 출력 입니다 /usr/bin/zip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=747369bd1c41c4f8671a38f0055533a0c19a7769, stripped
. 명령에 따르면 uname -m
다음과 같은 결과가 나타납니다.x86_64
type의 출력은 zip
다음 zip is a tracked alias for /oraloc/app/product/11.2.0/client_1/bin/zip
과 file $(which zip)
같습니다 /oraloc/app/product/11.2.0/client_1/bin/zip: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped
.
출력은 echo $PATH
다음과 같습니다./isdev/isapps/vmdb/tools/apache-maven-3.3.9/bin:/isdev/isapps/vmdb/tools/apache-ant-1.9.7/bin:/isdev/isapps/vmdb/runlib/current:/oraloc/app/product/11.2.0/client_1/bin:/oraloc/app/product/11.2.0/client_1/OPatch:/tools/ileaf.ileaf/sun4os5/lib:/tools/ghostscript/current/bin/:/tools/hp2xx/bin/:/usr/lib/lp/postscript/:/tools/ileaf.ileaf/bin/::/tools/gmake/3_79_1/bin:/tools/rcs/current/bin/:/bin:/usr/j2se/bin/:/tools/gcc/3_0_3/bin:/isdev/isapps/vmdb/tools/bin:/homedev/isdev2/cmarti35/tools/java/bin:/usr/sfw/bin:/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:/usr/bin/X11:/usr/bin/X11:/usr/dt/bin:/etc:/usr/etc:/opt/SUNWmotif/bin:/opt/SUNWspro/SC3.0/bin:/usr/ucb:/usr/sbin:/usr/ccs/bin:/tools/openssh/3.7.1p2/bin/:.:/usr/bin/X11
답변1
이 명령은 type zip
실행되지 않을 것임을 알려주 /usr/bin/zip
므로 출력은 file /usr/bin/zip
관련이 없습니다. /oraloc/app/product/11.2.0/client_1/bin/
의심스러운 사용중인 것 중 하나입니다 .
/usr/bin/zip
스크립트에서 대신 사용하면 문제 zip
가 해결됩니다.
그러나 장기적으로 볼 때 문제는 $PATH
변수에 우선순위가 지정된 사이트별 콘텐츠가 많이 있다는 것입니다(왼쪽에서 오른쪽으로 읽으면서 첫 번째 디렉터리를 먼저 시도합니다). 사이트의 특정 부분이 잘못 구성되었습니다. 웹마스터에게 문의하세요.
답변2
ksh93에는 실행 파일이 완전히 정상일 때 이 오류를 일으키는 알려진 버그가 있습니다. Solaris 10은 이러한 고대 바이너리를 사용하며 Korn Shell은 ksh88(예, 1988)이며 이 버그가 없습니다. Solaris 11에는 ksh93이 있으며 이 버그가 있습니다. RHEL은 물론 ksh93을 사용하므로 버그가 있지만 ISTR에는 Solaris 11이 아닌 RHEL7에 대한 수정 사항이 있습니다.