1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
<code>我們在運維中,尤其是linux運維,都知道腳本的重要性,腳本會讓我們的 運維事半功倍,是以學會寫腳本是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的腳本。如何學好腳本,最關鍵的是就是大量的練習 和實踐。根據以下腳本我們可以拓展,這樣我們提高的很快!舉一反三!</code>
<code> </code>
<code>1.用Shell程式設計,判斷一檔案是不是字元裝置檔案,如果是将其拷貝到 /dev 目錄下。</code>
<code>參考程式:</code>
<code>C代碼 收藏代碼</code>
<code>#!/bin/sh </code>
<code>FILENAME= </code>
<code>echo “Input file name:” </code>
<code>read FILENAME </code>
<code>if</code>
<code>[ -c</code><code>"$FILENAME"</code>
<code>] </code>
<code>then </code>
<code>cp $FILENAME /dev </code>
<code>fi </code>
<code>2.設計一個shell程式,添加一個新組為class1,然後添加屬于這個組的30個使用者,使用者名的形式為stdxx,其中xx從01到30。</code>
<code>參考答案:</code>
<code>i=1 </code>
<code>groupadd class1 </code>
<code>while</code>
<code>[ $i -le 30 ] </code>
<code>do</code>
<code>[ $i -le 9 ] ;then </code>
<code>USERNAME=stu0${i} </code>
<code>else</code>
<code>USERNAME=stu${i} </code>
<code>fi </code>
<code>useradd $USERNAME </code>
<code>mkdir /home/$USERNAME </code>
<code>chown -R $USERNAME /home/$USERNAME </code>
<code>chgrp -R class1 /home/$USERNAME </code>
<code>i=$(($i+1)) </code>
<code>done </code>
<code>3.編寫shell程式,實作自動删除50個賬号的功能。賬号名為stud1至stud50。</code>
<code>[ $i -le 50 ] </code>
<code>userdel -r stud${i} </code>
<code>i=$(($i+1 )) </code>
<code>4.某系統管理者需每天做一定的重複工作,請按照下列要求,編制一個解決方案:</code>
<code>(1)在下午4 :50删除/abc目錄下的全部子目錄和全部檔案;</code>
<code>(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1檔案中每行第一個域的全部資料加入到/backup目錄下的bak01.txt檔案内;</code>
<code>(3)每逢星期一下午5:50将/data目錄下的所有目錄和檔案歸檔并壓縮為檔案:backup.tar.gz;</code>
<code>(4)在下午5:55将IDE接口的CD-ROM解除安裝(假設:CD-ROM的裝置名為hdc);</code>
<code>(5)在早晨8:00前開機後啟動。</code>
<code>參考答案:</code>
<code>解決方案:</code>
<code>(1)用vi建立編輯一個名為prgx的crontab檔案;</code>
<code>(2)prgx檔案的内容:</code>
<code>50 16 * * * rm -r /abc/* </code>
<code>0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt </code>
<code>50 17 * * * tar zcvf backup.tar.gz /data </code>
<code>55 17 * * * umount /dev/hdc </code>
<code>(3)由超級使用者登入,用crontab執行 prgx檔案中的内容:</code>
<code>root@xxx:#crontab prgx;在每日早晨8:00之前開機後即可自動啟動crontab。</code>
<code>5.設計一個shell程式,在每月第一天備份并壓縮/etc目錄的所有内容,存放在/root/bak目錄裡,且檔案名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程式fileback存放在/usr/bin目錄下。</code>
<code>(1)編寫shell程式fileback:</code>
<code>DIRNAME=`ls /root | grep bak` </code>
<code>[ -z</code><code>"$DIRNAME"</code>
<code>] ; then </code>
<code>mkdir /root/bak </code>
<code>cd /root/bak </code>
<code>YY=`date +%y` </code>
<code>MM=`date +%m` </code>
<code>DD=`date +%d` </code>
<code>BACKETC=$YY$MM$DD_etc.tar.gz </code>
<code>tar zcvf $BACKETC /etc </code>
<code>echo “fileback finished!” </code>
<code>(2)編寫任務定時器:</code>
<code>echo “0 0 1 * * /bin/sh /usr/bin/fileback” >; /root/etcbakcron </code>
<code>crontab /root/etcbakcron </code>
<code>或使用crontab -e 指令添加定時任務: </code>
<code>0 1 * * * /bin/sh /usr/bin/fileback </code>
<code>6.有一普通使用者想在每周日淩晨零點零分定期備份/user/backup到/tmp目錄下,該使用者應如何做?</code>
<code>(1)第一種方法:</code>
<code>使用者應使用crontab –e 指令建立crontab檔案。格式如下: </code>
<code>0 0 * * sun cp –r /user/backup /tmp </code>
<code>(2)第二種方法:</code>
<code>使用者先在自己目錄下建立檔案file,檔案内容如下:</code>
<code>0 * * sun cp –r /user/backup /tmp </code>
<code>然後執行 crontab file 使生效。</code>
<code>7.設計一個Shell程式,在/userdata目錄下建立50個目錄,即user1~user50,并設定每個目錄的權限,其中其他使用者的權限為:讀;檔案所有者的權限為:讀、寫、執行;檔案所有者所在組的權限為:讀、執行。</code>
<code>參考答案: 建立程式 Pro16如下:</code>
<code>[ i -le 50 ] </code>
<code>[ -d /userdata ];then </code>
<code>mkdir -p /userdata/user$i </code>
<code>chmod 754 /userdata/user$i </code>
<code>echo “user$i” </code>
<code>let “i = i + 1″ (或i=$(($i+1)) </code>
<code>mkdir /userdata </code>
<code>8、mysql備份執行個體,自動備份mysql,并删除30天前的備份檔案</code>
<code> </code>
<code>#auto backup mysql </code>
<code>#wugk 2012-07-14 </code>
<code>#PATH DEFINE </code>
<code>BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` </code>
<code>MYSQLDB=www </code>
<code>MYSQLPW=backup </code>
<code>MYSQLUSR=backup </code>
<code>if</code><code>[ $UID -ne 0 ];then </code>
<code>echo This script must use administrator or root user ,please</code><code>exit</code><code>! </code>
<code>sleep 2 </code>
<code>exit</code>
<code>0 </code>
<code>if</code><code>[ ! -d $BAKDIR ];then </code>
<code>mkdir -p $BAKDIR </code>
<code>echo This is $BAKDIR exists ,please</code><code>exit</code>
<code>…. </code>
<code>exit</code>
<code>###mysqldump backup mysql </code>
<code>/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >/data/backup/mysql/`date +%Y-%m-%d`/www_db.sql </code>
<code>cd $BAKDIR ; tar -czf www_mysql_db.tar.gz *.sql </code>
<code>cd $BAKDIR ;find . -name “*.sql” |xargs rm -rf[ $? -eq 0 ]&&echo “This `date +%Y-%m-%d` RESIN BACKUP is SUCCESS” </code>
<code>cd /data/backup/mysql/ ;find . -mtime +30 |xargs rm -rf </code>
<code>9、自動安裝Nginx腳本,采用</code><code>case</code><code>方式,選擇方式,也可以根據實際需求改成自己想要的腳本</code>
<code>###nginx install shell </code>
<code>###wugk 2012-07-14 </code>
<code>###PATH DEFINE </code>
<code>SOFT_PATH=/data/soft/ </code>
<code>NGINX_FILE=nginx-1.2.0.tar.gz </code>
<code>DOWN_PATH=http:</code><code>//nginx.org/download/ </code>
<code>if</code><code>[ ! -d $SOFT_PATH ];then </code>
<code>mkdir -p $SOFT_PATH </code>
<code>download () </code>
<code>{ </code>
<code>cd $SOFT_PATH ;wget $DOWN_PATH/$NGINX_FILE </code>
<code>} </code>
<code>install () </code>
<code>yum install pcre-devel -y </code>
<code>cd $SOFT_PATH ;tar xzf $NGINX_FILE ;cd nginx-1.2.0/ &&./configure –prefix=/usr/local/nginx/ –with-http_stub_status_module –with-http_ssl_module </code>
<code>[ $? -eq 0 ]&&make &&make install </code>
<code>start () </code>
<code>lsof -i :80[ $? -ne 0 ]&&/usr/local/nginx/sbin/nginx </code>
<code>stop () </code>
<code>ps -ef |grep nginx |grep -v grep |awk ‘{print $2}’|xargs kill -9 </code>
<code>() </code>
<code>echo $? ;</code><code>exit</code>
<code>###case menu ##### </code>
<code>case</code>
<code>$1 in </code>
<code>download ) </code>
<code>download </code>
<code>;; </code>
<code>install ) </code>
<code>install </code>
<code>start ) </code>
<code>start </code>
<code>stop ) </code>
<code>stop </code>
<code>* ) </code>
<code>echo “USAGE:$0 {download or install or start or stop}” </code>
<code>esac </code>
<code>10、批量解壓tar腳本,批量解壓zip并且建立目前目錄。</code>
<code>PATH1=/tmp/images </code>
<code>PATH2=/usr/www/images </code>
<code>for</code>
<code>i in `ls ${PATH1}/*` </code>
<code>tar xvf $i -C $PATH2 </code>
<code>這個腳本是針對所有tar檔案在一個目錄,但是實際情況中,有可能在下級或者更深的目錄,我們可以使用find查找</code>
<code>i in `find $PATH1 -name ”*.tar” ` </code>
<code>如何是zip檔案,例如123189.zip 132342.zip 等等批量檔案,預設unzip直接解壓不帶自身目錄,意思是解壓123189.zip完目前目錄就是圖檔,不能建立123189目錄下并解壓,可以用shell腳本實作</code>
<code>cd $PATH1 </code>
<code>i in `find . -name ”*.zip”|awk -F. {print $2} ` </code>
<code>mkdir -p PATH2$i </code>
<code>unzip -o .$i.zip -d PATH2$i </code>
<code>done </code>
<code>原創文章轉載請注明: Linux常用Shell腳本珍藏 | 專注Unix/Linux領域</code>
<code>ssh 批量上傳檔案</code>
<code>上傳檔案大多數用的是ftp,但是用ftp有一點不好,就是本地和遠端的目錄要對應,這樣就要在多個目錄下去切換,這樣挺麻煩的,如果不注意的話,很有可能傳錯。是以想了個辦法利用scp來批量上傳檔案或者目錄。</code>
<code>一,scp上傳不要輸入密碼</code>
<code>如果要用scp來上傳檔案,第一步就要去掉scp上傳時要輸入密碼。要不然就沒辦法批量上傳了。具體請參考:ssh 不用輸入密碼</code>
<code>二,ssh批量上傳腳本</code>
<code>1,要上傳的檔案清單放到一個test檔案中</code>
<code>root@ubuntu:/home/zhangy# cat test </code>
<code>/home/zhangy/test/aaa </code>
<code>/home/zhangy/test/nginx.conf </code>
<code> </code>
<code>/home/zhangy/test/test.sql </code>
<code>/home/zhangy/test/pa.txt </code>
<code>/home/zhangy/test/password </code>
<code>上面就要上傳的檔案。</code>
<code>2,批量上傳的腳本</code>
<code>vim file_upload.sh</code>
<code>DATE=`date +%Y_%m_%d_%H` </code>
<code>[ $1 ] </code>
<code> </code><code>for</code>
<code>file in $(sed</code><code>‘/^$/d‘</code>
<code>$1) </code><code>//去掉空行 </code>
<code> </code><code>do</code>
<code> </code><code>if</code>
<code>[ -f $file ] </code><code>//普通檔案 </code>
<code> </code><code>then </code>
<code> </code><code>res=`scp $file $2:$file` </code><code>//上傳檔案 </code>
<code> </code><code>if</code>
<code>[ -z $res ] </code><code>//上傳成功 </code>
<code> </code><code>then </code>
<code> </code><code>echo $file >> ${DATE}_upload.</code><code>log</code>
<code>//上傳成功的日志 </code>
<code> </code><code>fi </code>
<code> </code><code>elif [ -d $file ] </code><code>//目錄 </code>
<code> </code><code>res=`scp -r $file $2:$file` </code>
<code>[ -z $res ] </code>
<code> </code><code>echo $file >> ${DATE}_upload.</code><code>log</code>
<code> </code><code>fi </code>
<code> </code><code>done </code>
<code> </code><code>echo</code><code>"no file"</code>
<code>>> ${DATE}_error.</code><code>log</code>
<code>上傳成功後,傳回的是一個空行,上傳不成功,什麼都不傳回</code>
<code>3,上傳的格式</code>
<code>./file_upload.sh test 192.168.1.13 </code>
<code>test是上傳清單檔案,192.168.1.13檔案要傳到的地方。</code>
<code>0</code>
<code>轉載請注明</code>
<code>作者:海底蒼鷹</code>
<code>位址:http:</code><code>//blog.51yip.com/linux/1356.html</code>
<code>1. 轉換檔案大小寫:</code>
<code>A script to convert the specified filenames to lower</code><code>case</code><code>.</code>
<code> </code><code># lowerit </code>
<code># convert all file names in the current directory to lower case </code>
<code># only operates on plain files--does not change the name of directories </code>
<code># will ask for verification before overwriting an existing file </code>
<code>x in `ls` </code>
<code>[ ! -f $x ]; then </code>
<code> </code><code>continue</code>
<code> </code><code>lc=`echo $x | tr</code><code>‘[A-Z]‘</code>
<code>‘[a-z]‘</code><code>` </code>
<code>[ $lc != $x ]; then </code>
<code> </code><code>mv -i $x $lc </code>
<code>or</code>
<code>test $# = 0 </code>
<code> </code><code>echo</code><code>"Usage $0: <files>"</code>
<code>1>&2 </code>
<code> </code><code>exit</code>
<code>1 </code>
<code>filename in</code><code>"$@"</code>
<code> </code><code>new_filename=`echo</code><code>"$filename"</code>
<code>| tr A-Z a-z` </code>
<code> </code><code>test</code><code>"$filename"</code>
<code>=</code><code>"$new_filename"</code>
<code>&&</code><code>continue</code>
<code>test -r</code><code>"$new_filename"</code>
<code> </code><code>echo</code><code>"$0: $new_filename exists"</code>
<code> </code><code>elif test -e</code><code>"$filename"</code>
<code> </code><code>mv</code><code>"$filename"</code>
<code>"$new_filename"</code>
<code> </code><code>else</code>
<code> </code><code>echo</code><code>"$0: $filename not found"</code>
<code>2. 看網站 Watch a Website</code>
<code>A script to repeated download a webpage until it matches a regex then notify an e-mail address.</code>
<code>For example to get e-mail when Kesha tickets (not</code><code>for</code>
<code>yourself of course) go on sale you might run:</code>
<code>% watch_website.sh http:</code><code>//ticketek.com.au/ ‘Ke[sS$]+ha‘ [email protected] </code>
<code>repeat_seconds=300 #check every 5 minutes </code>
<code>test $# = 3 </code>
<code> </code><code>url=$1 </code>
<code> </code><code>regexp=$2 </code>
<code> </code><code>email_address=$3 </code>
<code> </code><code>echo</code><code>"Usage: $0 <url> <regex>"</code>
<code>true</code>
<code>wget -O- -q</code><code>"$url"</code><code>|egrep</code><code>"$regexp"</code>
<code>>/dev/null </code>
<code> </code><code>echo</code><code>"Generated by $0"</code>
<code>| mail -s</code><code>"$url now matches $regexp"</code>
<code>$email_address </code>
<code> </code><code>exit</code>
<code> </code><code>sleep $repeat_seconds </code>
<code>3. 轉GIF到PNG convert GIF files to PNG</code>
<code>This scripts converts GIF files to PNG files via the intermediate PPM format.</code>
<code>[ $# -eq 0 ] </code>
<code> </code><code>echo</code><code>"Usage: $0 files..."</code>
<code>! type giftopnm 2>/dev/null </code>
<code> </code><code>echo</code><code>"$0: conversion tool giftopnm not found "</code>
<code># missing "in ..." defaults to in "$@" </code>
<code>f </code>
<code> </code><code>case</code>
<code>"$f"</code> <code>in </code>
<code> </code><code>*.gif) </code>
<code> </code><code># OK, do nothing </code>
<code> </code><code>;; </code>
<code> </code><code>*) </code>
<code> </code><code>echo</code><code>"gif2png: skipping $f, not GIF"</code>
<code> </code><code>esac </code>
<code> </code><code>dir=`dirname</code><code>"$f"</code><code>` </code>
<code> </code><code>base=`basename</code><code>"$f"</code>
<code>.gif` </code>
<code> </code><code>result=</code><code>"$dir/$base.png"</code>
<code> </code><code>giftopnm</code><code>"$f"</code>
<code>| pnmtopng > $result && echo</code><code>"wrote $result"</code>
<code>4. 計數 Counting</code>
<code>A utility script to print the sub-range of integers specified by its arguments.</code>
<code>Useful to use on the command line or from other scripts</code>
<code>test $# = 1 </code>
<code> </code><code>start=1 </code>
<code> </code><code>finish=$1 </code>
<code>elif test $# = 2 </code>
<code> </code><code>start=$1 </code>
<code> </code><code>finish=$2 </code>
<code> </code><code>echo</code><code>"Usage: $0 <start> <finish>"</code>
<code>argument in</code><code>"$@"</code>
<code>echo</code><code>"$argument"</code><code>|egrep -v</code><code>‘^-?[0-9]+$‘</code>
<code> </code><code>echo</code><code>"$0: argument ‘$argument‘ is not an integer"</code>
<code>number=$start </code>
<code>test $number -le $finish </code>
<code> </code><code>echo $number </code>
<code> </code><code>number=`expr $number + 1` # or number=$(($number + 1)) </code>
<code>5. 字頻率 Word Frequency</code>
<code>Count the number of</code><code>time</code>
<code>each different word occurs in the files given as arguments.</code>
<code>sed</code><code>‘s/ /\n/g‘</code>
<code>"$@"</code><code>| # convert to one word per line </code>
<code>tr A-Z a-z| # map uppercase to lower</code><code>case</code>
<code>sed</code><code>"s/[^a-z‘]//g"</code><code>| #</code><code>remove</code>
<code>all characters except a-z and ‘ </code>
<code>egrep -v</code><code>‘^$‘</code><code>| #</code><code>remove</code>
<code>empty lines </code>
<code>sort| # place words in alphabetical order </code>
<code>uniq -c| # use uniq to count how many times each word occurs </code>
<code>sort -n # order words in frequency of occurrance </code>
<code> </code><code>For example</code>
<code>% cd /home/cs2041/public_html/lec/shell/examples </code>
<code>% ./word_frequency.sh dracula.txt|tail </code>
<code> </code><code>2124 it </code>
<code> </code><code>2440 that </code>
<code> </code><code>2486 in </code>
<code> </code><code>2549 he </code>
<code> </code><code>2911 a </code>
<code> </code><code>3600 of </code>
<code> </code><code>4448 to </code>
<code> </code><code>4740 i </code>
<code> </code><code>5833 and </code>
<code> </code><code>7843 the </code>
<code>6. Finding</code>
<code>Search $PATH</code><code>for</code>
<code>the specified programs</code>
<code> </code><code>echo</code><code>"Usage $0: <program>"</code>
<code>program in</code><code>"$@"</code>
<code> </code><code>program_found=</code><code>‘‘</code>
<code> </code><code>for</code>
<code>directory in `echo</code><code>"$PATH"</code>
<code>| tr</code><code>‘:‘</code> <code>‘ ‘</code><code>` </code>
<code> </code><code>do</code>
<code> </code><code>f=</code><code>"$directory/$program"</code>
<code> </code><code>if</code>
<code>test -x</code><code>"$f"</code>
<code> </code><code>then </code>
<code> </code><code>ls -ld</code><code>"$f"</code>
<code> </code><code>program_found=1 </code>
<code> </code><code>fi </code>
<code> </code><code>done </code>
<code>test -z $program_found </code>
<code> </code><code>echo</code><code>"$program not found"</code>
<code>Alternative implementation</code><code>using</code>
<code>while</code><code>, and a cute use of grep and ||</code>
<code> </code><code>echo</code><code>"$PATH"</code><code>| </code>
<code> </code><code>tr</code><code>‘:‘</code>
<code>‘\n‘</code><code>| </code>
<code> </code><code>while</code>
<code>read directory </code>
<code> </code><code>done| </code>
<code> </code><code>egrep</code><code>‘.‘</code>
<code>|| echo</code><code>"$program not found"</code>
<code>And another implementation</code><code>using</code>
<code> </code><code>n_path_components=`echo $PATH|tr -d -c :|wc -c` </code>
<code> </code><code>index=1 </code>
<code>test $index -le $n_path_components </code>
<code> </code><code>directory=`echo</code><code>"$PATH"</code><code>|cut -d: -f$index` </code>
<code> </code><code>index=`expr $index + 1` </code>
<code> </code><code>test -n $program_found || echo</code><code>"$program not found"</code>
<code>來源: http:</code><code>//www.cse.unsw.edu.au/~cs2041/12s2/lec/shell/examples.notes.html</code>