2009年12月26日 星期六

基本網路修改設定

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













2009年12月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

2009年12月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

2009年12月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

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

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

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

於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
###################################



2009年12月7日 星期一

設定工作排程(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目錄底下。






























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

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

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


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









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





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

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


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


編輯 /etc/security/time.conf 模組,加入設定值。



接下來使用另外一台電腦進行 遠端登入。



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

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

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





定義root從tty登入系統

二、利用/etc/securetty定義root可以從哪個tty登入系統
使用時機:當覺得某個tty終端機不安全時,可以設定讓root無法透過此終端機進行連線。














只允許使用root帳戶登入Linux系統

一、除了root以外,其餘使用者無法登入系統。

使用時機:通常用於管理者要新增/移除或者維修系統時。

第一步:編輯 etc/pam.d/login 這個檔案。



可以看到畫紅線的地方,表示在執行時會讀取這個pam_nologin.so組態檔

那這時只要在/etc/新增一個名為 nologin檔案即可產生作用。




這時,使用其他使用者即無法登入。