Chmod: Permission denied

21 Jul 2016

one-liners  permissions  system  tools 

Share on:

Jak zmienić uprawnienia do pliku/katalogu bez dostępu do polecenia chmod? Oczywiście zakładam, że istnieje możliwość użycia innych narzędzi systemowych, za pomocą których jest możliwe przywrócenie poprawnych uprawnień.

W przypadku problemów przy próbie zmiany uprawnień pojawia się następująca informacja:

ls -l
-rw------- 1 root root     0 Feb 19 09:21 file

chmod 0700 file
bash: /bin/chmod: Permission denied

Całe szczęście chmod to nie jedyne narzędzie do zmiany uprawnień. Aby rozwiązać ten problem, system dostarcza kilka sposobów, które omówię poniżej.

Możliwe rozwiązania #

Polecenie cp #

Pierwszym sposobem poradzenia sobie z opisanym problemem jest wykorzystanie właściwości polecenia cp. Otóż można wykorzystać jakikolwiek plik czy polecenie mające prawa wykonywania i na jego podstawie zmienić uprawnienia dla chmod:

cp /bin/ls chmod.01
cp /bin/chmod chmod.01
./chmod.01 700 file

Polecenie cat #

Drugi sposób jest podobny, choć tutaj wykorzystuję narzędzie cat:

cp -a /bin/ls chmod.01
cat /bin/chmod > chmod.01
./chmod.01 700 file

Perl/Python #

Trzecim sposobem jest wykorzystanie interfejsu systemowego dostępnego w narzędziach takich jak perl czy python:

perl -e 'chmod 0700, "/root/file";'
>>> import os
>>> os.chmod("/root/file", 0700)

Polecenie install #

Czwarty sposób wykorzystuje narzędzie install, które służy m.in. do kopiowania plików i ustawiania atrybutów (dwa sposoby wykorzystania):

install -o root -g root -m 0700 /bin/chmod chmod.01
install -m +rwx /bin/chmod chmod.01

Busybox #

Na pomoc może przyjść także busybox:

/bin/busybox chmod 0700 file

Coreutils (Debian) #

Kolejnym sposobem jest przeinstalowanie paczki coreutils (w dystrybucji Debian) zawierającej m.in. program chmod:

apt-get install --reinstall coreutils

ACL #

Można także wykorzystać rozszerzone atrybuty i dostępne dla nich polecenie setfacl:

setfacl --set u::rwx,g::---,o::--- /root/file