Skip to main content

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

Metadata

Release files for oschmod 0.3.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oschmod 0.3.12
File Size Uploaded
oschmod-0.3.12.tar.gz 20.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oschmod 0.3.12
File Interpreter ABI Platform
oschmod-0.3.12-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 34.2 kB

Release files / oschmod-0.3.12.tar.gz

Download URL oschmod-0.3.12.tar.gz
Size 20.1 kB
Tags Source
SHA-256 checksum
How to use checksums
bec99216f31615ee653b2a5c87cacfb4e4b6184c0e9f71da186300dacae974f3
BLAKE2b-256 checksum
How to use checksums
9d646e522f0a1b500470ae14dcd1a4bb8f8751f5cf441e85e9fee7dfc712cb7b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.6.7

Release files / oschmod-0.3.12-py2.py3-none-any.whl

Download URL oschmod-0.3.12-py2.py3-none-any.whl
Size 14.1 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
e71efd5ebcf5cfbb620548644f39eed4fc3cd4a907638a8caaff452fb256637c
BLAKE2b-256 checksum
How to use checksums
946ade92fdb86ed24b320c3d8dc07c9eade21010c5231a46d5cc53024f45168a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.6.7

Release history Release notifications | RSS feed

This release

0.3.12 This release

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page