KSH 쉘 스크립트 zip 명령이 제대로 작동하지 않습니다. eval: zip: 실행할 수 없습니다. [Exec 형식 오류]

KSH 쉘 스크립트 zip 명령이 제대로 작동하지 않습니다. eval: zip: 실행할 수 없습니다. [Exec 형식 오류]

첫째, 우리 개발 환경은 방금 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/zipfile $(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에 대한 수정 사항이 있습니다.

관련 정보