Создать скрипт bash с полезной нагрузкой .tar.gz - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу использовать скрипт python3 для генерации «самораспаковывающегося» скрипта bash, который имеет встроенный архив .tar.gz в качестве полезной нагрузки.

В bash я бы просто сделал что-то вроде этого:

printf "#!/bin/bash                                                                                                                                                                                                               
  PAYLOAD_LINE=\`awk '/^__PAYLOAD_BELOW__/ {print NR + 1; exit 0; }' \$0\`                                                                                                                                                          
  tail -n+\$PAYLOAD_LINE \$0 | tar -xvz                                                                                                                                                                                             
  #script that does something with the unpacked payload                                                                                                                                                                                    
  exit 0                                                                                                                                                                                                                            
  __PAYLOAD_BELOW__\n" > "tmpfile"

cat "tmpfile" "payload.tar.gz" > "myscript.sh"

В Python я попробовал следующее:

with open('myscript.sh','wb') as script:                                                                                                                                                                                                 
    for line in open(payload.tar.gz, 'rb'):                                                                                                                                                                                              
        script.write(line)

Я могу распаковать полученный файл вручную с помощью cat myscript.sh | tar -xvz

Чтобы добавить часть сценария bash (PAYLOAD_LINE= .... __PAYLOAD_BELOW__\n"), есть ли более элегантный способ, чем открыть myscript.sh во второй раз, но не в двоичном ('wb') режиме?

1 Ответ

0 голосов
/ 13 декабря 2018

Понял.

Мне просто нужно преобразовать строку в байты, прежде чем записать ее в файл, поэтому мне не нужно открывать ее дважды.

script_header = """#!/bin/bash                                                                                                                                                                                                    
PAYLOAD_LINE=\`awk '/^__PAYLOAD_BELOW__/ {print NR + 1; exit 0; }' \$0\`                                                                                                                                                          
tail -n+\$PAYLOAD_LINE \$0 | tar -xvz"""     

with open('myscript.sh','wb') as script:
    script.write(bytes(script_header + '\n', 'utf-8'))
    for line in open(payload.tar.gz, 'rb'):                                                                                                                                                                                              
        script.write(line)
...