Поправка на правата на файловете – 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
и стискате палци да сте направили всичко както трябва. Ако не успее да се включи единственото решение е преинсталация.


Коментари