banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Chia xẻ 1 bài tập Linux tổng quát !  XML
  [Programming]   Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 07:13:06 (+0700) | #1 | 101985
quanghuy12
Member

[Minus]    0    [Plus]
Joined: 20/11/2007 17:07:16
Messages: 12
Offline
[Profile] [PM]
Tạo 1 shellcript tên của bạn(viết hoa, có khoảng trắng vd : TRAN A) làm tất cả các việc sau :
1> Vào thư mục nhà của mình, tạo một thư mục có tên là họ tên của mình (viết thường vd : nguyenb). Thư mục cho người chủ thư mục có đủ quyền hạn, người trong nhóm và người dùng khác chỉ có quyền đọc.
2> Vào thư mục mới tạo ở phần 1 tạo 1 thư mục có tên của người đang sử dụng (tên này xuất phát từ stdout của lệnh hostname) ghép với tên người đang chạy chương trình (stdout của lệng whoami ), tên thư mục có 1 khoảng trắng ở giữa , vd : “may3 t8” . ). Thư mục cho người chủ thư mục có quyền đọc ghi, người trong nhóm và người dùng khác chỉ có quyền đọc.
3> Vào thư mục vừa tạo ở phần 2 tạo một tập tin có tên là tên họ đầy đủ của chính mình ghép với tên của máy đang chạy chương trình (stdout của lệnh hostname) dùng các chữ hoa [uppercase] và ko có khoảng trắng trong tên (vd : tên nguyen van a, đang chạy trên máy : may3 -> NGUYENVANAMAY3). Tập tin này chứa các thông tin trong /ect/paswd về chính user chạy chương trình này.
4> Vào thư mục vừa tạo ở phần 1 tạo các thư mục có tên là 1 kí tự duy nhất nằm trong tên của thư mục được tạo trong phần 1(vd : tên thư mục là : nguyenb thì các thư mục trong nó gồm n,g,u,y,e,n,b). Các thư mục này cho người chủ có quyền đọc và ghi, các nguời dùng khác có quyền đọc thôi.
5> Đọc tập tin /ect/passwd tìm những user thuộc về nhóm có mã số người dùng (UID) lớn hơn 500 và nhỏ hơn 1000 trích ra 3 thông tin về user là tên, UID, tên shell { trường 1, trường 3, trường 7}để ghi vào tập tin thongtin nằm trong thư mục mô tả ở phần 3; mỗi dòng của tập tin thongtin chứa 3 thông tin kể trên, mỗi trường thông tin ngăn cách nhau bằng TAB
Thí dụ :
- Trong /ect/passwd có dòng : u8:ABCD12*nADcdq:1008:100:User for practices:/home/u8:/bin/bash
- Thì trong thongtin phải có dòng : u8 1008 /bin/bash

6> Tập tin thongtin này cho người chủ và người cùng nhóm được quyền đọc ghi nhưng những người khác chỉ có quyền đọc.
7> Tâp tin thongtin này được xếp thứ tự tăng dần theo giá trị số của UID.
8> Vào trong thư mục tạo ra ở phần 3 tạo các tập tin có tên là các mã số nhóm (GID) đã được liệt kê trong tập tin /ect/passwd sao cho mỗi tập tin như thế chứa các thông tin gồm tên, UID, GID { trường 1, 3, 4} của những users có mã số nhóm đúng như tên tập tin. Nội dung các tập tin này phải được xếp thứ tự tăng dần theo giá trị số của mã số người dùng (UID).
9> Vào trong thư mục đã tạo ra ở phần 1, tạo một tập tin tên password gồm nội dung tập tin /ect/passwd được xếp thứ tự tăng dần theo giá trị số của mã số nhóm GID và UID

Các bạn thử và post lên anh em cùng thảo luận smilie
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 13:21:49 (+0700) | #2 | 102028
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Không biết cái đề bài do bạn nghĩ ra hay là lấy ở đâu? Tớ thấy nó giống cái bài tập về nhà smilie smilie smilie Dù sao thì nó cũng khá hay và tổng hợp kiến thức về Bash Shell. Tớ demo một đoạn từ bước 1 đến bước 4 (Phần còn lại sẽ khó hơn, và khó nhất có lẽ là sort theo cả GUID và UID)
Code:
#!/bin/bash
# Step 1
cd /home/quanta
mkdir $1
chmod 744 $1

# Step 2
cd $1
mkdir `hostname`\ `whoami`
chmod 644 `hostname`\ `whoami`

