У меня есть зашифрованный скрипт bash внутри файла .pkl, который мой скрипт Python должен расшифровать и выполнить. Скрипт bash состоит из нескольких строк и является сложным. Мне нужен способ выполнить этот сценарий из Python, без файла .sh.
Использование необработанной строки для хранения сценария работает, как в примере ниже, но нет способа программно превращая уже инициализированный строковый объект (я получаю его из .pkl, как я уже упоминал) в необработанную строку.
bash_script = r"""
multi
line
bash
script
"""
# Run the script
process = subprocess.Popen(['/bin/bash'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate(bash_script.encode())
# Output the result
print(stdout.decode())
Некоторые ошибки, которые я получаю, когда сохраняю скрипт в обычном объекте str и запускаю его, приведены ниже.
/bin/bash: line 105: unexpected EOF while looking for matching `"'
/bin/bash: line 106: syntax error: unexpected end of file
Одно из решений — экспортировать сценарий во временный файл в каталоге /tmp/, сделать его исполняемым и выполнить файл, но я хочу, чтобы он был максимально простым.Редактировать:
Вот минимальный воспроизводимый пример. bash_script1 работает отлично, а bash_script2 — нет.
import subprocess
# This works
bash_script1 = r"""
#!/bin/bash
if [ -f /etc/redhat-release ]; then
export DF='df -x fuse.gvfs-fuse-daemon'
else
export DF='df'
fi
$DF -PT | /bin/awk '{gsub(/%/, "", $6); printf "disk,device=%s,fstype=%s,path=%s total=%si,used=%si,free=%si,used_percent=%s\n", $1, $2, $7, $3*1024, $4*1024, $5*1024, $6}' | grep -v -e Filesystem -e tmpfs | sort -g -k5 -r
top -bn1 | grep load | /bin/awk '{printf "cpu,cpu=cpu-total usage_idle=%.2f\t\t\n", 100-$(NF-2)}'
"""
# This does not work
bash_script2 = """
#!/bin/bash
if [ -f /etc/redhat-release ]; then
export DF='df -x fuse.gvfs-fuse-daemon'
else
export DF='df'
fi
$DF -PT | /bin/awk '{gsub(/%/, "", $6); printf "disk,device=%s,fstype=%s,path=%s total=%si,used=%si,free=%si,used_percent=%s\n", $1, $2, $7, $3*1024, $4*1024, $5*1024, $6}' | grep -v -e Filesystem -e tmpfs | sort -g -k5 -r
top -bn1 | grep load | /bin/awk '{printf "cpu,cpu=cpu-total usage_idle=%.2f\t\t\n", 100-$(NF-2)}'
"""
# Run the script
process = subprocess.Popen(['/bin/bash'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate(bash_script1.encode())
# Output the result
print(stdout.decode())
if stderr:
print("Errors:", stderr.decode())
Точная ошибка, которую я получаю при использовании bash_script2 в приведенном выше примере:
[oracle@oradb-arm-stby local_execution_testing]$ python minimal-reproducible-example.py
Errors: awk: cmd. line:1: {gsub(/%/, "", $6); printf "disk,device=%s,fstype=%s,path=%s total=%si,used=%si,free=%si,used_percent=%s
awk: cmd. line:1: ^ unterminated string
awk: cmd. line:1: {gsub(/%/, "", $6); printf "disk,device=%s,fstype=%s,path=%s total=%si,used=%si,free=%si,used_percent=%s
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: {printf "cpu,cpu=cpu-total usage_idle=%.2f
awk: cmd. line:1: ^ unterminated string
awk: cmd. line:1: {printf "cpu,cpu=cpu-total usage_idle=%.2f
awk: cmd. line:1: ^ syntax error
Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-a-sh-fi
Запуск содержимого bash-скриптов из скрипта Python. Не выполнение файла .sh [закрыто] ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как перезапустить оболочку внутри bash-скрипта и продолжить выполнение скрипта?
Anonymous » » в форуме Linux - 0 Ответы
- 110 Просмотры
-
Последнее сообщение Anonymous
-