1/Tinh % CPU,MEM dang su dung,neu vuot qua bao nhieu do thi se gui mail
2/Tinh quota user dang su dung,neu quota lo hon 100MB thi gui mail cho user,hon 120MB thi
ko cho login
2/Tinh quota user dang su dung,neu quota lo hon 100MB thi gui mail cho user,hon 120MB thi
ko cho login
3/Tinh tong so file rong [ -x ]
4/TInh tong dungluong cac file co duoi la extension.c
5/Viet doan script nhap 1 tham so bat ki,xac dinh xem so do co fai so nguyen to hay ko?
6/Tao file text sinh vien,nam sinh,que quan,chuyen nganh.Viet doan script in doan sinh vien bat
ki,va dem so sv co cung ten (in theo hang doc)
1>
#!/bin/sh
ps -eo pid,pcpu,comm,pmem | awk ‘{sumcpu+=$2;summem+=$4}END{printf “%d\t%d”,sumcpu,summem}’ > /tmp/ps
cpu=`cat /tmp/ps | awk ‘{print $1}’`
mem=`cat /tmp/ps | awk ‘{print $2}’`
if [ $cpu -gt 0 -o $mem -gt 0 ]
then
echo -e “time:$(date)\nhe thong qua tai: \n%cpu:$cpu \n%memory:$mem” >> /tmp/alert
cat /tmp/alert | mail -s “he thong qua tai” root
fi
ps -eo pid,pcpu,comm,pmem | awk ‘{sumcpu+=$2;summem+=$4}END{printf “%d\t%d”,sumcpu,summem}’ > /tmp/ps
cpu=`cat /tmp/ps | awk ‘{print $1}’`
mem=`cat /tmp/ps | awk ‘{print $2}’`
if [ $cpu -gt 0 -o $mem -gt 0 ]
then
echo -e “time:$(date)\nhe thong qua tai: \n%cpu:$cpu \n%memory:$mem” >> /tmp/alert
cat /tmp/alert | mail -s “he thong qua tai” root
fi
2>
tính dung lương user sử dụng trên toàn hệ thống
#!/bin/sh
read -p “Nhap user can check:” user
size=`find / -user $user 2> /dev/null -exec stat –format %s ‘{}’ \; | awk ‘{sum+=$1}END{printf “%
d”,sum}’`
size=`echo “$size/1024″ | bc`
echo “$user co dung luong su dung la:$sizeKB”
if [ $size -gt 100000 -a $size -lt 120000 ]
then
echo “$user, vuot qua 100MB trong he thong” | mail -s “quota user” $user
echo “$user, vuot qua 100MB trong he thong” | mail -s “quota user” root
elif [ $size -gt 120000 ]
then
echo “$user se bi lock”
usermod -L $user
fi
tính dung lương user sử dụng trên toàn hệ thống
#!/bin/sh
read -p “Nhap user can check:” user
size=`find / -user $user 2> /dev/null -exec stat –format %s ‘{}’ \; | awk ‘{sum+=$1}END{printf “%
d”,sum}’`
size=`echo “$size/1024″ | bc`
echo “$user co dung luong su dung la:$sizeKB”
if [ $size -gt 100000 -a $size -lt 120000 ]
then
echo “$user, vuot qua 100MB trong he thong” | mail -s “quota user” $user
echo “$user, vuot qua 100MB trong he thong” | mail -s “quota user” root
elif [ $size -gt 120000 ]
then
echo “$user se bi lock”
usermod -L $user
fi
3>
#!/bin/sh
echo “so file rong tron he thong la:”
find / -type f -a -size 0 | wc -l
#!/bin/sh
echo “so file rong tron he thong la:”
find / -type f -a -size 0 | wc -l
4>
#!/bin/sh
size=`find / -type f -a -iname *.c -exec stat –format %s ‘{}’ \; | awk ‘{sum+=$1}END{printf “%f”,sum}’`
size=`echo “$size/1024″ | bc`
num=`find / -type f -a -iname *.c | wc -l`
echo “co $num file trong he thong ( co duoi .c ) co dung luong la:$size KB”
#!/bin/sh
size=`find / -type f -a -iname *.c -exec stat –format %s ‘{}’ \; | awk ‘{sum+=$1}END{printf “%f”,sum}’`
size=`echo “$size/1024″ | bc`
num=`find / -type f -a -iname *.c | wc -l`
echo “co $num file trong he thong ( co duoi .c ) co dung luong la:$size KB”
5>
truyen tham so
#!/bin/sh
a=`echo “sqrt($1)+1″ | bc`
for i in `seq 2 $a`
do
tam=`echo “$1 % $i” | bc`
if [ $tam -eq 0 ]
then
echo “$1 ko phai la so nguyen to”
exit 0;
fi
done
echo “$1 la so nguyen to”
6>
tao file sv
ho&ten:dd-mm-yyyy:Que quan:ChuyenNganh
truyen tham so
#!/bin/sh
a=`echo “sqrt($1)+1″ | bc`
for i in `seq 2 $a`
do
tam=`echo “$1 % $i” | bc`
if [ $tam -eq 0 ]
then
echo “$1 ko phai la so nguyen to”
exit 0;
fi
done
echo “$1 la so nguyen to”
6>
tao file sv
ho&ten:dd-mm-yyyy:Que quan:ChuyenNganh
#!/bin/sh
file_data=’/root/shell/sv’ # thay doi duong dan den file sv
read -p “Nhap ten:” name
error=”ko tim thay user trung”
while read LINE
do
echo $LINE | cut -d: -f1 | grep -i $name$ >> /dev/null && echo $LINE | awk -F:
‘{print “\nName:”$1″\nNgaySinh:”$2″\nQueQuan:”$3″\nChuyenNganh:”$4}’ && error=” “
done < $file_data
echo $error
file_data=’/root/shell/sv’ # thay doi duong dan den file sv
read -p “Nhap ten:” name
error=”ko tim thay user trung”
while read LINE
do
echo $LINE | cut -d: -f1 | grep -i $name$ >> /dev/null && echo $LINE | awk -F:
‘{print “\nName:”$1″\nNgaySinh:”$2″\nQueQuan:”$3″\nChuyenNganh:”$4}’ && error=” “
done < $file_data
echo $error
7/
Có hai server chạy hai dịch vụ giống nhau. Nếu dịch vụ A trên server A chết thì chạy dịch
vụ đó trên server B.
- Trên server A thực hiện ssh không hỏi password tới server B
- Trên server A thực hiện viết đoạn script sau:
vụ đó trên server B.
- Trên server A thực hiện ssh không hỏi password tới server B
- Trên server A thực hiện viết đoạn script sau:
#!/bin/bash
#neu dich vu tren server A chet thi start dich vu do tren Server B
#o day vi du la dich vu httpd
#host A da ssh ko hoi password bang host B va nguoc lai
while [ 1 ]
do
status=`ps -ef | grep httpd | grep -v grep | wc -l`
if [ $status -gt 0 ]
then
sleep 60
else
ssh 192.168.1.3 “service httpd restart”
echo `date` | mail -s “service httpd down” root@localhost
break
fi
done
- Trên server A thực hiện chạy đoạn script. ./monitor_app.sh
- Trên server A thực hiện tắt dịch vụ httpd. Service httpd stop
- Trên server B kiểm tra dịch vụ httpd (trước đó dịch vụ httpd không hoạt động).
Server có hai gateway 192.168.159.99 và 192.168.159.100, nếu 192.168.159.99 chết thì
đi qua cổng kia.
- Trên server A thực hiện tắt dịch vụ httpd. Service httpd stop
- Trên server B kiểm tra dịch vụ httpd (trước đó dịch vụ httpd không hoạt động).
Server có hai gateway 192.168.159.99 và 192.168.159.100, nếu 192.168.159.99 chết thì
đi qua cổng kia.
- Thực hiện chạy script sau để kiểm tra:
#!/bin/bash
#may tinh co 2 card mang, card 1 down thi dung card 2
while [ 1 ]
do
ping -c3 192.168.1.3 > /dev/null
if [ $? -ne 0 ]
then
ip route add default via 192.168.1.2 dev eth1
break
fi
done
===============================================
1. Tim cac file co thoi gian access < 1 ngay find /home -ctime -1
2. Dùng lenh scp de copy toàn 1 thu muc chua file1, file2, file3 tu máy A sang máy B.
scp a.local:/root/file/* b.local:/root/file/
scp a.local:/root/file/* b.local:/root/file/
3. Làm lai câu 4 su dung ket hop voi lenh nén de giam thieu dung luong truyen.
tar -cvf – /test | ssh b.local “cat >~/test.tar”
tar -cvf – /test | ssh b.local “cat >~/test.tar”
4. Dùng lenh rsync de tao backup1, backup2,… backup7 cho 7 ngày liên tiep. Luu ý, backupN chi chua thông tin khác biet so voi backup(N-1) mà thôi chu không chua toàn bo thu muc backup.
Login vào server can backup, thuc hien lenh sau de dong bo hóa /home cua server này voi backup server (IP: 192.168.1.100).
rsync -avz –delete -e ssh /home/ 192.168.1.100:/home
rsync -avz –delete -e ssh /home/ 192.168.1.100:/home
Backup toi máy local
rsync -avh –delete /home/user/dir/ /media/disk/backup
rsync -avh –delete /home/user/dir/ /media/disk/backup
Các buoc tao snapshot:
- gia su ta tao snapshot cho 3 ngày chua trong 3 thu muc backup0,1,2 (0=moi nhat)
=> mv backup2 backup3
=> mv backup1 backup2
=> cp -al backup0/ backup1/
=> rsync -a –delete /dir_to_backup backup0/
- gia su ta tao snapshot cho 3 ngày chua trong 3 thu muc backup0,1,2 (0=moi nhat)
=> mv backup2 backup3
=> mv backup1 backup2
=> cp -al backup0/ backup1/
=> rsync -a –delete /dir_to_backup backup0/
Khi can khôi phuc lai ngày thu 3
cp /backup3/backup2/backup1/ /dir_to_backup
5. Dùng “at” thuc hien các lenh sau dây:
- Sau 5 phút nua: list các user dang connect vào he thong. Ðem so user này, sap xep theo thu tu a,b,c.
- Lúc 8 gio sáng ngày mai, tat máy.
- Lúc 9:30am ngày thu 4, cam tat ca user có tên bat dau bang tu p
(ví du: phuongnn, phunt,…) login.
(Huong dan: vi?t file script, list tat ca user tên bat dau p, moi user dó dùng usermod de không cho login)
cp /backup3/backup2/backup1/ /dir_to_backup
5. Dùng “at” thuc hien các lenh sau dây:
- Sau 5 phút nua: list các user dang connect vào he thong. Ðem so user này, sap xep theo thu tu a,b,c.
- Lúc 8 gio sáng ngày mai, tat máy.
- Lúc 9:30am ngày thu 4, cam tat ca user có tên bat dau bang tu p
(ví du: phuongnn, phunt,…) login.
(Huong dan: vi?t file script, list tat ca user tên bat dau p, moi user dó dùng usermod de không cho login)
6. Tu dong các công viec bang crontab. Moi user có the thuc hien các công viec mot cách tu dong tai thoi diem hen truoc.
Ðe ghi các công viec, dùng lenh crontab -e.
Thuc hien các công viec sau:
- Moi ngày, lúc 8h sáng, báo cáo dung luong các dia cung qua email.
- Cuoi tuan, lúc 0h, thuc hien copy tat ca file cau hình cua /etc vào thu muc backup.
(Có the thuc hien phuc tap hon là backup thu muc /etc/ vào 1 máy tính khác dùng ftp server. Tu tìm hieu cài dat vsftpd ).
Ðe ghi các công viec, dùng lenh crontab -e.
Thuc hien các công viec sau:
- Moi ngày, lúc 8h sáng, báo cáo dung luong các dia cung qua email.
- Cuoi tuan, lúc 0h, thuc hien copy tat ca file cau hình cua /etc vào thu muc backup.
(Có the thuc hien phuc tap hon là backup thu muc /etc/ vào 1 máy tính khác dùng ftp server. Tu tìm hieu cài dat vsftpd ).
7. Thuc hien công viec don gian sau: vào lúc 8h sáng moi ngày, kiem tra tat ca máy tính trong mang có hoat dong không và báo ket qua.
(Huong dan, viet script su dung crontab, ping).
(Huong dan, viet script su dung crontab, ping).
8. Viet script kiem tra trong thu muc public_html cua userA (userA nhap tu lenh), neu có file nào executable duoc thì chuyen lai thành non-executable.
9. Viet file script thuc hien viec in tên tat ca file trong mot thu muc (chi in tên, không in duong dan.
Huong dan: dùng lenh ‘basename’).
Huong dan: dùng lenh ‘basename’).
10. Viet file script thuc hien viec in tên tat ca file trong mot thu muc, kích thuoc các file và tính kích thuoc tong cong cua tat ca các file. (không dùng lenh du -sh).
11. Tao cau trúc file nhu sau: các thu muc duoc có tên là 1 den 20.Trong moi thu muc có 1 hoac nhieu file. Viet file script xóa tat ca file trong thu muc trên nhung không xóa thu muc.
12. Cho file du lieu chua tên, tuoi, khóa, diem trung bình. Xep thông tin sinh viên theo:
_ Ðiem
_ Niên khóa
_ Ðiem
_ Niên khóa
13.Viet chuong trình in ra thông tin cua các partition voi lenh df -k. Sap xep các partition này theo thu tu tu cao xuong thap cua % dia
dã duoc su dung. Goi email thông báo cho admin tat ca các partition có % su dung lon hon 90%.
dã duoc su dung. Goi email thông báo cho admin tat ca các partition có % su dung lon hon 90%.
14. Cho file du lieu chua tên, tuoi, khóa, diem trung bình, gioi tính. Tính diem trung bình theo gioi tính.
15/TInh tong dungluong cac file co duoi la extension.c
#!/bin/sh
size=`find / -type f -a -iname *.c -exec stat –format %s ‘{}’ \; |
awk ‘{sum+=$1} END {printf “%f”,sum}’`
size=`echo “$size/1024″ | bc`
num=`find / -type f -a -iname *.c | wc -l`
echo “co $num file trong he thong ( co duoi .c ) co
dung luong la:$size KB”
#!/bin/sh
size=`find / -type f -a -iname *.c -exec stat –format %s ‘{}’ \; |
awk ‘{sum+=$1} END {printf “%f”,sum}’`
size=`echo “$size/1024″ | bc`
num=`find / -type f -a -iname *.c | wc -l`
echo “co $num file trong he thong ( co duoi .c ) co
dung luong la:$size KB”
16/chuyen terminal
tty
#terminal hien tai là bao nhiu
chvt 1
#chuyen terminal
Ctrl+Alt+f1
#chuyen terminal
2,3,4/login root liet kê user, tao user1, doi pass, xoá user
#terminal hien tai là bao nhiu
chvt 1
#chuyen terminal
Ctrl+Alt+f1
#chuyen terminal
2,3,4/login root liet kê user, tao user1, doi pass, xoá user
17/script xoá file
rm -rf `find / -user user1` #xoá file cua user1
rm -rf `find / -user user1` #xoá file cua user1
18/
find / -name a* #find bat dau = ki tu a
find / -name b* #find bat dau = ki tu b
find / -name 1* #find bat dau = so 1
find / -name [a-z][0-9]
19/
find /home -not -name a* #nhung file ko bat dau = ki tu a
#find /home -not -iname a*
20/
history #view list các lênh user dã su dung
history -c #clear các lenh user dã su dung
muon gioi han history chua duoc bao nhiêu lenh ta thêm 2 dòng vào file .bash_profile
HISTSIZE=300
HISTFILESIZE=300
find / -name a* #find bat dau = ki tu a
find / -name b* #find bat dau = ki tu b
find / -name 1* #find bat dau = so 1
find / -name [a-z][0-9]
19/
find /home -not -name a* #nhung file ko bat dau = ki tu a
#find /home -not -iname a*
20/
history #view list các lênh user dã su dung
history -c #clear các lenh user dã su dung
muon gioi han history chua duoc bao nhiêu lenh ta thêm 2 dòng vào file .bash_profile
HISTSIZE=300
HISTFILESIZE=300
21/
netstat -ntp | grep 25 | wc -l
netstat -ntp | grep 25 | wc -l
22/
Tao 1 file có chua các cot chua thông tin sinh viên gom : Tên, Tuoi, Ngày sinh, lop, gioi tính
sap xep theo gioi tính:
tìm so sinh vien nam, nu
Tao 1 file có chua các cot chua thông tin sinh viên gom : Tên, Tuoi, Ngày sinh, lop, gioi tính
sap xep theo gioi tính:
tìm so sinh vien nam, nu
23/Liet ke cac tien trinh dang chay voi user root:
ps -u root
ps -u root
24. Tìm hieu lenh sudo, visudo. Trong file /etc/sudoers chua các cau hình ve các lenh mà mot user có the thuc hien duoc.
Ta không truc tiep cau hình bang vi/vim mà dùng lenh visudo. Tao userA, user này có quyen cau hình dia chi IP cua máy mà
không can thành root. Tao userB có tat ca quyen nhu root mà can dánh password.
Ta không truc tiep cau hình bang vi/vim mà dùng lenh visudo. Tao userA, user này có quyen cau hình dia chi IP cua máy mà
không can thành root. Tao userB có tat ca quyen nhu root mà can dánh password.
25. Cau hình dia chi alias eth0:2 nhu sau:
Device=eth0:2
IPADDR=172.28.2.x
NETMASK=255.255.255.0
GATEWAY=172.28.2.1
ONBOOT=yes
USRCTL= yes
(x là so máy).
Restart lai network service. Login voi user non-root, cau hình dia chi IP thành 172.28.2.1x.
Login root, xóa USERCTL, restart l?i network service, login voi user non-root, cau hình lai dia chi IP thành 172.28.2.x.
Device=eth0:2
IPADDR=172.28.2.x
NETMASK=255.255.255.0
GATEWAY=172.28.2.1
ONBOOT=yes
USRCTL= yes
(x là so máy).
Restart lai network service. Login voi user non-root, cau hình dia chi IP thành 172.28.2.1x.
Login root, xóa USERCTL, restart l?i network service, login voi user non-root, cau hình lai dia chi IP thành 172.28.2.x.
26. Thay doi cau trúc default de khi tao file, file se có permission là 222.
vim /etc/login.defs
sua #UMASK 022
UMASK 222
vim /etc/login.defs
sua #UMASK 022
UMASK 222
27. Viet file script trong dó có mot lenh sleep trong thoi gian 100s. Chuyen file script thành 777, user, group là root. Login thành userX, thuc thi lenh trên và kiem tra suid cua process.
28. Mot hacker xâm nhap vào he thong, tao ra 1 user thuong. Có 3 cách de user có quyen nhu root cho nhung lan login sau:
a. thay doi sudo.
b. cho user có group chung voi root
c. Cho phép user dùng lenh vi de thay doi /etc/shadow.
Thuc hien 3 cách trên và kiem tra ket qua.
a. thay doi sudo.
b. cho user có group chung voi root
c. Cho phép user dùng lenh vi de thay doi /etc/shadow.
Thuc hien 3 cách trên và kiem tra ket qua.
===========================
1. Cho file du lieu chua ten, tuoi, khoa sinh vien, diem trung binh. Xep thong tin cua sinh vien theo: _theo diem. _ theo nien khoa.
sort -t”:” -k2 dssv
#!/bin/bash
cat cau1 | head -n +1
cat cau1 | tail -n +2 | sort -n -k4
cat cau1 | head -n +1
cat cau1 | tail -n +2 | sort -n -k4
#!/bin/bash
cat cau1 | head -n +1
cat cau1 | tail -n +2 | sort -n -k3
cat cau1 | head -n +1
cat cau1 | tail -n +2 | sort -n -k3
2. Viet chuong trinh in ra thong tin cua cac partition voi lenh df-k. Sap xep cac partition nay theo thu tu tu cao xuong thap cua % o dia da duoc su dung. Gui email thong bao cho admin tat ca partition co % su dung lon hon 90%
#!/bin/bash
touch /root/Desktop/noidung.txt
df -k | tail -n +2 | awk ‘{print $5}’ | awk -F % ‘{print $1}’ | sort -u >par
for i in `cat par`
do
if (( $i > 0 ));then
df -k | grep -w $i >> /root/Desktop/noidung.txt
fi
done
cat /root/Desktop/noidung.txt | mail -s “Dung luong partition 1″ root@localhost
3.Cho file du lieu chua ten, tuoi, khoa sinh vien, diem trung binh, gioi tinh. Tim diem trung binh theo gioi tinh.
#!/bin/bash
tong=0
read -p “nhap gioi tinh: ” gt
n=`cat danhsach | awk ‘/’$gt’/ {print $4}’ | tee diem | wc -l`
for i in `cat diem`
do
tong=`echo “$tong + $i” | bc`
done
d=`echo “$tong / $n” | bc -l`
printf %.2f $d
echo
tong=0
read -p “nhap gioi tinh: ” gt
n=`cat danhsach | awk ‘/’$gt’/ {print $4}’ | tee diem | wc -l`
for i in `cat diem`
do
tong=`echo “$tong + $i” | bc`
done
d=`echo “$tong / $n” | bc -l`
printf %.2f $d
echo
4.Cho nguoi dung nhap vao danh sach cac cong ty: so luong cong nhan, thong tin cong nhan: Ten, tuoi, phong lam viec. Xuat thong tin ra dung ham select va cho phep chon nguoi thu may.
#!/bin/bash
read -p “nhap so cong nhan: ” n
for i in `seq 1 $n`
do
read -p “nhap ten: ” ten
read -p “nhap tuoi: ” tuoi
read -p “nhap phong: ” phong
echo “$ten $tuoi $phong”
echo “$ten $tuoi $phong” >> danhsach
done
read -p “nhap cong nhan thu: ” j
cat danhsach | head -n $j | tail -n 1
read -p “nhap y de tiep tuc: ” CHOICE
if [ "$CHOICE" == "y" ];then
bash cau4
fi
read -p “nhap so cong nhan: ” n
for i in `seq 1 $n`
do
read -p “nhap ten: ” ten
read -p “nhap tuoi: ” tuoi
read -p “nhap phong: ” phong
echo “$ten $tuoi $phong”
echo “$ten $tuoi $phong” >> danhsach
done
read -p “nhap cong nhan thu: ” j
cat danhsach | head -n $j | tail -n 1
read -p “nhap y de tiep tuc: ” CHOICE
if [ "$CHOICE" == "y" ];then
bash cau4
fi
5.ve bieu do
#!/bin/bash
df -k | awk ‘{print $5}’ | tail -n +2 | awk -F % ‘{print $1}’ >dulieu
for i in `cat dulieu`
do
printf %10s $i”%: ”
a=` echo “$i * 2″ | bc -l `
for ((j=1;j<=$a;j++))
do
printf “#”
done
echo
done
df -k | awk ‘{print $5}’ | tail -n +2 | awk -F % ‘{print $1}’ >dulieu
for i in `cat dulieu`
do
printf %10s $i”%: ”
a=` echo “$i * 2″ | bc -l `
for ((j=1;j<=$a;j++))
do
printf “#”
done
echo
done
6.oan tu xi
#!/bin/bash
for i in `seq 1 3`
do
a=$(($RANDOM%3))
b=$(($RANDOM%3))
for i in `seq 1 3`
do
a=$(($RANDOM%3))
b=$(($RANDOM%3))
if (( $a == 0 ));then
echo “N1: keo”
elif (( $a == 1 ));then
echo “N1: bua”
else echo “N1: bao”
fi
echo “N1: keo”
elif (( $a == 1 ));then
echo “N1: bua”
else echo “N1: bao”
fi
if (( $b == 0 ));then
echo “N2: keo”
elif (( $b == 1 ));then
echo “N2: bua”
else echo “N2: bao”
fi
echo “N2: keo”
elif (( $b == 1 ));then
echo “N2: bua”
else echo “N2: bao”
fi
if (( $a == $b ));then
echo “N1 va N2 hoa”
elif (( $a == 0 && $b == 1 ));then
echo “N2 thang”
elif (( $a == 0 && $b == 2 ));then
echo “N1 thang”
elif (( $a == 1 && $b == 0 ));then
echo “N1 thang”
elif (( $a == 1 && $b == 2 ));then
echo “N2 thang”
elif (( $a == 2 && $b == 0 ));then
echo “N2 thang”
elif (( $a == 2 && $b == 1 ));then
echo “N1 thang”
fi
echo
done
echo “N1 va N2 hoa”
elif (( $a == 0 && $b == 1 ));then
echo “N2 thang”
elif (( $a == 0 && $b == 2 ));then
echo “N1 thang”
elif (( $a == 1 && $b == 0 ));then
echo “N1 thang”
elif (( $a == 1 && $b == 2 ));then
echo “N2 thang”
elif (( $a == 2 && $b == 0 ));then
echo “N2 thang”
elif (( $a == 2 && $b == 1 ));then
echo “N1 thang”
fi
echo
done
7.tao con quay chay len chay ve
#!/bin/bash
buoc=1
dem=0
speed=0.1
while true
do
let dem+=1
case $dem in
buoc=1
dem=0
speed=0.1
while true
do
let dem+=1
case $dem in
“1″)
echo -e ‘-’”\b\c”
sleep $speed
;;
echo -e ‘-’”\b\c”
sleep $speed
;;
“2″)
echo -e ‘\\’”\b\c”
sleep $speed
;;
echo -e ‘\\’”\b\c”
sleep $speed
;;
“3″)
echo -e ‘|’”\b\c”
sleep $speed
;;
echo -e ‘|’”\b\c”
sleep $speed
;;
“4″)
echo -e ‘/’”\b\c”
sleep $speed
if (( $buoc <= 10 ));then
echo -e ‘ ‘”\c”
elif (( $buoc <= 20 ));then
echo -e ‘ ‘”\b\b\c”
fi
let buoc+=1
if (( $buoc == 21 ));then
buoc=1
fi
dem=0
;;
esac
done
8.tao ssh khi login khong can pass
echo -e ‘/’”\b\c”
sleep $speed
if (( $buoc <= 10 ));then
echo -e ‘ ‘”\c”
elif (( $buoc <= 20 ));then
echo -e ‘ ‘”\b\b\c”
fi
let buoc+=1
if (( $buoc == 21 ));then
buoc=1
fi
dem=0
;;
esac
done
8.tao ssh khi login khong can pass
may server, may client
lam tat ca tren may server:
ssh-keygen -t rsa
ssh-keygen -t rsa
cat .ssh/id_rsa.pub | ssh root@192.168.75.146 ’cat >> .ssh/authorized_keys’
9.tao ssh tu dong
#!/bin/bash
for i in `seq 149 150`
do
ssh 192.168.75.$i ‘ssh-keygen -t rsa;\
cat /root/.ssh/id_rsa.pub’ >> /root/.ssh/authorized_keys
done
for i in `seq 149 150`
do
scp /root/.ssh/authorized_keys 192.168.75.$i:/root/.ssh/
done
for i in `seq 149 150`
do
ssh 192.168.75.$i ‘ssh-keygen -t rsa;\
cat /root/.ssh/id_rsa.pub’ >> /root/.ssh/authorized_keys
done
for i in `seq 149 150`
do
scp /root/.ssh/authorized_keys 192.168.75.$i:/root/.ssh/
done
10.
#!/bin/bash
a=`cat /etc/passwd | cut -d: -f3`
line=1
for i in $a
do
if (( $i >= 500 ));then
cat /etc/passwd | tail -n +$line | head -n 1
fi
line=$(( $line + 1 ))
done
#!/bin/bash
a=`cat /etc/passwd | cut -d: -f3`
line=1
for i in $a
do
if (( $i >= 500 ));then
cat /etc/passwd | tail -n +$line | head -n 1
fi
line=$(( $line + 1 ))
done
11.
#!/bin/bash
line=1
a=`df -h | awk ‘{print $5}’ | cut -d% -f1`
for i in $a
do
if (( $i > 10 ));then
df -h | tail -n +$line | head -n 1
fi
line=$(( $line + 1 ))
done
#!/bin/bash
line=1
a=`df -h | awk ‘{print $5}’ | cut -d% -f1`
for i in $a
do
if (( $i > 10 ));then
df -h | tail -n +$line | head -n 1
fi
line=$(( $line + 1 ))
done
tiếp nữa ………..
1-1: quota >90% mail cho root
#!/bin/bash
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘stat -c %s `find / -user Thai`’ > quota-192.168.75.$i
a=`cat quota-192.168.75.$i | awk ‘{sum+=$1} END {print sum}’`
quota=`echo “($a / 1024000000)*100″ | bc -l`
printf “%20s %2.2f %1s\n” quota-192.168.75.$i $quota %
b=`echo “$quota > 90″ | bc -l`
if (( $b == 1 ));then
echo “user vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘stat -c %s `find / -user Thai`’ > quota-192.168.75.$i
a=`cat quota-192.168.75.$i | awk ‘{sum+=$1} END {print sum}’`
quota=`echo “($a / 1024000000)*100″ | bc -l`
printf “%20s %2.2f %1s\n” quota-192.168.75.$i $quota %
b=`echo “$quota > 90″ | bc -l`
if (( $b == 1 ));then
echo “user vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
1-2: swap
#!/bin/bash
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘free’ > swap-192.168.75.$i
a=`cat swap-192.168.75.$i | grep -w Swap | awk ‘{print $3}’`
b=`cat swap-192.168.75.$i | grep -w Swap | awk ‘{print $2}’`
c=`echo “($a / $b)*100″ | bc -l`
printf “%20s %2.2f %1s\n” swap-192.168.75.$i $c %
d=`echo “$c > 90″ | bc -l`
if (( $d == 1 ));then
echo “swap vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘free’ > swap-192.168.75.$i
a=`cat swap-192.168.75.$i | grep -w Swap | awk ‘{print $3}’`
b=`cat swap-192.168.75.$i | grep -w Swap | awk ‘{print $2}’`
c=`echo “($a / $b)*100″ | bc -l`
printf “%20s %2.2f %1s\n” swap-192.168.75.$i $c %
d=`echo “$c > 90″ | bc -l`
if (( $d == 1 ));then
echo “swap vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
2-1: in ra so random tinh sum
#!/bin/bash
tong=0
a=y
while [ $a == y ]
do
b=$RANDOM
echo $b
let tong+=b
read -p “nhap y or n: ” a
done
if [ $a == n ];then
echo $tong
fi
#!/bin/bash
tong=0
a=y
while [ $a == y ]
do
b=$RANDOM
echo $b
let tong+=b
read -p “nhap y or n: ” a
done
if [ $a == n ];then
echo $tong
fi
2-2: %cpu
#!/bin/bash
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘ps -eo pcpu,pmem’ > pcpu-192.168.75.$i
a=`cat pcpu-192.168.75.$i | awk ‘{sum+=$1} END {print sum}’`
printf “%20s %2.2f %1s\n” pcpu-192.168.75.$i $a %
b=`echo “$a > 90″ | bc -l`
if (( $b == 1 ));then
echo “cpu vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
for i in `seq 150 150`
do
ssh 192.168.75.$i ‘ps -eo pcpu,pmem’ > pcpu-192.168.75.$i
a=`cat pcpu-192.168.75.$i | awk ‘{sum+=$1} END {print sum}’`
printf “%20s %2.2f %1s\n” pcpu-192.168.75.$i $a %
b=`echo “$a > 90″ | bc -l`
if (( $b == 1 ));then
echo “cpu vuot qua 90 %” | mail -s “thongbao” root@localhost
fi
done
3-2: kiem tra so chia het cho 2 3 5
#!/bin/bash
read -p “nhap 1 so bat ky: ” a
if (( $a%5 == 0 && $a%3 == 0 && $a%2 == 0 ));then
echo “$a la so chia het cho 2 3 5″
else echo “$a ko phai so chia het 2 3 5″
fi
#!/bin/bash
read -p “nhap 1 so bat ky: ” a
if (( $a%5 == 0 && $a%3 == 0 && $a%2 == 0 ));then
echo “$a la so chia het cho 2 3 5″
else echo “$a ko phai so chia het 2 3 5″
fi
4-1: tim file trong 1 thu muc duoi .c va tong file rong
#!/bin/bash
read -p “nhap duong dan thu muc can tim: ” var
find $var -type f | grep -w c$
printf “tong file rong: ” && ls -la $var | awk ‘{print $5}’ | grep -w 0 | wc -l
#!/bin/bash
read -p “nhap duong dan thu muc can tim: ” var
find $var -type f | grep -w c$
printf “tong file rong: ” && ls -la $var | awk ‘{print $5}’ | grep -w 0 | wc -l
4-1: ping neu ko dc thi start
#!/bin/bash
for i in `seq 150 150`
do
ping -c 1 192.168.75.$i
if (( $? == 1 ));then
ssh 192.168.75.$i ‘service httpd start’
fi
done
#!/bin/bash
for i in `seq 150 150`
do
ping -c 1 192.168.75.$i
if (( $? == 1 ));then
ssh 192.168.75.$i ‘service httpd start’
fi
done
5-2: dem user co id tu 500 den 600
#!/bin/bash
for i in `seq 500 600`
do
cat /etc/passwd | awk -F : ‘{print $1″\t”$3}’ | grep -w $i | cut -f1 >> temp
done
cat temp | uniq >> user
for i in `cat user`
do
finger $i
done
#!/bin/bash
for i in `seq 500 600`
do
cat /etc/passwd | awk -F : ‘{print $1″\t”$3}’ | grep -w $i | cut -f1 >> temp
done
cat temp | uniq >> user
for i in `cat user`
do
finger $i
done
6-2: kiem tra so nguyen to
#!/bin/bash
read -p “nhap so de kiem tra: ” a
i=2
while (( $i < $a ))
do
if (( $a%$i == 0 ));then
echo $a ko la so nguyen to
break
elif (( $a-1 == $i ));then
echo $a la so nguyen to
fi
let i+=1
done
#!/bin/bash
read -p “nhap so de kiem tra: ” a
i=2
while (( $i < $a ))
do
if (( $a%$i == 0 ));then
echo $a ko la so nguyen to
break
elif (( $a-1 == $i ));then
echo $a la so nguyen to
fi
let i+=1
done
7-1: dem file an 1 user tren he thong
#!/bin/bash
read -p “nhap user can tim: ” a
find / -user $a -type f | awk -F / ‘{print $NF}’ | grep ^’\.’ | wc –l
#!/bin/bash
read -p “nhap user can tim: ” a
find / -user $a -type f | awk -F / ‘{print $NF}’ | grep ^’\.’ | wc –l
==============================================================
Bài 1: Liệt kê tất cả các user thường có trong máy.
Phân tích: Các user được lưu trữ trong file /etc/passwd, user nào có userID từ 500 trở lên là user thường (từ bản fedora 16, user thường có userID từ 1000 trở lên). Như vậy, cần phải “trích” được hai yếu tố từ trong file /etc/passwd, đó là tên user và userID.
Phân tích: Các user được lưu trữ trong file /etc/passwd, user nào có userID từ 500 trở lên là user thường (từ bản fedora 16, user thường có userID từ 1000 trở lên). Như vậy, cần phải “trích” được hai yếu tố từ trong file /etc/passwd, đó là tên user và userID.
Để lấy được userID, có thể dùng câu lệnh sau: cat /etc/passwd | cut -d: -f3. Tương tự, để lấy được username, có thể dùng câu lệnh: cat /etc/passwd | cut -d: -f1. Tuy nhiên, khi trích xuất như vậy, username và userID còn rời rạc với nhau và không thể lấy được username tương ứng với userID nào. Do đó, cần sử dụng thêm biến LINE dùng để đếm dòng.
Cách lấy dữ liệu từ dòng thứ LINE bất kì: tail -n +$LINE | head -n 1. Ví dụ, với câu lệnh tail -n +5 | head -n 1, có thể lấy được chính xác dòng thứ 5.
Cách lấy dữ liệu từ dòng thứ LINE bất kì: tail -n +$LINE | head -n 1. Ví dụ, với câu lệnh tail -n +5 | head -n 1, có thể lấy được chính xác dòng thứ 5.
Từ những dữ kiện trên, sắp xếp thành 1 bài hoàn chỉnh:
_ Gán biến LINE=1 (dòng đầu tiên)
_ Cho biến UserID chạy trong cat /etc/passwd | cut -d: -f3
_ Nếu UserID lớn hơn hoặc bằng 500 (1000 đối với fedora 16), xuất username của dòng ấy ra: echo $(cat /etc/passwd | tail -n +$LINE | head -n 1 | cut -d: -f1)
_ Tăng LINE=LINE+1 để “nhảy” xuống dòng tiếp theo
_ Gán biến LINE=1 (dòng đầu tiên)
_ Cho biến UserID chạy trong cat /etc/passwd | cut -d: -f3
_ Nếu UserID lớn hơn hoặc bằng 500 (1000 đối với fedora 16), xuất username của dòng ấy ra: echo $(cat /etc/passwd | tail -n +$LINE | head -n 1 | cut -d: -f1)
_ Tăng LINE=LINE+1 để “nhảy” xuống dòng tiếp theo
Từ bài trên, có thể nâng cao thành 1 bài khác, tính dung lượng sử dụng của các user trong máy (sử dụng ls -laR / , với cột thứ 3 là user)
Bài 2: Liệt kê các partition đã sử dụng trên 90%
Phân tích: Sử dụng câu lệnh df -h để kiểm tra dung lượng ổ đĩa, nếu ổ nào đã đầy trên 90% thì xuất ra màn hình.
Phân tích: Sử dụng câu lệnh df -h để kiểm tra dung lượng ổ đĩa, nếu ổ nào đã đầy trên 90% thì xuất ra màn hình.
Tương tự câu trên, cũng cần 1 biến LINE để “giữ” dòng và xuất tên partition. Tuy nhiên, vấn đề là làm sao có thể lấy được field thứ 5 trong khi không thể dùng lệnh cut do delimiter không đồng nhất (mỗi cột được cách bằng nhiều bước trống) và so sánh được số phần trăm ở cột thứ 5 do số phần trăm được lưu dạng string. Để làm được việc này, sử dụng câu lệnh awk ‘{print $5}’, với $5 mang ý nghĩa là lấy cột thứ 5; về dấu phần trăm, có thể lợi dụng dấu % để trích ra số bằng lệnh cut -d% -f1.
Sắp xếp thành bài hoàn chỉnh:
_ Gán biến LINE=2 (do dòng đầu là label)
_ Cho biến PERCENTAGE chạy trong df -h | awk ‘{print $5} | cut -d% -f1′
_ Nếu PERCENTAGE lớn hơn 90 thì xuất ra tên partition df -h | tail -n +$LINE | head -n 1 | awk ‘{print $1}’
_ Tăng LINE=LINE+1
_ Gán biến LINE=2 (do dòng đầu là label)
_ Cho biến PERCENTAGE chạy trong df -h | awk ‘{print $5} | cut -d% -f1′
_ Nếu PERCENTAGE lớn hơn 90 thì xuất ra tên partition df -h | tail -n +$LINE | head -n 1 | awk ‘{print $1}’
_ Tăng LINE=LINE+1
Bài này có thể mở rộng ra là gửi thông báo các partition >90% cho admin. Có thể gửi mail bằng câu lệnh sau echo “nội dung mail” | mail -s “Subject của mail” tênuser@têndomain.đuôidomain
góp ý , trong trường hợp hệ thống mạng không có DNS thì có thể gửi mail theo kiểu [username]@[host IP address]
bài giải này …
câu 1:
1#!/bin/bash
2 a=`cat /etc/passwd | cut -d: -f3`
3 line=1
4 for i in $a
5 do
6 if (( $i >= 500 ));then
7 cat /etc/passwd | tail -n +$line | head -n 1
8 fi
9 line=$(( $line + 1 ))
10 done
2 a=`cat /etc/passwd | cut -d: -f3`
3 line=1
4 for i in $a
5 do
6 if (( $i >= 500 ));then
7 cat /etc/passwd | tail -n +$line | head -n 1
8 fi
9 line=$(( $line + 1 ))
10 done
câu 2:
1 #!/bin/bash
2 line=1
3 a=`df -h | awk ‘{print $5}’ | cut -d% -f1`
4 for i in $a
5 do
6 if (( $i > 10 ));then
7 df -h | tail -n +$line | head -n 1
8 fi
9 line=$(( $line + 1 ))
10 done
2 line=1
3 a=`df -h | awk ‘{print $5}’ | cut -d% -f1`
4 for i in $a
5 do
6 if (( $i > 10 ));then
7 df -h | tail -n +$line | head -n 1
8 fi
9 line=$(( $line + 1 ))
10 done
====================================================================
Yêu cầu: Máy Server1 có chứa shell và chạy những dòng lệnh trong shell ấy trên máy Client1 qua SSH
Bước 1: Tạo 1 cặp key rsa bằng câu lệnh ssh-keygen trên Server1.
root@server1# ssh-keygen
root@server1# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jsmith/.ssh/id_rsa):[Nhập đường dẫn để save key, enter để chọn default]
Enter passphrase (empty for no passphrase): [Nhập passpharse để sinh key, enter để chọn default]
Enter same passphrase again: [Xác nhận passphrase]
Your identification has been saved in /home/jsmith/.ssh/id_rsa.
Your public key has been saved in /home/jsmith/.ssh/id_rsa.pub.
Enter file in which to save the key (/home/jsmith/.ssh/id_rsa):[Nhập đường dẫn để save key, enter để chọn default]
Enter passphrase (empty for no passphrase): [Nhập passpharse để sinh key, enter để chọn default]
Enter same passphrase again: [Xác nhận passphrase]
Your identification has been saved in /home/jsmith/.ssh/id_rsa.
Your public key has been saved in /home/jsmith/.ssh/id_rsa.pub.
Bước 2: Copy public key sang Client1 (đóng vai trò remote-host).
root@server1# ssh-copy-id -i ~/.ssh/id_rsa.pub <địa chỉ IP hoặc tên máy Client1>
Và gõ password. Ghi chú: ~/.ssh/id_rsa.pub là đường dẫn mặc định, nếu đường dẫn ở bước 1 thay đổi thì bước 2 cũng phải tương ứng.
Sau bước 2, có thể login mà không cần password.
root@server1# ssh-copy-id -i ~/.ssh/id_rsa.pub <địa chỉ IP hoặc tên máy Client1>
Và gõ password. Ghi chú: ~/.ssh/id_rsa.pub là đường dẫn mặc định, nếu đường dẫn ở bước 1 thay đổi thì bước 2 cũng phải tương ứng.
Sau bước 2, có thể login mà không cần password.
Bước 3: Thực hiện lệnh qua SSH.
root@server1# ssh <địa chỉ IP hoặc tên máy Client1> <câu lệnh>
Tuy nhiên, câu lệnh trên chỉ nhận 1 lệnh. Để thực hiện nhiều lệnh trong shell, thực hiện như sau:
root@server1# root@server1# ssh <địa chỉ IP hoặc tên máy Client1> ‘<câu lệnh 1>;<câu lệnh 2>;…’ (có dấu nháy đơn)
Để xuống hàng, có thể dùng kí tự \ như sau:
root@server1# ssh <địa chỉ IP hoặc tên máy Client1> <câu lệnh>
Tuy nhiên, câu lệnh trên chỉ nhận 1 lệnh. Để thực hiện nhiều lệnh trong shell, thực hiện như sau:
root@server1# root@server1# ssh <địa chỉ IP hoặc tên máy Client1> ‘<câu lệnh 1>;<câu lệnh 2>;…’ (có dấu nháy đơn)
Để xuống hàng, có thể dùng kí tự \ như sau:
- ssh Client1 ‘cd ~/Desktop;\
- touch file1;\
- touch file2;\
- ls -la ~/Desktop >> ketqua’
Sao chép mã
Đoạn script trên sẽ tạo file1 và file2 trên Client1, sau đó liệt kê các file có trong Desktop và xuất kết quả ra file ketqua.
Bước 4: Lấy kết quả về server
Trong đoạn scripts trên, có thể thêm vào scp để chuyển kết quả về cho server hoặc remove cả file kết quả trên Client1:
Trong đoạn scripts trên, có thể thêm vào scp để chuyển kết quả về cho server hoặc remove cả file kết quả trên Client1:
- …
- …
- …
- scp ~/Desktop/ketqua root@server1:~/Desktop
- rm -rf ~/Desktop/ketqua
Sao chép mã
Có thể mở rộng script ra để dễ dàng quản lí các máy client và trả về kết quả cho server
Có thể mở rộng script ra để dễ dàng quản lí các máy client và trả về kết quả cho server
Có tham khảo từ: howtogeek.com
===============
XỬ LÝ DANH SÁCH SINH VIÊN
#!/bin/bash
while [ TRUE ]
do
echo -e “\n\n\n”
echo ‘[1]:In ra tat ca User’
echo ‘[2]:Tim kiem User’
echo ‘[3]:Them User’
echo ‘[4]:Xoa User’
echo ‘[0]:THOAT’
read -p “Nhap vao lua chon: ” option
echo ” “
clear
case $option in
1)
echo “—Danh sach Thong tin User—”
cat danhsach
;;
2)
echo “—Tim Kiem User—”
read -p “Nhap ten User can tim: ” ten
cat danhsach | awk ‘$1 ~ /’$ten’/ {print $0}’
;;
3)
echo “—Them User—”
read -p “Nhap so luong User can them vao: ” n
for i in `seq 1 $n`
do
echo “Nhap thong tin user thu $i: “
read -p “Nhap ten: ” ten
read -p “Nhap sdt: ” sdt
read -p “Nhap Email: ” email
echo “$ten $sdt $email” >> danhsach
done
;;
4)
echo “—Xoa User—”
read -p “Nhap ten User can xoa: ” ten
echo “Chuong trinh tim thay user $ten:”
cat danhsach | awk ‘$1 ~ /’$ten’/ {print $0}’
read -p “Chon So dien thoai cua User ma ban muon xoa: ” sdt
cat danhsach | grep -v $sdt > danhsach
;;
0)
exit
;;
esac
done
TÍNH TỔNG CÁC THAM SỐ
#!/bin/bash
for i in `seq 1 $#`
do
let tong+=$1
shift
done
echo $tong
LIỆT KÊ DANH SÁCH USER THƯỜNG CÓ TRONG MÁY
LINE=1
userid=$(cat /etc/passwd | cut -d: -f 3)
for i in $userid
do
if [ $i -ge 500 ] ;then
echo $(cat /etc/passwd | tail -n +$LINE | head -n 1 | cut -d: -f1)
fi
(( LINE = $LINE + 1 ))
done
LIỆT KÊ CÁC PHÂN VÙNG SỬ DỤNG TRÊN 90%
LINE=2
PERC=$( df -lTh | tail -n +2 | awk ‘{print $6}’ | cut -d% -f 1 )
for i in $PERC
do
if [ $i -ge 55 ] ;then
echo $(df -lTh | tail -n +$LINE | head -n 1 | awk ‘{print $1}’)
echo $(df -lTh | tail -n +$LINE | head -n 1 | awk ‘{print $1}’) | mail -s “Disk Full” root@localhost
fi
((LINE = $LINE + 1))
done
=======================================
#!/bin/bash
Ch=`uptime | awk ‘{print $10}’ | cut -d”.” -f2 | cut -d”,” -f1`
Ch1=`uptime | awk ‘{print $9}’ | cut -d”.” -f2 | cut -d”,” -f1`
if [ $Ch -gt 10 ] && [ $Ch1 -gt 10 ]
then
echo running
i=0
Ch2=$(( $Ch * 50 / 100 ))
Ch3=$(( $Ch1 * 50 / 100 ))
printf ‘load balance 5s [%3d%%]‘ “$Ch”
while [ $i -lt $Ch2 ]
do
echo -n “*”
i=$(( $i + 1 ))
done
echo
printf ‘load balance 1s [%3d%%]‘ “$Ch1″
k=0
while [ $k -lt $Ch3 ]
do
echo -n “*”
k=$(( $k + 1 ))
done
echo
fi
Ch=`uptime | awk ‘{print $10}’ | cut -d”.” -f2 | cut -d”,” -f1`
Ch1=`uptime | awk ‘{print $9}’ | cut -d”.” -f2 | cut -d”,” -f1`
if [ $Ch -gt 10 ] && [ $Ch1 -gt 10 ]
then
echo running
i=0
Ch2=$(( $Ch * 50 / 100 ))
Ch3=$(( $Ch1 * 50 / 100 ))
printf ‘load balance 5s [%3d%%]‘ “$Ch”
while [ $i -lt $Ch2 ]
do
echo -n “*”
i=$(( $i + 1 ))
done
echo
printf ‘load balance 1s [%3d%%]‘ “$Ch1″
k=0
while [ $k -lt $Ch3 ]
do
echo -n “*”
k=$(( $k + 1 ))
done
echo
fi
================================
Tuần 1:
1. Viết chương trình in ra màn hình chữ “Truong Dai Hoc Hoa Sen”
2. Viết chương trình in ra các tham số của người dùng khi chạy script
3. Tạo một hàm in ra màn hình số 1,2,3…..100
4. Tạo user1 với đầy đủ thông tin. Dùng lệnh finger để xác định lại thông tin của user1.
5. Dùng lệnh talk, write để thực hiện chat đơn giản
6. Dùng lệnh wall để gởi thông báo cho tất cả màn hình của user.
7. Dùng lệnh df để xác định các partition của hệ thống.
8. Dùng lệnh w để xác định ai đang login vào hệ thống
1>
echo “Truong Dai Hoc Hoa Sen”
2>
read -p “nhap tham so:” aa
echo “tham so nhap la:$aa”
3>
seq 1 100
4>
useradd test
finger test
7>
df
8>
w
Tuần 2:
1. Chứng tỏ standard error và standard output là khác nhau. (Hướng dẫn: viết 1 lệnh thực hiện sẽ báo lỗi, đẩy báo lỗi vào 1 file, output ra 1 file khác).
2. Chứng tỏ sự khác biệt giữa “>” và “>>”
3. Dùng lệnh tail/head để:
+ đọc 3 dòng đầu tiên từ trên xuống của 1 file.
+ đọc 3 dòng đầu tiên từ dưới lên của 1 file.
+ đọc 10 dòng đầu tiên từ trên xuống kể từ dòng thứ 3 của 1 file.
4. Tạo một file text tên các sinh viên, năm sinh, quê quán, chuyên ngành. Viết đoạn script in các sinh viên có tên bất kỳ, và đếm số sv có cùng tên.
5. Viết script sử dụng hàm. Script tạo ra một số bất kỳ (dùng biến $RANDOM) cho đến khi người dùng nhập vào “yes”.
1/
cp xxx.error ./test > file 2> error
cp xxx.error ./test > all 2>&1
3/
head -n 3 /etc/proftpd.conf #read 3 dong dau
tail -n 3 /etc/proftpd
tail -n +3 /etc/proftpd.conf #read file tru 3 dong dau
tail -n -3 /etc/proftpd.conf #read 3 dong tu duoi len
tail -n +3 /etc/proftpd.conf | head -n 10 #doc 10 dong bo 3 dong dau
4/
cat sinhvien | grep tung | wc -l
5/
#!/bin/bash
bb=”no”
while [ $bb != "yes" ]
do
echo $RANDOM
read bb
done
Tuần 3:
1. Tìm tất cả đường dẫn của shell hiện tại. Tạo một file script ở một đường dẫn bất kỳ. Thay đổi đường dẫn sao cho ta có thể thực thi script này dù đang ở bất kỳ đường dẫn nào. Làm sao để điều này không vẫn không thay đổi khi ta tạo 1 terminal mới.
2. Viết script xác định tất cả các file có thể thực thi được trong một thư mục và thực thi các file đó.
3. Thực hiện một command cần nhiều thời gian để thực hiện. Chuyển command đó xuống background, sau đó chuyển ngược lại lên foreground rồi lại chuyển xuống background. Xác định command đang được thực thi. Xóa bỏ command đang chạy đó.
4. Copy 1 file vào 1 thư mục. In dòng ” Không thể copy” nếu có lỗi và “Copy thanh công” nếu không có lỗi.
5. Viết script tính tổng các tham số.
6. Viết script sử dụng hàm tính tổng các tham số.
7. Viết script tính tổng từ 1 đến n với n nhập từ bàn phím
1/
tao file co quyen thuc thi o /root
PATH=”$PATH:/root”
vim ~/.bashrc
PATH=”$PATH:/root”
2/
find /root -type f -perm /u+x
3/
thuc hien command nhan Ctrl+Z để chuyen xuong background ( thuc thi lenh voi & vd: ./test& )
dung lenh bg de kiem tra
dung lenh fg de quay tro lai
4/
cp bb /tmp && echo “copy thanhcong” || echo “copy error”
5/
read -p “nhap tham so a:” a
read -p “nhap tham so b:” b
tong=`expr $a + $b`
echo $tong
6>
#!/bin/bash
tong()
{
to=0
for i in `seq 1 $#`
do
to=`expr $to + $1`
shift
done
echo $to
}
tong 1 2 3 4 5 6
7/
#!/bin/sh
read -p “Nhap so:” aa
tong=0
for i in `seq 1 $aa`
do
tong=`expr $tong + $i`
done
echo $tong
Tuần 4:
1. Gán biến Global_VAR=”My shell” tại shell. Viết script in ra giá trị này. Làm sao giá trị trong script và ngoài shell có giá trị như nhau ?
2. Viết một chương trình script cho phép tính tổng của 2 tham số. Nếu số tham số >2, báo lỗi. Viết usage (man) cho chương trình này trong cùng 1 shell. Tạo ra manual của file này từ usage ghi chú trong script. (Hướng dẫn: sử dụng pod2html)
3. Tính tổng các tham số của script. Kiểm tra chương trình vẫn chạy đúng khi số tham số >=10.
4. Viết script in ra tất cả file có thể thực thi được trong 1 thư mục. Tạo file rỗng thực thi được với tên “My executable file” (có khoảng trắng) trong cùng thư mục. Chứng tỏ, chương trình có in ra tên file này.
5. Cho người dùng nhập giá trị array từ 1 đến n phần tử (n nhập từ bàn phím), sau đó tính tổng của array này.
6. Viết chương trình in ra dung lượng của một thư mục. (Hướng dẫn: Sử dụng “du” và “cut”).
1>
export Global_var=”my shell” để cho gia tri trong va ngoai shell, go lenh trong terminal
2>
if [ $# -gt 2 ]; then
echo ” Ban nhap > 2 tham so!”
else
tong=`expr $1 + $2`
echo “tong: $tong”
fi
3>
to=0
for i in `seq 1 $#`
do
to=`expr $to + $1`
shift
done
echo $to
4>
read -p “nhap thu muc:” dir_var
if [ -d $dir_var ]
then
find $dir_var -type f -a -perm +111
else
echo “$dir_var exit”
fi
6>
read -p “nhap thu muc:” dir_var
if [ -d $dir_var ]
then
echo “dung luong cua $dir_var:”
du -a $dir_var | grep $dir_var$ | cut -f1
else
echo “$dir_var exit”
fi
Tuần 5:
1. Tính tổng số file có thể thực thi trong một thư mục với tên thư mục nhập vào từ người dùng.
2. Viết script cần có 3 tham số. Nếu người dùng nhập ít hơn thì thông báo là ít hơn, nếu nhiều hơn thì thông báo là nhiều hơn. Nếu đúng thì in ra tổng của 3 tham số đó.
3. Tính tổng kích thước các file trong 1 thư mục. Sử dụng (cut với ls) hoặc stat
4. Viết chương trình làm máy tính bỏ túi. Người dùng viết biểu thức, máy tính sẽ tính kết quả cho đến khi người dùng enter mà không nhập vào giá trị nào.
1>
read -p “nhap thu muc:” dir_var
if [ -d $dir_var ]
then
echo “so file thu thi $dir_var:”
find $dir_var -type f -a -perm +111 | wc -l
else
echo “$dir_var exit”
fi
2>
if [ $# -eq 3 ]
then
echo “cac tham so nhap” `expr $1 + $2 + $3` #$* hieu la cu 1 khoang trang la 1 gia tri
elif [ $# -gt 3 ]
then
echo “ban da nhap nhiu hon 3 tham so”
else
echo ” ban da nhap it hon 3″
fi
3>
read dd
stat –format %s $dir
bài 6 (tuần 4)
4>
bieuth=” “
while [ 1 ]
do
read -p “nhap bieu thuc:” bieuth
if [ -z "$bieuth" ];then
echo “thoat chuong trinh!”
exit 0;
else
echo “ketqua”
echo $bieuth | bc
fi
done
Tuần 6:
1. Tìm số sinh viên có tên bắt đầu bằng “Ng” và kết thúc bằng “t”.
2. Tìm số sinh viên có số điện thoại có 10 số, số bắt đầu là 0122
3. Kiểm tra số điện thoại của user nhập vào có đúng theo quy ước 38-1234567
4. Thống kê số file và tổng kích thước các file đó của từng user trong thư mục
5. Đếm số kết nối đang kết nối đến port 80 của server (máy hiện tại hoặc server mà ta đang kết nối).
6. Đếm số máy đang kết nối đến port 25 của server, sắp xếp địa chỉ các máy theo thứ tự
1>
cut -f2 sinhvien | grep ^ng | grep t$ | wc -l
2>
cach 1:
dem=0
for i in `cat sinhvien | awk ‘{print $4}’ | grep ^0122`
do
echo “$i”
a=`echo $i | wc -m`
if [ $a -eq 11 ]
then
dem=`expr $dem + 1`
fi
done
echo $dem
cach 2:
tao file: aa.awk
{for(i=NF;i>0;i–){
a=length($i)
if(a==10){
printf $i “\n”
}
}}
vào terminal gõ:
cat sinhvien | awk ‘{print $4}’ | grep ^0122 | awk -f aa.awk
3>
grep ‘[0-9]‘\{2\}-\{0,1\}[0-9]\{7\} < sinhvien
4>
tao file ab.awk
{ for(i=NF;i>0;i–) {
user[$3]++
sum[$3]+=$5
}
}
END {
for (i in user)
{
printf “%s co %d files va co dung luong %d \n”,i,user[i],sum[i]}
}
dùng terminal gõ lênh ( viet script cung dc)
ls -lR /dir | awk -f ab.awk
5>
netstat -ntp | awk ‘{print $4}’ | grep :80$ | wc -l
6>
netstat -ntp | awk ‘{print $5 “\tab” $4}’ | grep :22$ | cut -f1 | sort -n
Tuần 7
1. Tạo một ứng dụng shell như sau: ứng dụng gồm một fie dữ liệu với cấu trúc
Name [ John Smith ]
Phone [ 12345 ] 54321
Email [ joe@smith.org.uk ]
Tạo ứng dụng cho phép các công việc sau:
+ Tìm kiếm và in ra thông tất cả user có thông tin như được nhập vào
+ Thêm một user vào file dữ liệu. Nếu user có trùng tên thì thông báo và không cho nhập vào
+ Xóa một user trong file dữ liệu
2. Cùng với bài 1 nhưng thêm các thuộc tính sau
+ Cho phép cancel option với Ctrl+C, Ctrl+D
+ Thêm option Confirm
3. Viết chương trình in ra: Chao buoi sang, Chao buoi chieu, Chao buoi toi tùy theo thời gian hiện tại. Cho phép file này thực thi mỗi khi user login bằng cách thực thi trong file .bash_profile
1>
tao file dulieu (hoten:phone:email)
Vu Dinh Tung:1234567:tuyquyen81@gmail.com
#!/bin/sh
search()
{
error=’error’
while read LINE
do
echo $LINE | cut -d: -f1 | grep -i $1$ >> /dev/null && echo $LINE | awk -F: ‘{print “Name:”$1″\nPhone:”$2″\nEmail:”$3″\n”}’ && error=” “
done < dulieu
echo $error
}
add_user()
{ #trap cleanup 2
read -p ‘Nhap Name:’ Name
read -p ‘Nhap Phone:’ Phone
read -p ‘Nhap Email:’ Email
varn=`cat dulieu | grep -i “$Name”`
if [ -z "$varn" ]
then
echo “$Name:$Phone:$Email” >> dulieu && echo “Successfull” || echo “Error”
else
echo “user đa use”
fi
}
del_user()
{
read -p ‘Nhap Name:’ Name
varn=`cat dulieu | grep -i “$Name”`
if [ -z "$varn" ]
then
echo “ko co user”
else
read -p “co del (y/n)” a
if [ $a=='y' -o $a=='Y' ]
then
sed -e “s/$Name/$Name/i” -e “/$Name/d” dulieu > dulieub
fi
fi
}
trap “” 1 2 3 15 17 18 19 20
funclist=”search add_user del_user Exit”
select func in $funclist
do
case $REPLY in
“1″)
echo “1 – Chuc nang tim thong tin.”
read -p “Nhap Name:” a1 #<< ctrl-d
$func $a1
;;
“2″)
echo “2 – Chuc nang add User.”
$func
;;
“3″)
echo “3 – Chuc nang xoa thong tin.”
$func
;;
“4″)
exit 0
;;
esac
done
3>
#!/bin/sh
a=`date +%H`
test $a -ge 05 -a $a -le 09 && echo “chao buoi sang” || \
test $a -ge 10 -a $a -le 14 && echo “chao buoi trua” && \
test $a -ge 15 -a $a -le 18 && echo “chao buoi chieu” && \
test $a -ge 19 -a $a -le 23 && echo “chao buoi toi” || echo “chao buoi khuya”
Tuần 8:
1. Viết chương trình tính số người đăng login vào hệ thống. Sử dụng crontab để thống kê số người dùng và vẽ biểu đồ ra theo ngày.
2. Ghi lại dung lượng sử dụng dĩa cứng theo giờ. Vẽ biểu đồ trong tháng và dự đoán mức sử dụng trong các tháng tới.
3. Ghi lại biểu đồ login của một user. Gởi email thông báo cho admin khi có user login vào hệ thống tại các thời gian từ 0:00am đến 1:00am.
4. Viết chương trình tính tổng %CPU, memory, đang được sử dụng
5. Dùng crontab kiểm tra %CPU, memory 5′ một lần. Nếu %CPU, memory > 60% thì gởi email báo cho root.
1>
ab.awk
function max(arr,big)
{
big=0
for (i in number)
{
if(number[i]>big){big=number[i]}
}
return big
}
NF>7{
number[$4$5]++
}
END {
maxm=max(number);
for(i in number)
{
scaled=60*number[i]/maxm
printf “%s::%d\t:”,i,number[i]
for(i=0;i<scaled;i++)
{
printf “#”
}
printf “\n”
}
}
######go lenh
last -a | egrep -v reboot | grep -v down | head -n -2 | awk -f ab.awk
2>
#!/bin/sh
day=` date +%d`
month=`date +%m`
hour=`date +%H`
#echo $day $month $hour
#df -m `cat listdev` | tail -n +2 > dev.$month
df -m `cat /root/shell/listdev` | tail -n +2 | while read LINE
do
echo -e “$day\t$hour\t$LINE” >> /root/shell/log/dev.$month
done
00 * * * * /root/shell/t8022
#
3>
cd.awk
function max(arr,big)
{
big=0
for (i in number)
{
if(number[i]>big){big=number[i]}
}
return big
}
NF>7{
a=print $4″:”$5
number[$4":"$5]++
}
END {
maxm=max(number);
for(i in number)
{
scaled=60*number[i]/maxm
printf “%s\t(%d)\t:”,i,number[i]
for(i=0;i<scaled;i++)
{
printf “#”
}
printf “\n”
}
}
file chay
#!/bin/sh
for i in `cat /root/shell/listuser`
do
last -a $i | head -n -2 > /root/log/$i.log
done
for i in `cat /root/shell/listuser`
do
echo -e “\t###################bieu do login cua: $i###########################”
echo -e “\t\t$i”
cat /root/log/$i.log | awk -f /root/shell/cd.awk | sort -k 1.1Mr -k 2.2nr
echo -e “\n\n\n”
cat /root/log/$i.log | awk ‘{print $6}’ | grep ^0[0-1] > /dev/null && echo “user:$i login (0:00AM – 1:00AM” | mail -s “$i login” root
done
4,5>
#!/bin/sh
ps -eo pid,pcpu,comm,pmem | tail -n +2 | awk ‘{print $2″\t”$4}’ | awk -f bc.awk > file
test `cat file | awk ‘{print $1}’` -gt 60 -o `cat file | awk ‘{print $2}’` -gt 60 && echo “%cpu or %mem tren 60%” | mail -s cpu root
bc.awk
NF>7
{
ps+=$1
mem+=$2
}
END{
printf “%d\t%d”,ps,mem
}
Tuần 14
1>
su dung uptime de tinh toan tai cua he thong. ve bieu do tai cua he thong theo thoi gian moi 5 phut. neu tai hon 50% thi gui email thong bao
2>
su dung iostat de ve bieu do tai cua ung dung cua user, tai cua he thong theo thoi gian
3>
su dung vmstat de tim thoi gian may tinh dung it thoi gian nhat trong ngay
1>
#!/bin/sh
a=$(echo “/tmp/`date +%d`.log”)
load=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//g’`
echo “`date +%H:%M` $cpu” >> $a
if [ `echo “$load >= 50” | bc` -eq 1 ]
then
echo “load average vuot qua 50%” | mail -s ‘load average’ root
fi
tạo crontab cho file trên
file a.awk
function max(arr,big)
{
big=0
for (i in number)
{
if(number[i]>big){big=number[i]}
}
return big
}
{
number[$1]=$2
}
END {
maxm=max(number);
for(i in number)
{
scaled=60*number[i]/maxm
printf “%s::%.2f\t:”,i,number[i]
for(i=0;i<scaled;i++)
{
printf “#”
}
printf “\n”
}
}
cat /tmp/15.log | awk -f a.awk | sort -n -k2 # dùng đê vẽ biểu đồ
Tuần
1>
su dung ftp de backup cac file trong 1 thu muc sang mot may khac
2>
tuong tu nhu ftp, ssh co the duoc dung de thuc thi lenh tren mot may khac. ket hop ftp & ssh thuc hien cong viec backup du lieu tu mot may sang may khac, luu y , chi copy cac file moi hoac chua ton tai ma thoi
1>
#!/bin/sh
ftp -nv 172.16.2.100 << END_FTP
user test01 123456
lcd /tmp/backup
cd /backup
prompt
mget *.*
END_FTP
cp -u /tmp/backup/* /backup
2>
trên client gõ
ssh-keygen -t rsa
cp file id_rsa.pub vào thư mục ~/.ssh/
cat ~/.ssh/id_rsa.pub | ssh root@ipserver “cat >>~/.ssh/authorized_keys
vao máy sửa file sshd_config trên server
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
lệnh để backup: từ client thực thi lệnh để backup thư mục #option -u chỉ backup nhưng file thay đổi
rsync -ruv root@172.16.2.100:/var/www/html/web01 /backup
3 bài KT
Câu 1:Sua khi nghỉ ở công ty,ta cần xóa tất cả thông tin,file,thư mục của 1 user.Viết script xóa tất cả 1 user trong máy
Câu 2: Vẽ CPU load của máy trong mỗi 5s. Xác định thời gian mà CPU chịu tải nhiều nhất
câu 3: chơi oẳn tù xì 3 lần
1>
#!/bin/sh
read -p “nhap user:” username
find / -user $username -exec rm -rf ‘{}’ \;
userdel -f $username
2>
giống bài
su dung uptime de tinh toan tai cua he thong. ve bieu do tai cua he thong theo thoi gian moi 5 phut. neu tai hon 50% thi gui email thong bao
xác định tải cao nhất
cat /tmp/15.log | sort -nr -k2
3>
#!/bin/sh
dem1=0
dem2=0
aaa[1]=’keo’;aaa[2]=’bua’;aaa[3]=’bao’
for i in 1 2 3
do
var1=`echo “($RANDOM%10-1)/3+1″ | bc`
var2=`echo “($RANDOM%10-1)/3+1″ | bc`
echo “${aaa[$var1]} ${aaa[$var2]}”
var=`expr $var2 – $var1`
if [ $var -eq 1 -o $var -eq -2 ]
then
echo “thua thang”
dem2=`expr $dem2 + 1`
elif [ $var -eq -1 -o $var -eq 2 ]
then
echo “Thang thua”
dem1=`expr $dem1 + 1`
else
echo “Hoa”
fi
echo “$dem1 $dem2″
done
if [ $dem1 -eq $dem2 ]
then
echo “N1 Hoa N2″
elif [ $dem1 -gt $dem2 ]
then
echo “N1 Thang N2″
else
echo “N2 thang N1″
fi
==========================================
# Script to print currently logged in users information, and current date & time. clear echo "Hello $USER" echo -e "Today is \c ";date echo -e "Number of user login : \c" ; who | wc -l echo "Calendar" cal exit 0
Bài 2 :
Viêt́ chương triǹ h shell liêṭ kê cać tâp̣ tin trong thư muc̣ nhâp̣ vaò tư ̀ baǹ phím ma ̀ co ́ kić h thước > 4KB theo dạng sau :
Tổng số tâp̣ tin
Tập tin 1 kích thước
…..
tập in n kích thước
Viêt́ chương triǹ h shell liêṭ kê cać tâp̣ tin trong thư muc̣ nhâp̣ vaò tư ̀ baǹ phím ma ̀ co ́ kić h thước > 4KB theo dạng sau :
Tổng số tâp̣ tin
Tập tin 1 kích thước
…..
tập in n kích thước
#!/bin/bash
SIZE=4096 # hằng số
echo -n “thu muc : “
read directory
index=0
for file in $( find $directory -type f)
do
filesize=$(ls -l $file | awk ‘{print $5}’) # trươǹ g thư ́ 5 cuả kêt́ qua
SIZE=4096 # hằng số
echo -n “thu muc : “
read directory
index=0
for file in $( find $directory -type f)
do
filesize=$(ls -l $file | awk ‘{print $5}’) # trươǹ g thư ́ 5 cuả kêt́ qua
̉ lêṇ h ls –l la ̀ kić h
if [ $filesize -gt $SIZE ] # thước file
then
_filename[$index]=$file # gán man̉ g file name
_filesize[$index]=$filesize # gán man̉ g file size
let “index +=1″
fi
done
echo “Tong so tap tin : $index”
for ((i=0 ; i<index; i++))
do
echo -e “`basename ${_filename[i]}`\t\t kich thuoc: ${_filesize[i]}”
done
exit 0
if [ $filesize -gt $SIZE ] # thước file
then
_filename[$index]=$file # gán man̉ g file name
_filesize[$index]=$filesize # gán man̉ g file size
let “index +=1″
fi
done
echo “Tong so tap tin : $index”
for ((i=0 ; i<index; i++))
do
echo -e “`basename ${_filename[i]}`\t\t kich thuoc: ${_filesize[i]}”
done
exit 0
Bài 3 :
Viêt́ chương triǹ h shell đoc̣ môṭ danh saćh cać user từ tập tin users rồi kiểm tra xem các user này có thuộc group W3 hay không? Nêú co ́ user naò thuôc̣ group thi ̀ xoá user đo ́ ra khoỉ group W3 ngươc̣ lại thi ̀ thêm user đo ́ vaò group.
Viêt́ chương triǹ h shell đoc̣ môṭ danh saćh cać user từ tập tin users rồi kiểm tra xem các user này có thuộc group W3 hay không? Nêú co ́ user naò thuôc̣ group thi ̀ xoá user đo ́ ra khoỉ group W3 ngươc̣ lại thi ̀ thêm user đo ́ vaò group.
#!/bin/bash
FGROUP=/etc/group
GROUPNAME=W3
UFILE=users
if [ ! -e $UFILE ]; then
echo “File users does not exist”
exit 1
fi
all_users=( $(cat $FGROUP | grep -w $GROUPNAME | cut -d: -f4 | tr , ” “)
)
# all_users=( $(cat $FGROUP | awk –F: ‘/$GROUPNAME/ {print $4}’ | tr , “
“) )
num_usr_grp=${#all_users[@]}
add_remove_users(){
local co=0
for (( i=0; i< num_usr_grp; i++ ))
do
if [ "$1" == "${all_users[i]}” ]
then
co=1;break
fi
done
if [ $co -eq 1 ]; then
gpasswd -d $1 $GROUPNAME
else
gpasswd -a $1 $GROUPNAME
fi
}
while read usr
do
add_remove_users $usr
done <$UFILE
FGROUP=/etc/group
GROUPNAME=W3
UFILE=users
if [ ! -e $UFILE ]; then
echo “File users does not exist”
exit 1
fi
all_users=( $(cat $FGROUP | grep -w $GROUPNAME | cut -d: -f4 | tr , ” “)
)
# all_users=( $(cat $FGROUP | awk –F: ‘/$GROUPNAME/ {print $4}’ | tr , “
“) )
num_usr_grp=${#all_users[@]}
add_remove_users(){
local co=0
for (( i=0; i< num_usr_grp; i++ ))
do
if [ "$1" == "${all_users[i]}” ]
then
co=1;break
fi
done
if [ $co -eq 1 ]; then
gpasswd -d $1 $GROUPNAME
else
gpasswd -a $1 $GROUPNAME
fi
}
while read usr
do
add_remove_users $usr
done <$UFILE
exit 0
Bài 4
Viêt́ chương triǹ h đôỉ 1 sô ́ tư ̀ hê ̣ thâp̣ phân 10 ( Dec ) sang hê ̣ 2 (Bin), 8 (Oct) , 16 (Hex).
Vi ́ du ̣ : convert –b 16 –n 500 co ́ nghiã la ̀ đôỉ sô ́ 500 sang cơ sô ́ 16.
Chú ý : đoaṇ code dươí đây cuñ g duǹ g đê ̉minh hoạ lêṇ h “shift “ . Baṇ co ́ thê ̉ go ̃ tham sô ́ cuả chương trình theo 2 cách :
./convert –b radix –n number hoăc̣ ./conver –n number –b radix
Viêt́ chương triǹ h đôỉ 1 sô ́ tư ̀ hê ̣ thâp̣ phân 10 ( Dec ) sang hê ̣ 2 (Bin), 8 (Oct) , 16 (Hex).
Vi ́ du ̣ : convert –b 16 –n 500 co ́ nghiã la ̀ đôỉ sô ́ 500 sang cơ sô ́ 16.
Chú ý : đoaṇ code dươí đây cuñ g duǹ g đê ̉minh hoạ lêṇ h “shift “ . Baṇ co ́ thê ̉ go ̃ tham sô ́ cuả chương trình theo 2 cách :
./convert –b radix –n number hoăc̣ ./conver –n number –b radix
#!/bin/bash
if [ $# -ne 4 ]; then
echo “Usage : $0 -b radix -n number or $0 -n number -b radix”
exit 1
fi
while [ "$1" ]
do
if [ "$1" = "-b" ];then
ob=”$2″
case $ob in
16 ) basesystem=”Hex”;;
8 ) basesystem=”Oct”;;
2 ) basesystem=”Bin”;;
* ) basesystem=”Unknown”;;
esac
shift 2
elif [ "$1" = "-n" ]
then
num=”$2″
shift 2
else
echo “Program $0 does not recognize option $1″
exit 1
fi
done
op=$(echo “obase=$ob;ibase=10;$num;” | bc)
echo “$num Decimal number = $op in $basesystem number system (base=$ob)
“
exit 0
if [ $# -ne 4 ]; then
echo “Usage : $0 -b radix -n number or $0 -n number -b radix”
exit 1
fi
while [ "$1" ]
do
if [ "$1" = "-b" ];then
ob=”$2″
case $ob in
16 ) basesystem=”Hex”;;
8 ) basesystem=”Oct”;;
2 ) basesystem=”Bin”;;
* ) basesystem=”Unknown”;;
esac
shift 2
elif [ "$1" = "-n" ]
then
num=”$2″
shift 2
else
echo “Program $0 does not recognize option $1″
exit 1
fi
done
op=$(echo “obase=$ob;ibase=10;$num;” | bc)
echo “$num Decimal number = $op in $basesystem number system (base=$ob)
“
exit 0
Ơ đoan code trên thi quan trong nhât la dong “op=$(echo “obase=$ob;ibase=10;$num;” ̉ ̣ ̀ ̣ ́ ̀ ̀ | bc)”. Lệnh này dùng để chuyển cơ số.
Bài 2: Viết chương trình Shell cho phép xóa tất cả các file có phần mở rộng là .sh trong thư mục: /etc/baitap.
[root@linux root]# cat xoafile.sh
Cd /etc/baitap
For bien in $(ls *.sh)
do
rm $bien
done
exit 0
[root@linux root]# cat xoafile.sh
Cd /etc/baitap
For bien in $(ls *.sh)
do
rm $bien
done
exit 0
Bài 3: Viết chương trình Shell cho phép copy tất cả những file có phần mở rộng là .sh. (Chú ý: Thu mục nguồn và thư mục đích được nhập từ bàn phím).
Echo “Nhap thu muc nguon”;
Read nguon
Echo “Nhap thu muc dich”
Read dich
Cd $nguon
For bien in $(ls *.sh)
Do
Cp $bien $dich
Done
Exit 0
Bài 4: Viết 1 chương trình Shell cho phép tính tổng các số từ 1 cho đến N. Với N nhập từ bàn phím.
Echo “Nhap N:”
Read N
Tong = 0
Bien =1
While [$bien –le $N]
Do
Tong = $Tong + $bien
Bien = $bien + 1;
Done
Echo “Tong cua cac so tu 1 den $N la $Tong”;
Exit 0
Echo “Nhap thu muc nguon”;
Read nguon
Echo “Nhap thu muc dich”
Read dich
Cd $nguon
For bien in $(ls *.sh)
Do
Cp $bien $dich
Done
Exit 0
Bài 4: Viết 1 chương trình Shell cho phép tính tổng các số từ 1 cho đến N. Với N nhập từ bàn phím.
Echo “Nhap N:”
Read N
Tong = 0
Bien =1
While [$bien –le $N]
Do
Tong = $Tong + $bien
Bien = $bien + 1;
Done
Echo “Tong cua cac so tu 1 den $N la $Tong”;
Exit 0
Bài 5: Viết 1 chương trình Shell cho phép tính giai thừa của một số N. Với N được truyền từ đối dòng lệnh.
Echo “Nhap N:”
Read N
Giaithua = 1
Bien =1
While [$bien –le $N]
Do
Tong = $Tong * $bien
Bien = $bien + 1;
Done
Echo “giai thua cua $N la $giaithua”;
Exit 0
Echo “Nhap N:”
Read N
Giaithua = 1
Bien =1
While [$bien –le $N]
Do
Tong = $Tong * $bien
Bien = $bien + 1;
Done
Echo “giai thua cua $N la $giaithua”;
Exit 0
Tạo User hàng loạt, bài này sưu tầm và viết lại cho ngắn gọn
Code:
#!/bin/sh
# tao nhieu user
echo -n “Nhap vao so user : “
read N
groupadd “thuchanh” # Tao 1 gorup
for ((i=0;i<N;i++))
do
user=”sinhvien0$i”
home=”/home/sinhvien0$i”
useradd -m -p “123456″ -g thuchanh -d $home $user
chown -R $user $home
done
exit 0
Một Số bài tập Lập trình shell
a) Làm việc với Text
Bài 1: Viết 1 chương trình Shell đọc từng dòng trong 1 file văn bản. Giữa mỗi lần hiển thị dòng
text thì có 1 câu hỏi từ Shell: “bạn có muốn đọc dòng kế tiếp ko ? y/n” nếu trả lời là “y” hoặc
“Y” thì in dòng kế tiếp, trong trường hợp ngược lại thì kết thúc chương trình đọc.
Bài 1: Viết 1 chương trình Shell đọc từng dòng trong 1 file văn bản. Giữa mỗi lần hiển thị dòng
text thì có 1 câu hỏi từ Shell: “bạn có muốn đọc dòng kế tiếp ko ? y/n” nếu trả lời là “y” hoặc
“Y” thì in dòng kế tiếp, trong trường hợp ngược lại thì kết thúc chương trình đọc.
Mã:
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
answer=””
count=0
numlines=`wc –l $filename|sed ‘s/^ *//’|cut –d “ “ –f 1`
echo “ so dong: $numlines”
while [ “$answer”!=”n”]
do
echo –e “tiep tuc(y/n)?”
read answer
if [ “answer” = “y” ]; then
echo “doc het file rui”
exit 0
fi
count=$(($count+1))
sed –n ${count}p $filename
done
exit 0
Bài 2: Viết 1 dòng lệnh cho phép đọc 3 dòng đầu tiên trong 1 file văn bản mà không được dùng
bất cứ vòng lặp nào
Mã:
bất cứ vòng lặp nào
Mã:
sed –n 1,3p $filename
Bài 3: Viết 1 chương trình trong Shell sao cho với tham số thứ nhất là tên file text và nó sẽ in ra
màn hình nội dung file này, nhưng với tất cả ký tự đều viết hoa
Mã:
màn hình nội dung file này, nhưng với tất cả ký tự đều viết hoa
Mã:
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
echo “file sau khi chuyen doi:”
tr ‘[a-z]’ ‘[A-Z]’ <$filename
exit 0
Bài 4: Viết 1 chương trình Shell chỉnh sửa văn bản sao cho nếu trên 1 dòng mà có nhiều hơn 2
khoảng trắng liền nhau thì được thay thế bằng 1 khoảng trắng
khoảng trắng liền nhau thì được thay thế bằng 1 khoảng trắng
Mã:
tr –s ‘ ‘ ‘ ‘ <$filename >$filename
———- Post added at 08:50 PM ———- Previous post was at 08:47 PM ———-
b)Làm việc với các tham số
Bài 1: Viết chương trình Shell liệt kê các tham số truyền vào chương trình theo từng dòng với cú
pháp: “day la tham so thu N va co ten la NNNN” bằng các cách sau:
• Dùng vòng lặp FOR.
• Dùng vòng WHILE và lệnh SHIFT
• Dùng vòng WHILE và không dùng lệnh SHIFT.
Mã:
pháp: “day la tham so thu N va co ten la NNNN” bằng các cách sau:
• Dùng vòng lặp FOR.
• Dùng vòng WHILE và lệnh SHIFT
• Dùng vòng WHILE và không dùng lệnh SHIFT.
Mã:
#!/bin/sh
#while + SHIFT:
count=0
while [ “$#” –ne 0 ]
do
echo “day la tham so thu $count: $1”
count=$(($count + 1))
shift
done
#WHILE without SHIFT:
count=1
total=$(($#+1))
while [ “$*” –ge 0 ]
do
echo –n “day la tham so thu $count: ”
eval echo \$$count
count=$(($count+1))
done
#for:
count=1
for arg in “$*”
do
echo “day la tham so thu $count: $arg”
count=$(($count + 1))
done
Bài 2: Viết chương trình Shell phân tích các tham số và các đối số truyền vào tương ứng với
tham số đó. Giả sử chương trình myshell có thể nhận 4 tham số là a,b,c,d nhưng chỉ có tham số c
là có đối số truyền vào. Khi gõ câu lệnh trong Shell: myshell –abc argument –d other_argument
thì với tham số c ta có đối số là argument, ngoài ra chương trình còn 1 đối số là other_argument.
tham số đó. Giả sử chương trình myshell có thể nhận 4 tham số là a,b,c,d nhưng chỉ có tham số c
là có đối số truyền vào. Khi gõ câu lệnh trong Shell: myshell –abc argument –d other_argument
thì với tham số c ta có đối số là argument, ngoài ra chương trình còn 1 đối số là other_argument.
Mã:
while getopts abc:d option
do
case “$option”
in
a) echo “co tham so a”;;
b) echo “co tham so b”;;
c) echo “co tham so c, doi so la $OPTARG”;;
d) echo “co tham so d”;;
\?)echo “ tham so nay khong hop le”
esac
done
while [ “$OPTIND” –le “$#” ]
do
echo –n “tham so tu do: “
eval echo \$$OPTIND
shift
done
a) Làm việc với Text
Bài 1: Viết 1 chương trình Shell đọc từng dòng trong 1 file văn bản. Giữa mỗi lần hiển thị dòng
text thì có 1 câu hỏi từ Shell: “bạn có muốn đọc dòng kế tiếp ko ? y/n” nếu trả lời là “y” hoặc
“Y” thì in dòng kế tiếp, trong trường hợp ngược lại thì kết thúc chương trình đọc.
Bài 1: Viết 1 chương trình Shell đọc từng dòng trong 1 file văn bản. Giữa mỗi lần hiển thị dòng
text thì có 1 câu hỏi từ Shell: “bạn có muốn đọc dòng kế tiếp ko ? y/n” nếu trả lời là “y” hoặc
“Y” thì in dòng kế tiếp, trong trường hợp ngược lại thì kết thúc chương trình đọc.
Code:
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
answer=””
count=0
numlines=`wc –l $filename|sed ‘s/^ *//’|cut –d “ “ –f 1`
count=0
numlines=`wc –l $filename|sed ‘s/^ *//’|cut –d “ “ –f 1`
echo “ so dong: $numlines”
while [ “$answer”!=”n”]
do
echo –e “tiep tuc(y/n)?”
read answer
if [ “answer” = “y” ]; then
echo “doc het file rui”
exit 0
fi
count=$(($count+1))
sed –n ${count}p $filename
done
exit 0
Bài 2: Viết 1 dòng lệnh cho phép đọc 3 dòng đầu tiên trong 1 file văn bản mà không được dùng
bất cứ vòng lặp nào
while [ “$answer”!=”n”]
do
echo –e “tiep tuc(y/n)?”
read answer
if [ “answer” = “y” ]; then
echo “doc het file rui”
exit 0
fi
count=$(($count+1))
sed –n ${count}p $filename
done
exit 0
Bài 2: Viết 1 dòng lệnh cho phép đọc 3 dòng đầu tiên trong 1 file văn bản mà không được dùng
bất cứ vòng lặp nào
Code:
sed –n 1,3p $filename
Bài 3: Viết 1 chương trình trong Shell sao cho với tham số thứ nhất là tên file text và nó sẽ in ra
màn hình nội dung file này, nhưng với tất cả ký tự đều viết hoa
sed –n 1,3p $filename
Bài 3: Viết 1 chương trình trong Shell sao cho với tham số thứ nhất là tên file text và nó sẽ in ra
màn hình nội dung file này, nhưng với tất cả ký tự đều viết hoa
Code:
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
#!/bin/sh
echo – e “ nhap ten file:”
read filename
if [ ! –f “$filename” ]; then
echo “ $filename not exists”
exit 1
fi
echo “file sau khi chuyen doi:”
tr ‘[a-z]’ ‘[A-Z]’ <$filename
exit 0
tr ‘[a-z]’ ‘[A-Z]’ <$filename
exit 0