# Step 3
cd `hostname`\ `whoami`
echo $2`hostname` | tr 'a-z' 'A-Z' >> step3.txt
cat /etc/passwd >> `cat step3.txt`

# Step 4
cd /home/quanta/$1
myname=$1
for (( i = 0 ; i < `expr length $1` ; i++ ))
do
	mkdir ${myname:$i:1}
	chmod 644 ${myname:$i:1}
done


ps: Tớ sẽ nghĩ và thử viết tiếp những phần còn lại cũng như sửa lại cho tối ưu nếu bạn cùng tham gia thảo luận.








Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 14:47:13 (+0700) | #3 | 102043
minhhuy192
Member

[Minus]    0    [Plus]
Joined: 18/07/2006 00:01:05
Messages: 6
Location: TPHCM
Offline
[Profile] [PM]
$' có ý nghĩa gì vậy bạn quanta
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 14:53:29 (+0700) | #4 | 102044
KZM
Member

[Minus]    0    [Plus]
Joined: 21/07/2006 17:01:06
Messages: 58
Offline
[Profile] [PM]

quanta wrote:
Không biết cái đề bài do bạn nghĩ ra hay là lấy ở đâu? Tớ thấy nó giống cái bài tập về nhà smilie smilie smilie Dù sao thì nó cũng khá hay và tổng hợp kiến thức về Bash Shell. Tớ demo một đoạn từ bước 1 đến bước 4 (Phần còn lại sẽ khó hơn, và khó nhất có lẽ là sort theo cả GUID và UID)
Code:
#!/bin/bash
# Step 1
cd /home/quanta
mkdir $1
chmod 744 $1

# Step 2
cd $1
mkdir `hostname`\ `whoami`
chmod 644 `hostname`\ `whoami`

# Step 3
cd `hostname`\ `whoami`
echo $2`hostname` | tr 'a-z' 'A-Z' >> step3.txt
cat /etc/passwd >> `cat step3.txt`

# Step 4
cd /home/quanta/$1
myname=$1
for (( i = 0 ; i < `expr length $1` ; i++ ))
do
	mkdir ${myname:$i:1}
	chmod 644 ${myname:$i:1}
done


ps: Tớ sẽ nghĩ và thử viết tiếp những phần còn lại cũng như sửa lại cho tối ưu nếu bạn cùng tham gia thảo luận.








 


Thì ra anh quanta thành pro linux rồi. Tưởng bắt nạt được, vầy thì thua rồi, cố gắng học để tranh luận với anh quanta vậy.
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 15:13:23 (+0700) | #5 | 102046
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

minhhuy192 wrote:
$' có ý nghĩa gì vậy bạn quanta 

Nó có nghĩa là: ...
......................... Bạn nên kiếm một quyển về Bash Shell để đọc. Ví dụ như vài cuốn này.
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 18:34:22 (+0700) | #6 | 102053
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
@quanta: tớ thấy bước 3 có chút vấn đề, đề bài yêu cầu tạo ra file với tên người ghép với tên máy chứ ko phải tạo ra 1 file chứa nội dung chứa chúng. Hơn nữa, để bổ xung nội dung file /etc/passwd vào file của mình thì viết thế này mới được chứ nhỉ:
Code:
cat /etc/passwd >> step3.txt


Bước 3 tớ đề xuất cách này, mượn cách làm của quanta và đi vòng 1 chút:
Code:
cat /etc/passwd >> $(echo $2`hostname` | tr [a-z] [A-Z])


Mấy câu sau đọc thấy khoai quá, 1 số lệnh tớ vẫn chưa biết smilie nên chưa làm được. Chỗ này phải cám ơn quanta đã mở mang cho mấy lệnh smilie.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 22:36:36 (+0700) | #7 | 102066
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

learn2hack wrote:
@quanta: tớ thấy bước 3 có chút vấn đề, đề bài yêu cầu tạo ra file với tên người ghép với tên máy chứ ko phải tạo ra 1 file chứa nội dung chứa chúng. Hơn nữa, để bổ xung nội dung file /etc/passwd vào file của mình thì viết thế này mới được chứ nhỉ:
Code:
cat /etc/passwd >> step3.txt


Bước 3 tớ đề xuất cách này, mượn cách làm của quanta và đi vòng 1 chút:
Code:
cat /etc/passwd >> $(echo $2`hostname` | tr [a-z] [A-Z])


Mấy câu sau đọc thấy khoai quá, 1 số lệnh tớ vẫn chưa biết smilie nên chưa làm được. Chỗ này phải cám ơn quanta đã mở mang cho mấy lệnh smilie

