Subscribe to RSS feed

十二月
26

基本網路修改設定

現在開始上 Server 嚕!!  相信需要clone 機器的機會將會很多!!!   由於Linux 預設會認網卡,所以Clone出來的機器,網路卡都會無法運作。
這時 ,設定一個好的 base 環境,就可以省掉很多麻煩滴!! 
這邊就大概簡單提一下,優化 vim 編輯的環境 及 Clone後 網路卡也能運作正常的方法。

十二月
24

Shell Script Programming

1.設計一個名為showme的script,藉由環境變數及一些Linux指令,使其可以顯示資訊如下:
$ showme
我是 <- login name

我的家在 <- home directory
我的家有下列這些東西:
<- ls home directory

我的殼是 <- shell name
這台電腦是 <- host name
我目前的工作目錄是 <- present woring directory
目前的工作目錄有下列這些東西:』
<- ls present woring directory

—-


2.設計一個名為verbvar的script,利用read輸入一個簡單的英文動詞,在其前加入一個to印出原形,字尾加ing印出作為進行式,字尾加ed印出作為過去式。
$ verbvar
請輸一個動詞: work
原 形: to work
進行式: working
過去式: worked
—-


3.設計一個名為addtwo的script,使其可以接收兩個數字參數,並將其相加後的結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,提示出正確的執行方式必須給兩個參數。
$ ./addtwo 12 6
sum = 18
$
$ ./addtwo 12
Usage: ./addtwo number1 number2
$
—-


4.設計一個名為mycal的script,使其可以接收三個數字參數,第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)以多層的if計算其結果,並將其結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,提示出正確的執行方式。如果中間的運算子是/,而第三個參數是0,則顯示除數不可為0
$ ./mycal 12 + 3
result = 15
$
$ ./mycal 12 – 3
result = 9
$
$ ./mycal 12 \* 3 # 注意:*為特殊符號,需加一倒斜線輸入
result = 36
$
$ ./mycal 12 / 3
result = 4
$
$ ./mycal 12 / 0
無法計算:除數不可為0
$
—-

1.
#!/bin/sh
echo 『I am $LOGNAME』
echo 『My home in the $HOME』

echo 『My home have `ls -l $HOME`』

echo 『My shell is $SHELL』

echo 『Host Name is $HOSTNAME』
echo 『Working Directory is `pwd`』
echo 『Directory have `ls -l`』

2.
#!/bin/sh
echo -n 『Please enter word : 『
read word
echo 『one –> $word』
echo 『two –> ${word}ed』
echo 『three-> ${word}ing』

3.
#!/bin/sh
if [ "$#" = "2" ]
then
      echo 『$1 + $2 = $(($1+$2))』
else
      echo 『Please enter Usage: ./addtwo number1 number2″
fi
exit 0


4.
#!/bin/sh
#if [ "$#" = "3" ] && [ "$2" = "+" ]
[ "$2" = "-"]
[ "$2" = "*" ]
[ "$2" = "/" ]
if [ "$#" = "3" ]
then
      case 『$2″ in
      『+』)
             echo 『$1 + $3 = $(($1+$3))』
       ;;
      『-』)
            echo 『$1 – $3 = $(($1-$3))』
       ;;
     『*』)
           echo 『$1 * $3 = $(($1*$3))』
       ;;
    『/』)
        if [ "$3" = "0" ]
        then
               echo 『number2 can’t be zero』
        else
               echo 『$1 / $3 = $(($1/$3))』
        fi
       ;;
     esac
else
echo 『Please enter Usage: ./mycal number1 +,-,\*,/ number2″
fi
exit 0

十二月
22

Shell Script Programming II

5.設計一個名為getmax的script,使其可以接收兩個數字參數,將較大的數顯示出來,如果都一樣大,則顯示都一樣大。

$ ./maxmin 18 15
max = 18
$
$ ./maxmin 15 15
Equals
$
—-



6.設計一個名為checkfile的script,使其可以接收一個檔案名稱作為參數,
若此名稱不是目前工作目錄的檔案或目錄,則顯示此名稱不存在,如果是檔案,則顯示其檔案內容,如果是一目錄則顯示此目錄內的清單。
$ checkfile 名稱
—-


7.設計一個名為newerfile的script,使其可以接收兩個檔案名稱作為參數,並將日期較新的檔案名稱顯示出來。
$ newerfile file1.txt file2.txt
file2.txt 較新
—-


