Skip to main content

Windows and Linux compatible chmod

Project description

Mergify

oschmod

oschmod sets consistent file permissions across Windows, Linux and macOS.

oschmod TL;DR

oschmod brings chmod functionality to Windows, macOS, and Linux! If you're not familiar, chmod is a handy macOS and Linux-only tool for setting file permissions.

Prior to oschmod, Windows file permissions couldn't be set in the familiar chmod way. Tools did not translate chmod-style permissions into Windows-style file permissions. Even though Python's os.chmod() sets read, write, and execute file permissions, on Windows, os.chmod() basically has no effect. Even worse, Python on Windows gives no warnings or errors. If you think you set file permissions on Windows with os.chmod(), you're wrong!

oschmod allows you to set consistent file permissions in a consistent way across platforms.

Installation

$ pip install oschmod

GNU Documentation

oschmod changes the file mode bits of each given file according to mode, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new mode bits.

The format of a symbolic mode is [ugoa...][+-=][perms...] where perms is zero or more letters from the set rwx. Multiple symbolic modes can be given, separated by commas.

A combination of the letters ugoa controls which users' access to the file will be changed: the user who owns it (u), other users in the file's group (g), other users not in the file's group (o), or all users (a). If none of these are given, the effect is as if a were given.

(Modified from the GNU manpage for chmod.)

Command line interface

oschmod brings the ability to set consistent file permissions using the command line to Windows, macOS, and Linux platforms. If you are familiar with chmod, oschmod works similarly, albeit with fewer options.

$ oschmod -h
usage: oschmod [-h] [-R] mode object

Change the mode (permissions) of a file or directory

positional arguments:
  mode        octal or symbolic mode of the object
  object      file or directory

optional arguments:
  -h, --help  show this help message and exit
  -R          apply mode recursively

Command line examples

You can use symbolic (e.g., "u+rw") or octal (e.g., "600) representations of modes. Multiple mode modifications can be made in a single call by separating modifiers with commas.

Symbolic representation examples

Symbolic representation mode modifiers have three parts:

  1. whom: To whom does the modification apply? You can include zero or more of [ugoa]* where a is for all, u is for the file owner (i.e., "user"), g is for the file group, and o is for others. In other words, ugo is equivalent to a. Also, if you do not provide a "whom," oschmod assumes you mean a (everyone).
  2. operation: Which operation should be applied? You must include one and only one operation, [+-=]{1}, per modifier (although you can have multiple modifiers). + adds permissions, - removes permissions, and = sets permissions regardless of previous permissions. + and - modifications often depend on the current permissions.
  3. permission: Which permission or permissions will be affected? You can include zero or more of [rwx]* where r is for read, w is for write, and x is for execute. If you do not include a permission with + or - (e.g., u-), the modifier has no effect. However, if you use no permissions with = (e.g., o=), all permissions are removed.

Example 1: To give everyone execute permissions on a file (all of these are equivalent):

$ oschmod +x <file name>
$ oschmod a+x <file name>
$ oschmod ugo+x <file name>

Example 2: To remove read, write, and execute permissions from the file group and all others (these are equivalent):

$ oschmod go-rwx <file name>
$ oschmod go= <file name>

Example 3: To give the file owner read and execute permissions, and remove execute permissions from the group and all others:

$ oschmod u+rx,go-x <file name>

Example 4: To give everyone all permissions, and then remove execute write from the group, and execute from all others:

$ oschmod a+rwx,g-w,o-x <file name>

Octal representation examples

For more about what octal representations mean, see this article on Medium.

Example 5: To give everyone read, write, and execute permissions on a file:

$ oschmod 777 <file name>

Example 6: To lock down a file to just give the file owner read, write, and execute permissions and deny all permissions to everyone else:

$ oschmod 700 <file name>

Python usage

You can use oschmod from Python code. Any of the command line examples above will work very similarly. For example, Example 4 above, in Python code, would look like this:

import oschmod
oschmod.set_mode("myfile", "a+rwx,g-w,o-x")

Example 5 above, in Python code, could be done in two ways:

import oschmod
oschmod.set_mode("myfile", "777")
oschmod.set_mode("myfile", 0o777)

oschmod is compatible with bitwise permissions as defined in the stat module. To give a file's owner read, write, and execute permissions and deny the group and others any permissions (i.e., equivalent of 700):

import oschmod
import stat
oschmod.set_mode('myfile', stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)

Replacing os.chmod() with oschmod should usually be an easy drop-in replacement. Replacement will allow you to get consistent file permission settings on Windows, macOS, and Linux:

If this is your Python code using os.chmod():

import os
os.chmod('myfile1', 'u+x')
os.chmod('myfile2', 0o777)

The replacement using oschmod is very similar:

import oschmod
oschmod.set_mode('myfile1', 'u+x')
oschmod.set_mode('myfile2', 0o777)

Changelog

0.3.0

Commit Delta: Change from 0.2.4 release

Released: 2020.05.27

Summary:

  • Adds symbolic representation for mode changes (e.g., +x, u+rwx, ugo-x).

0.2.4

Commit Delta: Change from 0.2.2 release

Released: 2020.04.21

Summary:

  • Add command line interface (CLI).

0.2.2

Commit Delta: Change from 0.2.0 release

Released: 2020.04.21

Summary:

  • Fix issue with account lookup failing with error (No mapping between account names and security IDs was done.).

0.2.0

Commit Delta: Change from 0.1.5 release

Released: 2020.04.20

Summary:

  • Add recursive version of oschmod.set_mode(): oschmod.set_mode_recursive()

0.1.5

Commit Delta: Change from 0.1.4 release

Released: 2020.04.17

Summary:

  • Create Linux version of permissions test (oschmod.perm_test())

0.1.4

Commit Delta: Change from 0.1.0 release

Released: 2020.04.17

Summary:

  • Revise Windows to keep permissions an object already has for SYSTEM/NT AUTHORITY and don't include those permissions in mode calculation.
  • Fix various minor cosmetic issues.

0.1.0

Commit Delta: Change from 0.0.0 release

Released: 2020.04.15

Summary:

  • Initial release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oschmod-0.3.9.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oschmod-0.3.9-py2.py3-none-any.whl (14.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file oschmod-0.3.9.tar.gz.

File metadata

  • Download URL: oschmod-0.3.9.tar.gz
  • Upload date:
  • Size: 20.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.6.7

File hashes

Hashes for oschmod-0.3.9.tar.gz
Algorithm Hash digest
SHA256 156eb2a881a76dd3ba06d2aed256b6bd4efe879918ffeaa01d1f9095776c5095
MD5 55707c2890fd0f047c12b634d74748a3
BLAKE2b-256 362494158ddd7c08bd1eb303f50e9e944ed960f795c0483d59baaab5f05ff756

See more details on using hashes here.

File details

Details for the file oschmod-0.3.9-py2.py3-none-any.whl.

File metadata

  • Download URL: oschmod-0.3.9-py2.py3-none-any.whl
  • Upload date:
  • Size: 14.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.6.7

File hashes

Hashes for oschmod-0.3.9-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 863767452bd5dc5390f27e5719f7e75f51255fc4a715d2095738c2d98af29aa1
MD5 d06487a6173a73167aa9f6f4c5da5f69
BLAKE2b-256 fd698b596bdc5b9bdd979abd96d49bd54c5622face39a114099703c82b170df1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page