Ubuntu python subprocess permision denied

У меня есть приложение в связке nginx+gunicorn+flask. в определённый момент приложение создаёт файл bash скрипта, наполняет его, а потом отдельно запускает (такой вот костыль для выполнения баш скриптов из пайтона, лучше не придумал)

def addClientToVPN(clientName=str, clientIp=str, clientPublicKey=str):
    cmd = f'sudo wg set wg0 peer {clientPublicKey} allowed-ips {clientIp}/32'
    with open(f'/root/VPNcon/tmpScripts/{clientName}tmpScript.sh', 'w') as f:
        f.write(f'#!/bin/bash\nexport PATH="/usr/bin:$PATH"\n{cmd}')
    try:
        stdout = subprocess.check_output(f'/root/VPNcon/tmpScripts/{clientName}tmpScript.sh', shell=True, stderr=subprocess.STDOUT).decode('utf-8')
    except subprocess.CalledProcessError as e:
        raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))

    return stdout

Так вот, в момент создания файла ( with open('...', 'w')), ему выдаются права -rw-r--r--, от чего subprocess.check_output(...) выдаёт ошибку Permission denied

chmod помогает, но на новые файлы права не распространяются. Как исправить?


Ответы (1 шт):

Автор решения: quswadress

Вы можете использовать os.stat для получения уже имеющихся прав, и os.chmod для изменения их у созданного sh файла.

import os
import subprocess
import stat


def addClientToVPN(clientName=str, clientIp=str, clientPublicKey=str):
    cmd = f'sudo wg set wg0 peer {clientPublicKey} allowed-ips {clientIp}/32'
    path = f'/root/VPNcon/tmpScripts/{clientName}tmpScript.sh'
    with open(path, 'w') as f:
        f.write(f'#!/bin/bash\nexport PATH="/usr/bin:$PATH"\n{cmd}')
    # Добавляем execute к уже имеющимся правам
    permissions = os.stat(path).st_mode \
        | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
    os.chmod(path, permissions)  # И изменяем их у файла

    ...  # уже имеющийся код, который я не изменил
→ Ссылка