Fayl va katalog buyruqlari
Server boshqaruvida oddiy fayl amallari juda ko'p uchraydi: log katalogini tekshirish, konfiguratsiya faylidan nusxa olish, yangi relizni kerakli joyga ko'chirish yoki vaqtinchalik fayllarni o'chirish. Xavf odatda buyruqning murakkabligida emas. Asosiy xavf — to'g'ri buyruqni noto'g'ri katalogda, noto'g'ri yo'lga yoki kutilganidan ko'proq o'zgarish qiladigan parametrlar bilan bajarishdir.
Ushbu qismda mashqlarni faqat ~/lab/file-commands katalogi ichida bajaring.
Shell va Bash qanday ishlaydi hamda
Buyruq sintaksisi va yordam hujjatlari qismlaridagi tushunchalar — qo'shtirnoqlar, type,
yo'llar va chiqish holati tushunchalari sizga tanish bo'lishi kerak.
Xavfsiz laboratoriya muhitini tayyorlash
Kutiladigan natija:
<username> o'rniga amalda sizning foydalanuvchi nomingiz chiqadi. Ushbu mashqlar uchun sudo kerak emas. Agar sudo
ishlatsangiz, uy katalogingiz ichida root foydalanuvchisiga tegishli fayllar yaratilishi va keyinchalik laboratoriya
katalogini tozalash qiyinlashishi mumkin.
Yo'llar va kataloglar bo'ylab harakatlanish
Mutlaq yo'l / katalogidan boshlanadi:
Nisbiy yo'l esa joriy ish katalogidan boshlanadi:
Ikkala yo'l ham bir xil obyektni ko'rsatishi mumkin. Lekin nisbiy yo'lning ma'nosi jarayon ayni vaqtda qaysi katalogda turganiga bog'liq.
Kataloglar bo'ylab harakatlanishda foydali buyruqlar:
cd - oldingi ish katalogiga qaytaradi. Bu cd .. bilan bir xil emas. cd .. joriy katalogning ota katalogiga o'tadi.
Ko'p ishlatiladigan yo'l belgilari:
.— joriy katalogni bildiradi...— ota katalogni bildiradi.~— Bash tomonidan foydalanuvchining uy katalogiga almashtiriladi./— kataloglarni ajratish belgisi va fayl tizimining ildiz katalogi.
Linux serverlarida keng tarqalgan fayl tizimlarida fayl nomlari katta-kichik harflarga sezgir. Shu sababli Reports,
reports va REPORTS uchta alohida nom bo'lishi mumkin.
Fayllar ro'yxatini ko'rish va ularni tekshirish
Quyidagi buyruqlardan boshlang:
ls -lah quyidagi parametrlarni anglatadi:
-l— batafsil ro'yxat ko'rinishi.-a— nomi.bilan boshlanadigan yashirin fayllarni ham ko'rsatish.-h— batafsil ro'yxatda fayl hajmlarini inson o'qishi qulay ko'rinishda chiqarish.
ls -ld . joriy katalog ichidagi fayllarni emas, katalogning o'zini ko'rsatadi.
Batafsil ro'yxat namunasi:
Natijani chapdan o'ngga qarab quyidagicha o'qing:
- Birinchi belgi — obyekt turi. Masalan,
dkatalogni,-esa oddiy faylni bildiradi. - Ruxsat bitlari — egasi, guruhi va boshqa foydalanuvchilarning huquqlari.
- Havolalar soni.
- Fayl egasi va guruhi.
- Fayl hajmi.
- Oxirgi o'zgartirilgan vaqt.
- Fayl yoki katalog nomi.
Havolalar soni faylning nechta nusxasi borligini emas, bir xil inode obyektiga nechta katalog yozuvi, ya'ni nom, ishora qilayotganini ko'rsatadi.
Hech qachon hard link yaratilmagan oddiy faylda bu qiymat 1 bo'ladi.
Bo'sh katalogda esa havolalar soni 2 dan boshlanadi:
- birinchi yozuv — ota katalogdagi katalog nomi;
- ikkinchi yozuv — katalog ichidagi
.yozuvi bo'lib, u yana shu katalogning o'ziga ishora qiladi.
Har bir ichki katalog havolalar sonini bittaga oshiradi. Sababi, ichki katalogdagi .. yozuvi ota katalogga ishora
qiladi:
count-demo katalogida havolalar soni 3 bo'ldi:
- ota katalogdagi
count-demonomi; - katalog ichidagi
.; childkatalogi ichidagi...
Oddiy faylda havolalar soni 1 dan katta bo'lsa, bir nechta fayl nomi aynan bir xil ma'lumotga ishora qilayotganini
anglatadi. Bu mavzu quyidagi Hard link va symbolic link farqi bo'limida
tushuntiriladi.
Ranglar fayllarni ajratishda qulay, lekin ular ishonchli manba emas. Ranglar aliaslar va LS_COLORS sozlamasiga bog'liq.
Aniqroq tekshirish uchun:
file fayl tarkibining turini aniqlashga harakat qiladi. stat esa inode, egasi, ruxsat rejimi, hajmi va vaqt
belgilari kabi metadata ma'lumotlarini ko'rsatadi.
Yashirin fayllar
Nomi . bilan boshlanadigan fayllar oddiy ls natijasida ko'rinmaydi:
ls -A yashirin nomlarni ko'rsatadi, lekin nazarda tutiladigan . va .. yozuvlarini chiqarmaydi.
Yashirin fayllar maxsus xavfsizlik qoidalari bilan himoyalanmaydi. Ular faqat nomlash qoidasi tufayli oddiy ro'yxatda ko'rinmaydi.
Fayl va kataloglar yaratish
Kichik loyiha tuzilmasini yarating:
Kutiladigan tuzilma:
mkdir -p mavjud bo'lmagan ota kataloglarni ham yaratadi. Belgilangan katalog avvaldan mavjud bo'lsa, xatolik bilan
tugamaydi.
{config,logs,backup} qismi Bash brace expansion hisoblanadi. mkdir ishga tushishidan oldin Bash bu yozuvni uchta
alohida argumentga aylantiradi.
touch fayl mavjud bo'lmasa, bo'sh fayl yaratadi. Fayl avvaldan mavjud bo'lsa, odatda uning vaqt belgilarini yangilaydi.
Faylga ma'lumot yozing:
printf 'port=8080\n' > project/config/app.conf
printf 'mode=lab\n' >> project/config/app.conf
cat project/config/app.conf
Natija:
Warning
> belgisi buyruq yangi ma'lumot yozishidan oldin mavjud fayl tarkibini tozalaydi. Laboratoriyada bu foydali
bo'lishi mumkin, lekin production konfiguratsiya fayllarida xavflidir. Muhim fayllarda qayta yo'naltirishdan oldin
zaxira nusxa yarating va nishon faylni tekshiring.
Bo'sh katalogni o'chiring:
rmdir ichi bo'sh bo'lmagan katalogni o'chirishdan bosh tortadi. Bu cheklov xavfsizlik xususiyati hisoblanadi.
cp yordamida nusxa olish
Ko'p ishlatiladigan shakllar:
Fayldan nusxa oling va natijani tekshiring:
cp -i project/config/app.conf project/backup/app.conf
cmp project/config/app.conf project/backup/app.conf
echo "cmp status=$?"
Agar cmp hech qanday natija chiqarmasa va 0 holat kodini qaytarsa, ikki fayl baytma-bayt bir xil bo'ladi.
Butun katalog tuzilmasidan nusxa oling:
GNU cp -a archive rejimini bildiradi. U katalogni rekursiv nusxalaydi va imkon qadar fayl xususiyatlarini saqlab
qoladi.
cp -r ham rekursiv nusxalaydi, lekin u atributlarni saqlash maqsadini cp -a kabi aniq bildirmaydi.
Nishon katalog bilan bog'liq qoidalar muhim:
mkdir source existing-directory
touch source/file.txt
cp -a source new-name
cp -a source existing-directory/
find . -maxdepth 3 -print
Agar new-name mavjud bo'lmasa, u source katalogining nusxasiga aylanadi.
Agar nishon avvaldan mavjud katalog bo'lsa, source shu katalog ichiga nusxalanadi.
Mavjud bo'lishi mumkin bo'lgan yo'lga nusxa olishdan oldin quyidagicha tekshiring:
mv yordamida ko'chirish va nomini o'zgartirish
Fayl nomini o'zgartiring:
mv -i project/backup/app.conf project/backup/app.conf.old
test -f project/backup/app.conf.old && echo "new name exists"
test ! -e project/backup/app.conf && echo "old name is gone"
mv bitta katalog ichida fayl nomini o'zgartirishi yoki uni boshqa katalogga ko'chirishi mumkin.
Agar nishon fayl mavjud bo'lsa, mv uni almashtirib yuborishi mumkin. -i parametri almashtirishdan oldin tasdiq
so'raydi.
Bitta fayl tizimi ichida nom o'zgartirish odatda tez va atomar bajariladi.
Turli fayl tizimlari orasida esa mv ko'proq nusxa olish va keyin asl faylni o'chirish kabi ishlaydi.
Katta hajmdagi ma'lumotni ko'chirishdan oldin bo'sh disk joyi, jarayonning uzilib qolishi va ortga qaytarish imkoniyatini hisobga oling.
Hard link va symbolic link farqi
cp ma'lumotning ikkinchi, mustaqil nusxasini yaratadi.
Link esa bir xil ma'lumotga boshqa nom orqali murojaat qilish imkonini beradi. Linuxda xatti-harakati turlicha bo'lgan ikki xil link mavjud.
Hard link — bir xil inode obyektiga ishora qiladigan ikkinchi katalog yozuvidir:
printf 'v1\n' > project/config/app.conf
ln project/config/app.conf project/config/app.conf.hardlink
stat -c 'links=%h inode=%i name=%n' project/config/app.conf project/config/app.conf.hardlink
links=2 inode=... name=project/config/app.conf
links=2 inode=... name=project/config/app.conf.hardlink
Endi ikkala nom bir xil inode raqamini va 2 havola sonini ko'rsatadi.
Nomlarning istalgan biri orqali yozilgan ma'lumot aynan bir xil asosiy ma'lumotni o'zgartiradi:
Nomlardan bittasini o'chirish faqat shu katalog yozuvini olib tashlaydi.
Havolalar soni 0 ga tushmaguncha ma'lumot qolgan nom orqali mavjud bo'ladi.
Shu sababli qat'iy ma'noda rm “faylni o'chiradi” deyilmaydi. U fayl nomini olib tashlaydi.
Asosiy ma'lumot faqat oxirgi link va faylni ochiq holda ushlab turgan barcha jarayonlar yo'qolgandan keyin bo'shatiladi.
Symbolic link esa boshqa turdagi obyekt. U ichida yo'l saqlanadigan kichik fayl bo'lib, har safar undan foydalanilganda Linux yadrosi shu yo'lni qayta aniqlaydi:
ln -s app.conf project/config/app.conf.symlink
ls -l project/config/app.conf.symlink
stat -c 'links=%h inode=%i name=%n' project/config/app.conf.symlink
lrwxrwxrwx 1 admin admin 9 Jul 29 10:22 project/config/app.conf.symlink -> app.conf
links=1 inode=... name=project/config/app.conf.symlink
ls -l natijasining boshidagi l belgisi va -> orqali ko'rsatilgan nishon bu obyekt oddiy fayl emas, symlink ekanini
bildiradi.
Symlinkning o'z inode raqami va havolalar soni nishon faylnikidan alohida bo'ladi.
Amaliyotda, suhbatlarda yoki production muhitida muhim bo'ladigan asosiy farqlar:
- Nishon faylni o'chirish.
app.conffaylini o'chirsangiz,app.conf.hardlinkishlashda davom etadi. U “nishon” emas, balki aynan bir xil ma'lumotning teng huquqli ikkinchi nomidir.app.conf.symlinkesa uzilgan, ya'ni dangling link holatiga tushadi.lsuni ko'rsatadi, lekin ochishga uringandaNo such file or directoryxatosi chiqadi. - Fayl tizimlari orasida ishlash. Hard link faqat aynan bir fayl tizimidagi inode obyektiga ishora qilishi mumkin.
Sababi inode raqamlari faqat bitta fayl tizimi doirasida noyob bo'ladi.
lnturli fayl tizimlari orasida hard link yaratishni rad etadi. Symlink esa shunchaki saqlangan yo'l matni bo'lgani uchun istalgan joyga, boshqa fayl tizimiga yoki hali mavjud bo'lmagan yo'lga ham ishora qilishi mumkin. - Kataloglar. Linuxda katalog uchun hard link yaratib bo'lmaydi. Bu katalog daraxtida sikllar paydo bo'lishining oldini olish uchun taqiqlangan. Katalogga symlink yaratish esa mumkin.
rmnimani bilishi kerak. Oddiyrm symlink-namebuyrug'i faqat symlinkning o'zini o'chiradi, nishon faylni emas. Katalogga ishora qiladigan symlink oxiriga/qo'shish yoki uni katalogning o'zi kabi ishlatishga urinish ko'p chalkashliklarga sabab bo'ladi. Link bilan ishlaydigan skript yozishdan oldin quyidagilardan biri bilan tekshiring:
Misol:
readlink -f parametrsiz ishlatilsa, symlink ichida aynan qanday nishon matni saqlanganini ko'rsatadi.
readlink -f esa linkni kuzatib, uni to'liq mutlaq yo'lga aylantiradi.
Skript symlink ayni vaqtda qayerga ishora qilayotganini bilishi kerak bo'lsa, readlink -f kerak bo'ladi.
Bo'shliqli nomlar, wildcard va - bilan boshlanadigan nomlar
Ichida bo'shliq bo'lishi mumkin bo'lgan yo'llarni har doim qo'shtirnoq ichida yozing:
Fayl nomi - bilan boshlanishi mumkin bo'lsa, -- ishlating:
O'chirish kabi zararli amalni bajarishdan oldin wildcard qanday kengayishini oldindan ko'ring:
Buyruq ishga tushishidan oldin Bash *.log andozasini mos fayl nomlariga almashtiradi.
Hech qanday fayl mos kelmasa, Bashning standart sozlamalarida andoza o'z holicha qolishi mumkin.
Wildcard aynan siz kutgan fayllarga mos tushdi deb taxmin qilmang.
Fayllarni o'chirish
Laboratoriya faylini tasdiq so'raladigan rejimda o'chiring:
touch project/logs/test.log
ls -l -- project/logs/test.log
rm -i -- project/logs/test.log
test ! -e project/logs/test.log && echo "file removed"
Danger
Rekursiv o'chirish butun katalog daraxtini qayta tiklab bo'lmaydigan tarzda olib tashlashi mumkin. Katalogni o'chirishdan oldin to'liq yo'lni quyidagi buyruqlar bilan tekshiring:
Sinovdan o'tgan zaxira nusxa yoki snapshot va ortga qaytarish rejasi bo'lmasa, production serverda majburiy rekursiv o'chirishdan foydalanmang.Laboratoriya katalogini avval tekshiring:
target="$HOME/lab/file-commands/project"
printf 'target=<%s>\n' "$target"
find "$target" -maxdepth 3 -print
Faqat nishon to'g'ri va laboratoriya ichida ekaniga ishonch hosil qilgandan keyin:
-r katalogni ichidagi barcha obyektlar bilan rekursiv o'chiradi.
GNU -I ko'p fayl o'chirilishidan oldin bir marta tasdiq so'raydi. U -i ga qaraganda kamroq savol beradi, lekin
baribir zararli buyruq hisoblanadi.
Fayl amallaridagi odatiy xatolarni tushunish
Fayl buyruqlaridagi xatolarning aksariyati bir nechta keng tarqalgan xabarlardan biriga to'g'ri keladi.
Qaysi xatolik yuz berganini tanish muammoni aniqlashni ancha osonlashtiradi.
Bu yo'l umuman mavjud emas.
Quyidagilarni tekshiring:
- yozishda xato yo'qligini;
- noto'g'ri katalogda turmaganligingizni, avval
pwdni tekshiring; - oldingi qadam xato bilan tugab, siz buni sezmay qolmaganligingizni.
Yo'l yoki uning ota katalogi mavjud, lekin joriy foydalanuvchining ruxsat bitlari, yoki o'rnatilgan bo'lsa ACL, bu amalni bajarishga ruxsat bermaydi.
Darhol sudo ishlatishdan oldin egalik va ruxsat rejimini tekshiring:
Nima uchun ruxsat berilmayotganini tushunib oling. Har safar ruxsat tizimini chetlab o'tish uchun root huquqidan foydalanish ruxsat tizimining maqsadini yo'qqa chiqaradi.
Buyruq fayl kutgan edi, lekin unga katalog berildi.
Bu ko'pincha nusxa ko'chirish vaqtida yoki fayl yo'lini saqlashi kerak bo'lgan o'zgaruvchi katalog yo'lini saqlab qolganida yuz beradi.
Oddiy fayl talab qiladigan buyruqni ishga tushirishdan oldin quyidagilar bilan tekshirish mumkin:
rmdir ataylab faqat bo'sh kataloglarni o'chiradi.
Ichida fayllar mavjud katalog uchun rm -r yoki rm -rI kerak bo'ladi. Bunday buyruqni faqat find yordamida
tarkibini oldindan ko'rgandan keyin ishlating.
Amaliy vaziyat: konfiguratsiya nusxasini xavfsiz yangilash
Muammo: asl konfiguratsiya faylini saqlab qolgan holda uning o'zgartirilgan nusxasini tayyorlash kerak.
Asl faylni yarating:
mkdir -p ~/lab/file-commands/scenario/{current,backup}
printf 'port=8080\nmode=production\n' > ~/lab/file-commands/scenario/current/app.conf
Zaxira nusxa yarating va tekshiring:
cp -a ~/lab/file-commands/scenario/current/app.conf \
~/lab/file-commands/scenario/backup/app.conf.before-change
cmp ~/lab/file-commands/scenario/current/app.conf \
~/lab/file-commands/scenario/backup/app.conf.before-change
echo "backup status=$?"
O'zgartirilgan nusxani tayyorlang:
cp -a ~/lab/file-commands/scenario/current/app.conf \
~/lab/file-commands/scenario/current/app.conf.new
printf 'port=9090\nmode=production\n' > ~/lab/file-commands/scenario/current/app.conf.new
cat ~/lab/file-commands/scenario/current/app.conf.new
Faqat tekshirgandan keyin faylni almashtiring:
mv -i ~/lab/file-commands/scenario/current/app.conf.new \
~/lab/file-commands/scenario/current/app.conf
cat ~/lab/file-commands/scenario/current/app.conf
Xulosa: bu ish tartibi zaxira nusxa olish, tahrirlash, tekshirish va almashtirish bosqichlarini bir-biridan ajratadi.
Haqiqiy production servislarida qayta yuklash yoki qayta ishga tushirishdan oldin dasturga xos konfiguratsiya tekshiruvi ham talab qilinadi.
Keng tarqalgan xatolar
- Joriy katalog qayerdaligini bilmasdan fayl buyruqlarini bajarish.
- Uy katalogidagi laboratoriyada
sudoishlatib, root foydalanuvchisiga tegishli fayllar yaratish. cd -vacd ..buyruqlarini bir xil deb o'ylash.- Yashirin fayllar himoyalangan deb hisoblash. Ular faqat standart ro'yxatda ko'rinmaydi.
- Nishon katalog mavjud yoki yo'qligini tekshirmasdan katalogdan nusxa olish.
- Yo'llarni saqlaydigan o'zgaruvchilarni qo'shtirnoqsiz ishlatish.
- Nishonni oldindan ko'rmasdan rekursiv o'chirish buyrug'ini bajarish.
- Symlink va uning nishoni birga o'chiriladi yoki symlinkka
rmishlatilsa, u ko'rsatgan ma'lumot ham o'chadi deb hisoblash. Permission deniedxatosini ko'rib, egalik va ruxsatlarnils -lyordamida tekshirmasdan darholsudoishlatish.
Mashqlar
- Bitta buyruq yordamida
~/lab/file-commands/ex1/{input,output,tmp}tuzilmasini yarating. Keyinfindbilan tekshiring. - Nomida bo'shliq mavjud fayl yarating. Qo'shtirnoqsiz yozilgan xato buyruqni va qo'shtirnoq bilan yozilgan to'g'ri buyruqni ko'rsating.
- Katalogdan
cp -ayordamida nusxa oling,findbilan tekshiring, keyin nusxa nominimv -iyordamida o'zgartiring. - Uchta
.logfayl yarating. Ulardan bittasini interaktiv tarzda o'chirishdan oldin wildcard kengayishiniechoyordamida ko'ring. - Bir xil faylga hard link va symbolic link yarating. Asl faylni o'chiring va har bir link uchun
catishlatib, qaysi biri ishlashda davom etishini va qaysi biri dangling link bo'lib qolganini ko'rsating. - Laboratoriyada ataylab
No such file or directory,Permission deniedvaIs a directoryxatolarini yuzaga keltiring. Har birini tuzatishdan oldin sababini bitta jumla bilan yozing.
Manbalar
- GNU Coreutils qo'llanmasi: https://www.gnu.org/software/coreutils/manual/coreutils.html
lsbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.htmlcpbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.htmlmvbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.htmlrmbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/rm-invocation.htmllnbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/ln-invocation.htmlstatbuyrug'i: https://www.gnu.org/software/coreutils/manual/html_node/stat-invocation.html- Filesystem Hierarchy Standard: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html