Блог

Тук можеш да прочетеш някои от статиите ми.

Поправка на правата на файловете – Debian

Няма коментари

Знаете, че линукс шела е много мощен. Дори прекалено мощен! Уверих се в тази теза преди 4 часа, когато успях да скапя цялата система само с една команда… защото бях объркал един символ по невнимание.

Е, пиша тази статия за да запазя това туториалче, както и да помогна поне на някой, който се намери в същата ситуация.

ОК, какво се случи

Наложи ми се да променя правата на файловете в една директория, и понеже бях в нея реших да направя:

chmod -R 777 .

Да, и познайте кой символ натиснах вместо точката. Точно отдясно на нея…

chmod -R 777 /

Спрях го веднага разбира се, но беше достатъчно да ми скапе правата на файловете и папките.

Решението

Тъй като в линукс няма вграден начин за поправка на тези права или връщане към тези по подразбиране имате само две опции: преинсталация и копиране на правата от друга система. Ето как става втория…

ВАЖНО!!!

Ако в момента се намирате в такава ситуация и използвате ssh за връзка с линукса НЕ ЗАТВАРЯЙТЕ терминала за нищо на света. Някои важни за ssh файлове са с пълни права за достъп от всички и няма да ви разреши да се логнете повече. За това първите неща, които трябва да направите са да пуснете тези три команди:

chmod 600 /var/run/sshd
chmod 600 /etc/ssh/ssh_host_*
chmod 4755 /bin/su

Това ще „поправи“ ssh и ще ви позволи отново достъпа. Последното е за „su“, което също ще полудее. Ако използвате sudo няма да е лошо да пуснете и

chmod 4755 /usr/bin/sudo

Сега ще копираме правата на файловете от друга система със същия линукс

Първо се логвате в „чистата“ машина като root, правите нов файл:

nano permissions

и вътре поставяте следния скрипт:

#!/bin/sh
cd /
cp /dev/null /tmp/fixit.sh
echo #\!/bin/sh > /tmp/fixit.sh
chmod 700 /tmp/fixit.sh

# Fix the below list to match your system
for GOODDIRS in "bin" "etc" "home" "media" "tmp" "usr" "var" "srv" ; do
    for FILE in `find $GOODDIRS -name \*` ; do
        STICKY=""
        MODE=`ls -lad $FILE | awk '{print $1}'`
        BINMODE=`echo $MODE | sed s/-/0/g | sed s/\[rwx\]/1/g | sed s/.//`
        STICKY=`echo $BINMODE | grep [st]`
        if [ "$STICKY" = "" ] ; then
            MODE=`echo $BINMODE | awk '{print strtonum(substr($1,1,1))*4 + strtonum(substr($1,2,1))*2 + strtonum(substr($1,3,1)) strtonum(substr($1,4,1))*4 + strtonum(substr($1,5,1))*2 + strtonum(substr($1,6,1)) strtonum(substr($1,7,1))*4 + strtonum(substr($1,8,1))*2 + strtonum(substr($1,9,1))}'`
            echo chmod $MODE \'/$FILE\' >> /tmp/fixit.sh
        else
            echo "echo /$FILE has sticky bit set, manually change to $MODE" >> /tmp/fixit.sh
        fi
    done
done

echo "DONE!!!"

Този скрипт ще запише правата на всеки файл в гореизброените директории във файла /tmp/fixit.sh
Пускате скрипта:

chmod +x permissions
./permissions

И сега се чака до час в зависимост от това колко файлове са в системата. При мен /tmp/fixit.sh файла стана 6MB.

Сега /tmp/fixit.sh го копирате на пострадалата машина, давате му права за изпълнение и го пускате:

chmod +x fixit.sh
./fixit.sh

Като свърши сме почти готови. Трябва да си оправите нещата в /dev, /bin, /sbin, /usr/bin, /usr/sbin и /usr/local/bin ръчно.

chmod -R 755 /bin
chmod -R 755 /sbin
chmod -R 755 /usr/bin
chmod -R 755 /usr/local/bin
chmod -R 755 /usr/sbin
chmod -R 755 /usr/local/sbin
chmod 755 /dev

Последното е без -R за да зададе правата само на папката. За „файловете“ в /dev трябва ръчно, един по един да гледате от другата машина и да си ги нагласите.

Ако имате проблеми с някой оплакващ се пакет го преинсталирайте

aptitude reinstall imeto-mu

Моментът на истината

Изпълнявате

reboot

и стискате палци да сте направили всичко както трябва. Ако не успее да се включи единственото решение е преинсталация.

Сподели

Коментари

Изкажи мнението си