Bash 스크립트는 -f 명령문을 사용하여 자동으로 아름답게 만듭니다.

Bash 스크립트는 -f 명령문을 사용하여 자동으로 아름답게 만듭니다.

자동화된 "beautify" 스크립트를 사용하려고 합니다.declare -f function

간단히 말해서:bash 스크립트가 주어지면 foobash에서 다음을 수행하여 "자동으로" 들여쓰기할 수 있습니다. MAGIC () { ...here you copy/paste the whole foo script... ; } ; declare -f MAGIC

입력으로 제공하는 모든 스크립트에 대해 이 작업을 수행하는 샘플 스크립트를 아래에 포함시켰습니다.

내 질문은: 포함 기능을 사용할 때 주요 고려 사항은 무엇입니까 declare -f?

  • 특별한 위험이 있나요?
  • 중첩된 함수의 수에 제한이 있나요? (스크립트에서 함수를 사용할 수 있고 들여쓰기가 잘 되어 있지만 몇 단계까지 갈 수 있나요?)
  • "이것을 할 수 없을까요/저것을 설명할 수 없을까요/..."? (awk 스크립트가 좋아지고 심지어 약간 들여쓰기가 된 것 같습니다(기본 스크립트가 스크립트의 나머지 부분과 일치합니다)... 하지만 문제를 일으킬 수 있는 (다른) 요소는 무엇입니까?
  • 일부 정보가 손실됩니까? 나는 알아차렸습니다: 빈 줄과 주석( )을 제거하지만 # ..., 그 외에 무엇을 삭제/수정합니까?

아래의 "indent" 스크립트를 사용하여 여러 bash 스크립트를 다시 들여쓰기하기 전에 여러분의 의견을 듣고 싶습니다...

이것은 나의 첫 번째 시도입니다. 의견(및 위 질문에 대한 답변)을 환영합니다.

#!/usr/bin/bash
 # parameters:  $@ = bash (only) scripts that need reindentations.

for script in "$@" ; do
  tmpfile="${script}.BEAUTIFY.tmp"
  finalfile="${script}.BEAUTIFY"
  # optionnal temporisation...
  echo "I am about to create ${script}.BEAUTIFY from the bash (I hope) script: ${script} . Press return if OK, ctrl-C if not"
  read temporisation
  # we output the following commands into a pipe to a subshell bash:
  { sleep 1
    echo "
      # declare surrounding function . The script has to be bash, but can contain also functions, etc.
      # Will lose # comments and blank lines, but maybe also other things... hence the Question on unix.se
      ODBEAUTIFIER () {
      $(cat "$script")
      }
      #  print if via declare -f, to pretiffy it
      declare -f ODBEAUTIFIER > \"${tmpfile}\"
      #  then get rid of the surrounding ODBEAUTIFIER function:
      tail -n +3 \"${tmpfile}\" | tac | tail -n +2 | tac | sed -e 's/    //' > \"${finalfile}\"
      #  and displays the resulting file
      ls -l \"${script}\" \"${finalfile}\"
      \rm \"${tmpfile}\" ; # that rm has a backslash to avoid aliases to rm -i
      "
   } | bash ; #  that sub- bash receives the input and interprets it
done

댓글/편집: "-f를 선언하면 #으로 시작하는 주석이 손실됩니다"를 방지하는 해결 방법(그러나 많은 경고와 위험이 있음)이 있습니다. (어려워도 해결 방법에 대한 주의사항을 많이 인용했는데, 위에서 언급한 내용은 전혀 질문의 요점이 아니기 때문에 삭제하는 것이 좋습니다. 궁금하신 분들은 이전 편집 내용을 참고하시면 됩니다 ^^)

답변1

스크립트를 함수로 읽은 다음 이를 다른 셸로 파이프하는 경우 보안 위험이 있습니다. 입력 파일에 불일치가 포함되어 있으면 }뒤따르는 모든 항목이 실행되고 출력에서 ​​생략됩니다.

일치 실패는 }실수로 또는 악의적으로 발생할 수 있습니다. 일반적으로 bash는 구문 오류를 보고하지만 공격자는 완료되지 않은 다른 함수로 파일을 종료하여 (미화 스크립트를 실행하는 사용자로부터) 이 오류를 숨길 수 있습니다.

}
echo "insert shellcode here" > ~/RCFILE
function end_func {
    true

별로 중요하지 않음:

  • 로 시작하는 주석 이 손실된다고 말씀하셨습니다 #. 여기에는 열기가 포함되므로 #!/bin/...출력 파일이 실행되지 않을 수 있습니다.

  • sed -e 's/ //'모든 줄에서 처음 4개의 공백을 제거합니다. 사람들은대개처음 4개의 공백 declare. 그러나 declare여기에서는 문서 줄 앞에 공백이 삽입되지 않으므로 원본 문서에서 다른 공백이 제거될 수 있습니다.

  • head -n -1대신 을 사용할 수도 있고 s를 tac | tail -n +2 | tac모두 제거하고 를 사용할 수도 있습니다 .tailsed '1,2d;$d'

관련 정보