8.設計一個名為avglen的script,使其可以接收一個檔案名稱(文字檔)作為參數,計算此檔平均每一列有多少bytes。
提示:使用wc -l < 檔名; 用man查一下wc的用法
$ avglen yang.txt
平均每列: 348 bytes
—-


9.設計一個名為createtodayfile的script,以touch指令產生一個檔案,檔名中含有今天的日期,例如myfile20090706.txt。
date +%Y…., 其餘date的日期格式, 請以man指令查詢
—-


10.設計一個名為addfiles的script,可自命令列讀取參數產生檔案allfile,如下,每加入一個檔案,隔2秒,如果重覆執行,則覆蓋原檔案。
原始檔案:
$ cat filea.txt
aaaaa
$ cat fileb.txt
bbbbb
$ cat filec.txt
ccccc


執行程式:
$ ./addfiles allfile.txt filea.txt fileb.txt filec.txt


結果:
$ cat allfile.txt
–2009-09-08 16:25:33
aaaaa
–2009-09-08 16:25:35
bbbbb
–2009-09-08 16:25:37
ccccc








5.
#!/bin/sh


if [ $1 -gt $2 ]
  then
        echo 『$1 VS $2 -> Max is $1″
elif [ $1 -lt $2 ]
  then
        echo 『$1 VS $2 -> Max is $2″
else
        echo 『$1 VS $2 -> Equals』
fi

exit 0


6.
#!/bin/sh
file=$1
if [ -f "$file" ]
 then
       echo 『`cat $file`』
elif [ -d "$file" ]
 then
       echo 『`ls -l $file`』
else
       echo 『No such file or directory』
fi
exit 0


7.
#!/bin/sh


if [ $1 -nt $2 ]
then
       echo 『$1 VS $2 = New file is $1″
elif [ $1 -ot $2 ]
then
       echo 『$1 VS $2 = New file is $2″
else
       echo 『No such file. Please check!』
fi

exit 0


8.
#!/bin/sh


x=`wc -c < $1`
y=`wc -l < $1`
echo total is 『$x』bytes
echo line is 『$y』
echo 『average is $((x/y))bytes.』


 9.
#!/bin/sh
x=`date +%Y%m%d`
echo 『creat a file —> myfile$x』.txt
`touch myfile』$x』.txt`


10.
#!/bin/sh


