user14795102
user14795102

Reputation: 17

How can I import file as normal user in python?

I have a python app that run bash shell commands that require root priviledges. In terminal I type "sudo python3 main.py" then load python app file. Python app run mostly sudo commands so I always have to run it with sudo python3 main.py. In the main.py file in the beginning I have import settings.py file that save some important settings. settings.py file read and write INI File in home folder /home/username/.config/myapp/config.ini. So when I run the main.py app the settings.py create a folder myapp inside /home/username/.config/ and then create the config.ini filename.

The problem is tha because I run the main.py app with sudo the folder myapp and config.ini file created with root owner. How can I avoid that?

I would like to import whole file settings.py as normal user.

main.py

#!/usr/bin/python3
import os
import sys
import subprocess
import settings

....
....

settings.py

import configparser

# Create directory
dirName = '/home/username/.config/myapp'

# Create target directory & all intermediate directories if don't exists
try:
    os.makedirs(dirName)
    print("Directory ", dirName, " Created ")
except FileExistsError:
    print("Directory ", dirName, " already exists")

filename = "/home/username/.config/myapp/config.ini"

# Writing Data
config = configparser.ConfigParser()
config.read(filename)

try:
    config.add_section("ethernet")
except configparser.DuplicateSectionError:
    pass

config.set("ethernet", "wired", "")
config.set("ethernet", "wired_mac_address", "")

try:
    config.add_section("wifi")
except configparser.DuplicateSectionError:
    pass

config.set("wifi", "wireless", "")
config.set("wifi", "wireless_mac_address", "")

with open(filename, "w") as config_file:
    config.write(config_file)

# Reading Data
config.read(filename)
keys = [
    "wired",
    "wired_mac_address"
]
for key in keys:
    try:
        value = config.get("ethernet", key)
        print(f"{key}:", value)
    except configparser.NoOptionError:
        print(f"No option '{key}' in section 'ethernet'")

# Reading Data
config.read(filename)
keys = [
    "wireless",
    "wireless_mac_address"
]

for key in keys:
    try:
        value = config.get("wifi", key)
        print(f"{key}:", value)
    except configparser.NoOptionError:
        print(f"No option '{key}' in section 'wifi'")

Upvotes: 0

Views: 107

Answers (1)

Alexander
Alexander

Reputation: 17291

One approach is to use os.chown() method in the built-in os module. Using this method you can save, create, and edit files and directories as the root user and then change the ownership immediately afterwards to whatever user you want.

import os  #  <---  import the module
import configparser

# change this to the UID of the user you
# want owning the files/directories
uid = 1000 # non-privileged user
ugid = 1000  # non-priveleged user's group


# Create directory
dirName = '/home/username/.config/myapp'

# Create target directory & all intermediate directories if don't exists
try:
    os.makedirs(dirName)
    os.chown(dirName, uid, ugid)
    print("Directory ", dirName, " Created ")
except FileExistsError:
    os.chown(dirName, uid, ugid)
    print("Directory ", dirName, " already exists")

filename = "/home/username/.config/myapp/config.ini"

if os.path.exists(filename):
    os.chown(filename, uid, ugid)  

# Writing Data
config = configparser.ConfigParser()
config.read(filename)

try:
    config.add_section("ethernet")
except configparser.DuplicateSectionError:
    pass

config.set("ethernet", "wired", "")
config.set("ethernet", "wired_mac_address", "")

try:
    config.add_section("wifi")
except configparser.DuplicateSectionError:
    pass

config.set("wifi", "wireless", "")
config.set("wifi", "wireless_mac_address", "")

with open(filename, "w") as config_file:
    config.write(config_file)  # <--- write the file as root
os.chown(filename, uid, ugid)  # <--- change ownership 

# Reading Data
config.read(filename)
keys = [
    "wired",
    "wired_mac_address"
]
for key in keys:
    try:
        value = config.get("ethernet", key)
        print(f"{key}:", value)
    except configparser.NoOptionError:
        print(f"No option '{key}' in section 'ethernet'")

# Reading Data
config.read(filename)
keys = [
    "wireless",
    "wireless_mac_address"
]

for key in keys:
    try:
        value = config.get("wifi", key)
        print(f"{key}:", value)
    except configparser.NoOptionError:
        print(f"No option '{key}' in section 'wifi'")

Just run that same method os.chown(path, uid, gid) anytime you create a new file or folder as root, and it will change the ownership to a non-privileged user of your choice.

Hopefully this helps.

Upvotes: 1

Related Questions