Narazil jsem na zajímavé diskusní vlákno na Twitteru. Jde o otázku na pohovor. Otázka zní – Co uděláte, když dojde k náhodnému odebrání spustitelného oprávnění příkazu Chmod? Jak možná víte, chmod (zkratka pro Ch ange mod e) příkaz se používá k nastavení nebo změně přístupových oprávnění k souboru nebo adresáři v systémech podobných Unixu. Pokud je tedy oprávnění ke spustitelnému programu chmod odebráno, nemůžete oprávnění přiřadit žádnému programu, včetně samotného příkazu chmod. Sedíte v pohovorovém panelu a tazatel právě položil tuto otázku. Jak tedy v Linuxu obnovíte oprávnění ke spustitelnému příkazu chmod?
"Zkopíruji binární soubor chmod z jiných systémů?", můžete odpovědět. No, máte jen jeden systém. Nemůžete tedy zkopírovat binární soubor chmod z jiných systémů. Můžete znovu odpovědět:"Nastavím bit spuštění z perlu.". Tazatel říká:"Na vašem počítači nejsou žádní tlumočníci.". Neexistuje ani připojení k internetu/telefonu, takže ani nemůžete nikoho kontaktovat o pomoc. Jak v takové zoufalé situaci obnovíte spustitelné oprávnění příkazu Chmod? Pokud již znáte odpověď, velký palec nahoru pro vaši inteligenci. Pokud nejste kritický myslitel (jako já!), čtěte prosím dále.
Upozornění:
Nepokoušejte se prosím odebrat oprávnění ke spuštění příkazu chmod v produkčním systému. Vyzkoušejte to na virtuálním počítači nebo testovacím počítači. Je to jen pro vzdělávací účely.
Co uděláte, když jste omylem odebrali oprávnění ke spuštění příkazu Chmod?
Řekněme, že jste omylem spustili následující příkaz:
# chmod -x $(which chmod)
Zde je -x flag odebere spustitelné oprávnění daného programu. V našem případě je to chmod.
Jste velmi zvědaví a opravdu nevíte, co tento příkaz udělá. Nyní jste ztratili oprávnění ke spustitelnému příkazu chmod. Neexistuje způsob, jak znovu obnovit oprávnění ke spustitelnému souboru chmod. Pokud se pokusíte nastavit oprávnění, použijte následující příkaz:
# chmod +x $(which chmod)
Zobrazí se následující chybová zpráva:
bash: /usr/bin/chmod: Permission denied
I když se odhlásíte a zkoušíte od jiných uživatelů sudo, nemůžete přidělit oprávnění pomocí příkazu chmod:
$ sudo chmod +x $(which chmod) sudo: chmod: command not found
Jak obnovíte oprávnění chmod zpět na původní? No, je to jednodušší, než si myslíte.
Obnovit oprávnění ke spustitelnému souboru příkazu Chmod v systému Linux
Existuje několik způsobů, jak obnovit oprávnění ke spuštění do chmod. Zde jsem uvedl 7 metod.
Metoda 1 – Zkopírujte obsah binárního souboru chmod do jiných pracovních binárních souborů
Pamatujte, že jsme odstranili oprávnění ke spustitelnosti pouze příkazu chmod, ale nikoli oprávnění jiných příkazů. Že jo? Ano! Ostatní příkazy mají stále oprávnění ke spuštění. Tento problém tedy můžeme vyřešit zkopírováním obsahu příkazu chmod do jakéhokoli jiného spustitelného příkazu, například "mkdir", a obnovením oprávnění ke spustitelnému souboru chmod zpět na jeho originál.
Před kopírováním udělejme zálohu příkazu mkdir pomocí příkazu:
# cp /usr/bin/mkdir /usr/bin/mkdir.bak
Dále zkopírujte obsah /usr/bin/chmod do /usr/chmod/mkdir pomocí příkazu "cat":
# cat /usr/bin/chmod > /usr/bin/mkdir
Nyní se příkaz mkdir stal příkazem chmod (protože jsme zkopírovali obsah chmod do binárního souboru mkdir).
A poté obnovte oprávnění ke spuštění skutečného binárního souboru chmod pomocí příkazu:
# mkdir +x /usr/bin/chmod
Případně můžete zkopírovat obsah mkdir zpět do binárního souboru chmod:
# mv /usr/bin/mkdir /usr/bin/chmod
Nakonec obnovte původní příkaz mkdir ze zálohy:
# mv /usr/bin/mkdir.bak /usr/bin/mkdir
Hotovo! Úspěšně jsme obnovili oprávnění ke spuštění příkazu chmod.
Zkontrolujte, zda jsou oprávnění ke spustitelnému souboru obnovena pomocí příkazu "ls":
# ls -l /usr/bin/chmod
Nebo,
# ls -l $(which chmod) -r-xr-xr-x 1 root root 63864 May 27 07:16 /usr/bin/chmod
Všimněte si písmen "x" ve výše uvedeném výstupu. Označuje oprávnění ke spuštění.
Můžete to také ověřit přiřazením oprávnění ke spuštění jakémukoli jinému programu pomocí chmod, jako je uvedeno níže:
# chmod +x ostechnix.sh
# ls -l total 0 -rwxr-xr-x 1 root root 0 May 27 07:43 ostechnix.sh
Toto je nejjednodušší metoda, protože se nemusíte nic učit nazpaměť. Jednoduše jsme zkopírovali obsah chmod do jiných příkazů pomocí příkazu cat a poté obnovili oprávnění ke spuštění.
Testoval jsem to v Ubuntu 20.04 server edition. V jiných distribucích Linuxu může být binární soubor chmod dostupný pod /bin/ adresář. Binární umístění chmod můžete najít pomocí následujícího příkazu:
$ which chmod
Toto je však nejen cesta. Rychle jsem prohledal Google a našel několik dalších metod. Možná si budete muset zapamatovat následující příkazy.
Metoda 2 – Použití příkazu cp
Toto je další způsob, jak obnovit oprávnění ke spustitelnému souboru do chmod.
V této metodě používáme příkaz "cp" ke zkopírování atributů:
# cp --attributes-only --preserve=mode /proc/self/exe /usr/bin/chmod
Metoda 3 – pomocí GNU linker/loader (ld)
V této metodě můžete přímo spustit zavaděč "ld" a předat mu příkaz, který chcete spustit, jak je uvedeno níže:
# /lib64/ld-linux-x86-64.so.2 /usr/bin/chmod +x /usr/bin/chmod
Pokud používáte 32bitové systémy, příkaz by byl:
$ /lib/ld-linux.so /usr/bin/chmod +x /usr/bin/chmod
Cesta k zavaděči může velmi záviset na distribuci Linuxu, kterou používáte. Výše uvedené příkazy jsou pro Ubuntu a jeho deriváty. V jiných distribucích může být cesta odlišná:
# /lib/libc.musl-x86_64.so.1 /bin/chmod +x /bin/chmod
Metoda 4 – Použití setfacl
Spustitelná oprávnění chmod můžeme obnovit pomocí příkazu "setfacl".
Nejprve upravte ACL binárního souboru chmod pro uživatele s oprávněním ke čtení a spouštění:
# setfacl -m u::rx /usr/bin/chmod
Poté obnovte oprávnění chmod zpět na původní:
# chmod +x $(which chmod)
Nakonec odstraňte všechny položky ACL z chmod. Toto je volitelné.
# setfacl -b /usr/bin/chmod
Pokud příkaz setfacl není dostupný, nainstalujte balíček "acl". Například spusťte následující příkaz pro instalaci acl na Debian, Ubuntu a jeho deriváty:
# apt install acl
Metoda 5 – Použití rsync
Rsync není jen pro kopírování nebo zálohování souborů a adresářů mezi systémy. Lze jej také použít k přiřazení oprávnění pro soubory.
Nejprve zkopírujeme binární soubor chmod do umístění /tmp a zároveň přiřadíme spustitelná oprávnění všem, tj. uživatelům, skupinám a dalším:
# rsync /usr/bin/chmod /tmp/chmod --chmod=ugo+x
Dále zkontrolujte, zda je oprávnění ke spustitelnému souboru přiřazeno chmod:
$ ls -l /tmp/chmod
Ukázkový výstup:
-r-xr-xr-x 1 root root 63864 May 27 10:01 /tmp/chmod
Pokud jsou oprávnění v pořádku, jednoduše přepište původní soubor souborem /tmp/chmod:
# mv /tmp/chmod /usr/bin
Metoda 6 – Použití Busybox
Některé nedávné distribuce Linuxu mají "Busybox" ve výchozím nastavení nainstalováno. Z manuálové stránky Busybox
BusyBox kombinuje malé verze mnoha běžných unixových nástrojů do jediného malého spustitelného souboru. Poskytuje minimalistické náhrady za většinu utilit, které obvykle najdete v GNU coreutils, util-linux atd. Utility v BusyBox mají obecně méně možností než jejich plnohodnotní GNU příbuzní; nicméně zahrnuté možnosti poskytují očekávanou funkčnost a chovají se velmi podobně jako jejich protějšky GNU.
Chcete-li obnovit oprávnění ke spuštění Chmod s busybox, spusťte:
# busybox chmod +x /usr/bin/chmod
Metoda 7 – Použití Perlu
V případě, že je na vašem systému dostupný Perl, můžete opravit oprávnění ke spuštění Chmodu příkazem:
# perl -e 'chmod 0755, "/usr/bin/chmod"'
Jak vidíte, jde o triviální problém, který mohou chytří uživatelé Linuxu snadno vyřešit. Pokud jste začínající nebo středně pokročilý uživatel Linuxu, pravděpodobně na to nikdy nepřijdete. Tyto otázky mohou být položeny ke kontrole duchapřítomnosti dotazovaného a jeho myšlení. Díky zmíněnému vláknu na Twitteru jsem se dnes dozvěděl něco užitečného. Doufám, že to bude užitečné i pro vás.
Související čtení:
- Jak najít soubory na základě jejich oprávnění v systému Linux
- Jak kopírovat soubory a měnit vlastnictví a oprávnění současně