echo 1.touch 『$1″
touch $1
y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`

echo –$y-$m-$d\ $t > $1
cat $2 >> $1
sleep 2
echo 『run1″
t=`date +%T`
echo –$y-$m-$d\ $t >> $1
cat $3 >> $1
sleep 2
echo 『run2″
t=`date +%T`
echo –$y-$m-$d\ $t >> $1
cat $4 >> $1
exit 0

十二月
21

Shell Script Programming III

2.設計一個名為manymaxmin的script,使其可以接收不固定的多個數字參數,顯示數字中最大的及最小的,如果都一樣大,則顯示都一樣大。

$ ./maxmin 12 18 9 32 24 13

max = 32

min = 9

$ ./maxmin 15 15 15 15 15 15

All Equal = 15
—————————–
#!/bin/sh

max=0

for x in $@

do
  if [ $x -gt $max ]
  then
     max=$x
  fi
done

min=9999999

for y in $@

do
  if [ $y -lt $min ]
  then
     min=$y
  fi
done

if [ $max -eq $min ]
then
      echo All Equal = $max
else
     echo Max = $max
     echo Min = $min
fi
exit 0
——————————–


3.設計一個名為createmyfiles的script,以迴圈配合touch指令,產生十個檔案,檔名分別為myprog1.c,myprog2.c,…,myprog10.c。

#!/bin/sh
rm myprog*

for ((x=1;x<=10;x++))
do
   touch myprog$x.c
done

exit 0
——————————


4.設計一個名為lastfiles的script,顯示目前目錄中最近被修改的n個檔案檔名。


$ ./lastfiles 5

a1.txt

a3.txt

…共5個


#!/bin/sh

ls -t | head -$1
———————————

5.設計一個名為mvfiles的script,可以將所有副檔名為.c檔案,副檔名更名為.cpp,更名前後的副檔名均自命令列輸入。並將更名的結果顯示出來。

$ ./mvfiles .c .cpp


renamed myprog1.c to myprog1.cpp

….
#!/bin/sh

for file in *$1
do
  mv $file `basename $file $1`$2
  echo $file
done
exit 0

十二月
21

Ldap–Create Account

## 須先確認 uid Number  爾後創的檔案需放置於此shell script同目錄下。
## 僅提供輸入 帳戶、密碼、姓、名、uidNumber (會顯示最後的uidNumber作為參考)。
#!/bin/sh


echo -n 『Please input UserName : 『
read user


passwd=`slappasswd -crypt`


echo -n 『Please input First Name : 『
read first


echo -n 『Please input Last Name : 『
read last


lst=`ls -t | head -1`     —>列出最後修改的一個檔案
echo $lst


leuid=`grep uidNumber < $lst`    —>擷取 uidNumber資訊
echo $leuid


echo -n 『Please input UID : 『
read uidnumber


touch user.$user.ldif
F=user.$user.ldif


echo dn: uid=$user,ou=user,dc=rich,dc=com  >> $F
echo uid: $user  >> $F
echo cn: $user   >> $F
echo objectClass: account  >> $F
echo objectClass: posixAccount  >>$F
echo objectClass: shadowAccount  >>$F
echo userPassword:  $passwd  >>$F
echo shadowLastChange: 14089  >>$F
echo shadowMax: 99999  >>$F
echo shadowWarning: 7  >>$F
echo loginShell: /bin/bash  >>$F
echo uidNumber:  $uidnumber  >>$F
echo gidNumber:  201  >>$F
echo homeDirectory:  /home/$user  >>$F
echo gecos:  $first $last  >>$F
service ldap stop

sleep 2
slapadd -v -l $F
sleep 2
service ldap start


exit 0

十二月
21

自動及同歩化完成異地備份所有使用者家目錄

任務目標 : 自動及同歩化完成異地備份所有使用者家目錄.

於Host OS(OpenSUSE11), 建立一指令稿(使用bash) backup.sh 存放於/root/bin/內, 工作內容是對/home目錄進行增量備份(incremental backup), 且必須滿足以下需求:
a) 指令稿內必須使用tar 指令進行備份.

b) 指令稿內必須使用(定義及呼叫)函式(function)

c) 於每週一時, 指令稿必須進行完整備份(full backup).

d) 自每週二至週五, 指令稿必須進行增量備份(incremental backup), 只備份當日有異動的部份資料.

e) 指令稿內以date找出備份當日的星期名稱(如 Sun,Mon,Tue,…), 以便能判斷出必須採用的備份方法.

f) 使用一快照檔案(/var/log/backup/snapshot_file), 以便進行 backup 時的依據.

g) 對產生的備份檔須符合以下格式:

* Full backup: /var/backup/full-YYY-MM-DD.tar.gz

* Differential backup: /var/backup/incremental-YYYY-MM-DD.tar.gz (YYY-MM-DD 是備份當日的格式 (如. 2009-12-18).

h) 若進行備份失敗, 該指令稿必須能發出 email 給 root@localhost. 主旨為』Backup failed !』, email內容可不需要指定.

i) 於指令稿內使用rsync進行同歩Host OS(OpenSUSE11)的/var/backup目錄, push 到 Guest OS(SLES10)的 ~/backup目錄內,以實現異地備份任務.

j) 使用例行式排程於週一至週五18:30執行backup.sh.

k) 注意事項 :

* 預於2009/12/24進行驗收

* 請盡可能自己編寫(勿抄襲他人的). 若有問題請於班版提出.

祝 大家順利完成. Guru

#!/bin/bash
DOW=`date +%a`   ->將日期顯示改為 Mon、..作為變數


[ -d /var/log/backup ] || mkdir /var/log/backup    ->判斷 是否有此directory
[ -d /var/backup ] || mkdir /var/backup


#full (){ getfacl -R /home > /home/acls-`date +%F`
#         tar -czvf /var/backup/backup-full-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
#         touch /var/log/backup/last-backup
#         x=`echo $?`
#       }

->每次皆會參考 snapshot 作為複製檔案的依據,故進行Full 之前,先刪除snapshot檔來進行完全備份。

full (){ getfacl -R /home > /home/acls-`date +%F`       

         rm -rf /var/backup/snapshot_file                                    
         tar -czv -g /var/backup/snapshot_file -f /var/backup/backup-full-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
         touch /var/log/backup/last-backup
         x=`echo $?`
      }

->增量備份,參考snapshot_file檔,來備份最新的檔案。
 incr (){ getfacl -R /home > /home/acls-`date +%F`
         tar -czv -g /var/backup/snapshot_file -f /var/backup/backup-incremental-`date +%F`.tar.gz /home | tee /var/log/backup/last-backup > /var/log/backup/backup-`date +%F`.log
        x=`echo $?`
      }


#diff (){ getfacl -R /home > /home/acls-`date +%F`
#        find /home -type f -newer /var/log/backup/last-backup -print0 | tar –null -cvf /tmp/backup-diff-`date +%F`.tar -T – > /var/log/backup/backup-`date +%F`.log
#        x=`echo $?`
#      }

->利用case 來判斷 執行 Full or Incremental  backup!
case 『$DOW』 in
Mon) full ;;
Tue) incr ;;
Wed) incr ;;
Thu) incr ;;
Fri) incr ;;
esac


if [ $x -ne 0 ] ; then
echo 『』 | mail -s 『Backup failed !』 root
fi


#########————-Remote rsync backup——–#############(以下須手動執行)
# 1.  input –> ssh-keygen -t dsa -N 『』     ->產生金鑰
# 2.  Remote computer need–> mkdir ~/backup      ->建立遠端備份目錄
#########————————Run———————#############(以下註解拿掉即可執行)
echo -n 『Please input Remote IP address : 『
read IP
# echo Please wait….
# sleep 2 
# scp /root/.ssh/id_dsa.pub root@$IP:/root/.ssh/authorized_keys
 ->將剛產生的金鑰複製傳送到遠端電腦。之後登入,自動信任此帳戶!
echo Please wait….
sleep 2 
->判斷如果,備份 執行成功,則複製傳送到遠端電腦,進行異地備份。

if [ $x -eq 0 ] ; then
rsync -azv /var/backup -e ssh root@$IP:~/backup
echo 『Test Only^^ 』 | mail -s 『Backup Succeed』 root
fi


###############################################################


# if [ $x -eq 0 ] ; then
# echo 『Test Only 』 | mail -s 『Backup Succeed』 root
# fi


## result :  nl /var/log/backup/last-backup  = = tar -tvf /backup-full .. .tar | nl
## in other to have /var/log/backup/last-backup file, modify your date to friday first !!




##———————Create-Cron —————-##
## 以下提供兩種方法!
## touch /etc/cron.d/incre-cron 
## echo ’30 18 * * 1-5 root /root/bin/Incremental_backup.sh’  >>  incre-cron

# touch incre-cron
# echo ’30  18  *  *  1-5  root /root/bin/Incremental_backup.sh’ >> incre-cron
# crontab incre-cron
###################################

十二月
07

設定工作排程(cron)將Quota狀態以E-mail寄送到管理者信箱

本次目標為:

  1. 設定一個工作排程(檔名為rep_quota),於禮拜一到禮拜五的晚上,12點30分將Quota的狀態輸出到/root/quota.log裡面和透過E-mail傳送到管理者的信箱(gd9qwq@gmail.com)。
  2. 需使用Shell Script執行此動作,並將程式存放於/root/bin底下,檔名為rep_quota.sh。
  3. 小提示:工作排程需放置於/etc/cron.d目錄底下。

十二月
07

利用 sudo 來賦予使用者管理權限

*利用/etc/pam.d/su組態檔來指定某使用者,切換使用者到Supper User(su)時, 不需輸入密碼。
使用時機:當要讓某使用者去更改系統內的設定時,不需知道root的密碼而切換到root帳戶去做更改。
缺點:由於root身分可以完全的更改系統內的設定,如果使用者變更了root的密碼,那麼會造成原本管理者無法登入。

在第二部分,將會以Supper User do來解決此缺點,這邊會利用賦予使用者管理apache2 Server的所有權限,而不需輸入密碼。
第一部分

由於第五行 auth include common-auth 用於檢查帳戶設定,故需要新增在此設定之上,在此設定之下的話,則無作用。

第二部分:利用sudo更安全的設定。

十二月
07

設定使用者於特定時間禁止登入系統

四、更改pam_time.so設定,讓某個使用者於特定時間內禁止登入系統。

這時我們去設定common-account 使他讀取檢查帳戶時,可以載入pam_time.so這個組態檔。

編輯 /etc/security/time.conf 模組,加入設定值。
接下來使用另外一台電腦進行 遠端登入。

可以發現到設定的使用者會無法在特定時間登入,你也可以嘗試將設定值註解掉,重新登入,以便測試此檔案的作用。

十二月
07

定義使用者,自行更改密碼的設定

三、定義使用者自行更改密碼時,設定最小密碼長度並且不使用密碼強度檢查。

Older posts «

Chan-Will 黑皮的異想世界 is using WP-Gravatar