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) # И изменяем их у файла
... # уже имеющийся код, который я не изменил