chào learn2hack,

Thật ra thì đoạn code của tớ không sai nhưng bị thừa. Lúc đó viết vội nên không hiểu sao tự nhiên lại phải đi vòng qua 1 file trung gian: step3.txt (chứa nội dung là TÊN FILE yêu cầu của đề bài). Đoạn learn2hack viết là chuẩn và không có gì gọi là "đi vòng" cả.

Nên lưu ý chỗ này của tớ:
cat /etc/passwd >> `cat step3.txt` 


Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 23:35:26 (+0700) | #8 | 102078
quanghuy12
Member

[Minus]    0    [Plus]
Joined: 20/11/2007 17:07:16
Messages: 12
Offline
[Profile] [PM]
Em xin lam theo cach sau :
Code:
#!/bin/bash
#phan 1

d1='hoquocanh0311048'
if [ -d $d1 ]
then
	rm -r $d1	
	cd ~ 
	mkdir $d1
else	
	cd ~
	mkdir $d1	
fi
chmod u=rwx,go=r $d1
#chmod 744 $d1

#phan 2
host=$(echo `hostname` | tr '[A-Z]' '[a-z]')
user=$(echo `whoami` | tr '[A-Z]' '[a-z]')
d3="$host $user"
# vao trong thu muc duoc tao tu phan 1
cd $d1

# kiem tra d3 co ton tai chua
if [ -d "$d3" ]
then
	rm -r "$d3"
	mkdir "$d3"
else	
	mkdir "$d3"
fi
chmod u=rwx,go=r "$d3"
#chmod 744 $d3
#phan 3
# vao thu muc duoc tao ra o phan 3
cd "$d3"

host=$(echo `hostname` | tr '[a-z]' '[A-Z]')
f4="HOQUOCANH$host"
grep $user /etc/passwd > "$f4"

# phan 4
count=$(echo -n $d1 | wc -c)
i=1
cd
cd $d1
while [ $i -le $count ]
do
	tempd=$(echo -n $d1 | cut -c$i)
	if [ -d $tempd ]
	then
		rm -r $tempd
		mkdir $tempd
	else	
		mkdir $tempd
	fi	
	chmod 744 $tempd
	i=`expr $i + 1`
done

cac bac dong gop cho em nha
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 05/12/2007 23:46:25 (+0700) | #9 | 102083
quanghuy12
Member

[Minus]    0    [Plus]
Joined: 20/11/2007 17:07:16
Messages: 12
Offline
[Profile] [PM]
san day gui cac bac cai link hoc linux tieng viet : doanngan.googlepages.com/unix.htm
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 06/12/2007 00:48:14 (+0700) | #10 | 102093
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

quanghuy12 wrote:
Em xin lam theo cach sau :
Code:
#!/bin/bash
#phan 1

d1='hoquocanh0311048'
if [ -d $d1 ]
then
	rm -r $d1	
	cd ~ 
	mkdir $d1
else	
	cd ~
	mkdir $d1	
fi
...
 

Những đoạn check thư mục cần tạo đã tồn tại hay chưa của bạn là hoàn toàn đúng và cần thiết.

quanghuy12 wrote:

Sẵn đây hỏi luôn cá bác : vd : ghi tên người đang chạy máy vào tập tin soyeulylich (nằm trong thư mục đã được tạo ra ỏ
phần 1). Và cấp quyền read/wirte cho chủ nhân, chỉ cấp quyền read cho nhóm và cho người khác.
Em lam :
Code:
di='thu_muc_nguon'
 echo "Nguoi chay may : `whoami`" > $d1/soyeulylich
 chmod u=rw,g=r,o-rwx soyeulylich
 #chmod 640 soyeulylich


