Home Linux Troubleshooting How to Fix “Permission Denied” in Bash: Tips and Tricks

How to Fix “Permission Denied” in Bash: Tips and Tricks

Encountering a "Permission Denied" error in Bash can halt your workflow, but it's often a simple fix away from resolution. This article dives into the reasons behind this common error and provides practical solutions, from modifying file permissions to understanding ownership, to get you back on track.

by Arun Kumar
bash permission denied fix

Encountering the “Permission Denied” error in Bash is a common occurrence for Linux users, and can be frustrating to deal with. However, it’s important to understand that this error message is actually an indication that the system is working as intended and is preventing unauthorized access to certain files or directories.

By understanding the underlying reasons for this error and how to properly navigate permissions in Linux, users can deepen their knowledge and become more proficient in using the system. So, rather than being a roadblock, the “Permission Denied” error presents an opportunity for users to gain a better understanding of the inner workings of Linux.

Understanding the bash permission denied error

Before we roll up our sleeves, let’s understand what this error is about. At its core, the “Permission Denied” error is the Linux system’s way of telling you that you’re trying to access a file or execute a script without the necessary permissions. Linux is big on permissions, which is part of what makes it so secure and versatile.

Real-world example: The locked diary

Imagine you’ve found an old diary in your attic, but it’s locked with a padlock. You can see the diary, you know what you want to do with it (read it), but unless you have the key (permission), you’re not getting in. That’s what’s happening here.

Common scenarios

Trying to execute a non-executable script

Let’s dive into a common scenario. You’ve written a script called my_script.sh and when you try to run it with ./my_script.sh, you’re greeted with the dreaded “Permission Denied” error. This is like trying to read our hypothetical diary by simply staring at the padlock and hoping it opens. Not going to happen, right?

Sample Input:


Sample Output:

bash: ./my_script.sh: Permission denied

Accessing a file you don’t own

Another common case is trying to access a file that your user doesn’t have permission to read. It’s like trying to open a diary that’s not only locked but also clearly marked “Property of my sibling.”

Sample Input:

cat /etc/shadow

Sample Output:

cat: /etc/shadow: Permission denied

Fixing the Bash “Permission Denied” error

Changing permissions with chmod

The chmod command is your key to unlocking (pun intended). If you own the file or have sudo privileges, you can change the file’s permissions.


To make my_script.sh executable:

chmod +x my_script.sh

Then, running ./my_script.sh should work, provided the script is correctly written.

Changing ownership with chown

If the issue is with file ownership, chown might be your go-to. Beware, though; changing ownership is like taking someone else’s diary and declaring it yours. Make sure you have a good reason (and the necessary permissions) to do so.


To change the owner of my_script.sh to your user:

sudo chown your_username:your_username my_script.sh

Replace your_username with your actual username.

When to tread carefully

While chmod and chown can be powerful tools, they’re akin to using a sledgehammer for a job that might require a scalpel. Changing permissions and ownership willy-nilly can lead to security risks or system instability. Always ensure you understand the implications of these changes.

Advanced troubleshooting techniques

When the basic fixes don’t cut it, it’s time to pull out the big guns. Here’s where a deeper understanding of Linux’s permission system and some advanced commands come into play.

Understanding Linux permissions in depth

Before we proceed, a quick recap on Linux permissions might be in order. Permissions in Linux are represented by three sets of characters, each corresponding to the owner, group, and others, in that order. For example, rwxr-xr-- means the owner has full permissions (rwx), the group can read and execute (r-x), and others can only read (r--).

The setuid and setgid bits

These are special permission bits that grant users the ability to run an executable with the permissions of the executable’s owner or group.

  • setuid (Set User ID): When set on an executable, it allows users to run the executable with the permissions of the file’s owner.
  • setgid (Set Group ID): Similar to setuid, but it runs the executable with the permissions of the file’s group.


You might see permissions like this:

-rwsr-xr-x 1 root root 72216 Feb 19 12:34 /usr/bin/passwd

Notice the s in the owner’s permission set. This means the setuid bit is set, allowing any user to run the passwd command with root permissions, which is necessary to change their password.

Dealing with ACLs (Access Control Lists)

Standard file permissions might not always be flexible enough for your needs. That’s where ACLs come in. They allow you to set much more granular permissions for files and directories.

To view ACLs on a file:

getfacl /path/to/file

To set an ACL:

setfacl -m u:username:rwx /path/to/file

This command grants rwx permissions to username on /path/to/file.

Sticky bit

The sticky bit is a permission setting that’s particularly useful for directories shared by multiple users. It ensures that only the file’s owner, the directory’s owner, or the root user can delete or rename the files within the directory.

You’ll often see the sticky bit set on /tmp:

drwxrwxrwt 19 root root 4096 Feb 19 13:45 /tmp

Notice the t at the end of the permissions. That’s the sticky bit.

Debugging with strace

When all else fails, strace can be a powerful tool in your arsenal. It allows you to trace system calls and signals. While strace can produce a lot of output, it’s invaluable for understanding what’s happening under the hood when you run into a “Permission Denied” error.


strace -e trace=open,execve -f ./my_script.sh

This command traces all open and execve system calls made by ./my_script.sh, which can help identify where the “Permission Denied” error is occurring.

Wrapping up

Tackling the “Permission Denied” error in Linux can be both a challenge and a learning opportunity. From the basics of chmod and chown to the intricacies of ACLs and sticky bits, each aspect of Linux’s permission system is designed with security and flexibility in mind.

You may also like

Leave a Comment



FOSS Linux is a leading resource for Linux enthusiasts and professionals alike. With a focus on providing the best Linux tutorials, open-source apps, news, and reviews written by team of expert authors. FOSS Linux is the go-to source for all things Linux.

Whether you’re a beginner or an experienced user, FOSS Linux has something for everyone.

Follow Us


©2016-2023 FOSS LINUX



“Linux” is the registered trademark by Linus Torvalds in the U.S. and other countries.