Cho thực thi, nó đã ghi dữ liệu đúng vào tập tin soyeulich ,nhưng lại báo là ::
chmod: cannot access `soyeulylich': No such file or directory
nghĩa là sao các bác 

Nghĩa là bạn cần xem lại xem đang đứng ở đâu, bằng lệnh pwd

Xin được viết tiếp Phần 5 và 6:
Code:
#!/bin/bash
# Step 5
cat /etc/passwd | while read line
do
	uid=$(echo $line | cut -d: -f3)
	if [ `expr $uid` -ge 500 ] && [ `expr $uid` -le 1000 ]; then
		echo $line | cut -d: -f1,3,7 >> temp
	fi
done
sed 's/:/\t/g' temp >> thongtin
rm -fr temp

# Step 6
chmod 664 thongtin


ps: chưa làm thế nào để "sed" luôn file thongtin được, đành lưu tạm ra file temp
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 06/12/2007 01:09:22 (+0700) | #11 | 102098
quanghuy12
Member

[Minus]    0    [Plus]
Joined: 20/11/2007 17:07:16
Messages: 12
Offline
[Profile] [PM]
có 1 cách nhìn tổng quát hơn :

d1='tap_tin_nguon'
host=$(echo `hostname` | tr '[A-Z]' '[a-z]')
d3="$host $user"
cd
file6='thongtin'
# xoa du lieu trong tap tin 'thongtin' neu co
[ -f $file6 ] && rm -f $file6
# duyet trong /etc/passwd
cat /etc/passwd | while read LINE
do
uid=`echo $LINE | cut -f3 -d':'`

name=`echo $LINE | cut -f1 -d':'`
shellname=`echo $LINE | cut -f7 -d':'`
echo -e "$name \t$uid \t$shellname" >> $d1/"$d3"/$file6 # cái này có thể đưa trực tiếp vào file
#else
#echo "uid = $uid khong nam trong khoang 500<uid<1000"

done
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 06/12/2007 01:25:10 (+0700) | #12 | 102101
quanghuy12
Member

[Minus]    0    [Plus]
Joined: 20/11/2007 17:07:16
Messages: 12
Offline
[Profile] [PM]
#phan 8:

# sap xep cho tap tin 'thongtin' neu co
if [ -f $d1/"$d3"/$file6 ]
then
sort -n -k2 $d1/"$d3"/$file6 -o $d1/"$d3"/$file6
fi
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 06/12/2007 03:16:36 (+0700) | #13 | 102125
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Hoàn thành tác phẩm (có vài dòng mà đọc man sort mãi mới làm được smilie)
Code:
# Step 8
cat /etc/passwd | while read line
do
	echo $line | cut -d: -f1,3,4 >> $(echo $line | cut -d: -f4)
	sort -n -t: --key=2 $(echo $line | cut -d: -f4) -o $(echo $line | cut -d: -f4)
done

# Step 9
cat /etc/passwd | while read line
do
	echo $line >> passwd
	sort -n -t: --key=4 --key=3 passwd -o passwd
done


ps: Sau bài tập này có lẽ phải lập cái topic chuyên dành cho viết bash shell script. Cảm ơn quanghuy12
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 06/12/2007 14:39:24 (+0700) | #14 | 102267
minhhuy192
Member

[Minus]    0    [Plus]
Joined: 18/07/2006 00:01:05
Messages: 6
Location: TPHCM
Offline
[Profile] [PM]

quanta wrote:

minhhuy192 wrote:
$' có ý nghĩa gì vậy bạn quanta 

Nó có nghĩa là: ...
......................... Bạn nên kiếm một quyển về Bash Shell để đọc. Ví dụ như vài cuốn này.
 

thanks quanta
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 09/12/2007 16:14:00 (+0700) | #15 | 102896
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
@quanta: đúng là tớ đọc vội quá, ko để ý cặp `` của cậu, thanks.

quanta wrote:

Xin được viết tiếp Phần 5 và 6:
Code:
#!/bin/bash
# Step 5
cat /etc/passwd | while read line
do
	uid=$(echo $line | cut -d: -f3)
	if [ `expr $uid` -ge 500 ] && [ `expr $uid` -le 1000 ]; then
		echo $line | cut -d: -f1,3,7 >> temp
	fi
done
sed 's/:/\t/g' temp >> thongtin
rm -fr temp


ps: chưa làm thế nào để "sed" luôn file thongtin được, đành lưu tạm ra file temp 


Chỗ này dùng tr là ổn thôi quanta à:
Code:
echo $line | cut -d: -f1,3,7 | tr : '\t' >> thongtin


@quanghuy12: Bạn tối ưu và sắp xếp lại code cho nó gọn nhẹ và đẹp mắt hơn, sẽ dễ theo dõi hơn đấy.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: Chia xẻ 1 bài tập Linux tổng quát ! 10/12/2007 01:22:49 (+0700) | #16 | 102932
[Avatar]
lihavim
Elite Member

[Minus]    0    [Plus]
Joined: 08/06/2004 15:19:32
Messages: 506
Offline
[Profile] [PM]

quanta wrote:
ps: chưa làm thế nào để "sed" luôn file thongtin được, đành lưu tạm ra file temp 

Hề, xài thêm thằng -i là ổn:
Code:
sed -i 's/:/\t/g' temp
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|