學生繳交作業

每次平時或到學期末要收學生的作品時,總有些困擾,無法很方便收到學生的作品,用來打分數,對於這一項的要求是:
1. 每個學生有自己存放的目錄
2. 學生不能切換到其他人的目錄
3. 老師可以切換到所有的目錄,擁有管理的權限

底下利用 Linux+ACL+Samba 來完成[@more@]1. 先從校務行政系統中,取得學生的基本資料,包括:班級、座號、姓名、學號
# cat Class61.lst
六忠 01 莊☆★ s0950171
六忠 02 甘★★ s0950015
六忠 03 李☆☆ s0950027

2. 修改 /home 的掛載參數
# grep /home /etc/fstab
UUID=f1f3d674-6bdd-4132-bc9f-bf6c3f8ac3bc /home                   ext4    defaults,usrquota,acl,user_xattr        1 2

3. 重新掛載 /home
# mount -v -o remount,rw,usrquota,acl,user_xattr /home

4. 建立 Script 檔
# vim mkuserhomeworkdir.awk
# 建立目錄
{print “/bin/mkdir -m 700 -p /home/homework/”$1″/”$2″_”$3″” }
# 更改檔案目錄的所屬擁有者及群組
{print “chown -R  “$4″:s0950 /home/homework/”$1″/”$2″_”$3″” }

5. 測試一下
# awk -f mkuserhomeworkdir.awk Class61.lst | more
/bin/mkdir -m 700 -p /home/homework/六忠/01_莊☆★
chown -R  s0950171:s0950 /home/homework/六忠/01_莊☆★
/bin/mkdir -m 700 -p /home/homework/六忠/02_甘★★
chown -R  s0950015:s0950 /home/homework/六忠/02_甘★★
/bin/mkdir -m 700 -p /home/homework/六忠/03_李☆☆
chown -R  s0950507:s0950 /home/homework/六忠/03_李☆☆

6. 動工
# awk -f mkuserhomeworkdir.awk Class61.lst | sh

7. 讓老師擁有管理權限 teacher 是老師的帳號
# setfacl -R -m user:teacher:rwx /home/homework/六忠

Samba 網路硬碟不顯示隱藏檔

學生上電腦課時,是使用 Samba Server 來儲存資料,使用者登入之後可以很方便在任何一台電腦存取到自己的檔案。
今天發現學生開啟家目錄後,會顯示一些在 Linux 是隱藏檔的檔案。

為了避免造成學生的困擾,所以做了以下的調整。[@more@]1. 修改 Samba Server 設定檔,以 CentOS 6.x 為例
# vim /etc/samba/smb.conf
[homes]
        comment = Home Directories
        browseable = no
        writable = yes
        valid users = %S
        create mode = 0664
        directory mode = 0775
        veto files=/.*/

加入 veto files=/.*/ 這一行設定

2. 重新啟動 Samba Server
# service nmb restart
正在停止 NMB 服務:                                        [  確定  ]
正在啟動 NMB 服務:                                        [  確定  ]
# service smb restart
正在停止 SMB 服務:                                        [  確定  ]
正在啟動 SMB 服務:                                        [  確定  ]

3. 重新整理後,隱藏檔的部分就不見了!

Moodle 使用 LDAP Server 做帳號認證

1. 選擇 系統管理的 網站管理
[@more@]

2. 選擇 進階外掛身份認證

3. 選擇 管理身份認證

4. 找到 LDAP 的選項,然後按 啟用圖示

5. 選擇 設定

6. 輸入 主機網址
             可區辨的名稱
             密碼

7. 輸入 用戶類型
            情境

8.選擇 密碼格式

9. 最後 儲存變更

10. 在另外一台電腦,或用不同的瀏覽器,連線到 Moodle,選擇 登入

11. 輸入帳號及密碼後,按 登入

12. 已登入成功,但有些資料須做設定

也可以在 對應資料中直接做對應,這樣使用者第一次登入時,就會自動把資料對應出來

建立大批 PureFTPd FTP Server 的 MySQL 帳號

利用 awk 的功能方便可以大批產生 PureFTPd FTP Server 的 MySQL 帳號的 MySQL 語法和自動建立使用者目錄及改變目錄群組及擁有者的語法。

虛擬使用者的 UID 500
# grep virtualuser /etc/passwd
virtualuser:x:500:500::/home/virtualuser:/sbin/nologin

虛擬群組的 GID 500
# grep virtualgrp /etc/group
virtualgrp:x:500:

虛擬使用者的帳號及密碼資料
# cat 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990
[@more@]建立 MySQL 虛擬使用者的 SQL 資料
# vim mksql.awk
# 帳號密碼檔格式
# 四忠 01 蔡中火 s0990499 123456 s0990
{print “insert into users values (‘”$4″‘,'”$5″‘,’500′,’500’,’/home/”$6″/”$4″‘);”

測試
# awk -f mksql.awk 102_class41.lst > 102_class41.sql
insert into users values (‘s0990499′,’123456′,’500′,’500′,’/home/s0990/s0990499’);
insert into users values (‘s0990999′,’234567′,’500′,’500′,’/home/s0990/s0990999’);

使用方式
# /usr/bin/mysql -u root -p pure-ftpd < 102_class41.sql

建立使用者虛擬目錄
# vim mkuserdir.awk
# 建立使用者目錄
{print “mkdir -p /home/”$6″/”$4 }
# 更改檔案目錄的所屬擁有者及群組
{print “chown -R  500:500  /home/”$6″/”$4″ ” }

測試
# awk -f mkuserdir.awk 102_class41.lst
mkdir -p /home/s0990/s0990499
chown -R  500:500  /home/s0990/s0990499
mkdir -p /home/s0990/s0990999
chown -R  500:500  /home/s0990/s0990999

使用方式
# awk -f mkuserdir.awk 102_class41.lst  | sh

驗證目錄是否有建立
# ls -l /home/s0990/
drwxr-xr-x. 2 virtualuser virtualgrp 4096 2014-01-02 10:58 s0990499/
drwxr-xr-x. 2 virtualuser virtualgrp 4096 2014-01-02 10:58 s0990999/

Pure-FTPd FTP Server 使用 MySQL 虛擬帳號

Pure-FTPd FTP Server 也可以搭配 MySQL 的虛擬帳號來登入
首先安裝 MySQL Server
# yum install mysql mysql-server

啟動 MySQL Server
# service mysqld start

設定 MySQL Server
# /usr/bin/mysql_secure_installation[@more@]設定 Pure-FTPd FTP Server
# vim /etc/pure-ftpd/pure-ftpd.conf
# MySQL configuration file (see README.MySQL)
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf

設定 Pure-FTPd FTP Server 的 MySQL 設定檔
# vim /etc/pure-ftpd/pureftpd-mysql.conf
# Optional : define the location of mysql.sock if the server runs on this host.
# MySQL Socket 檔路徑
MYSQLSocket     /var/lib/mysql/mysql.sock

# Mandatory : user to bind the server as.
# MySQL 管理者
MYSQLUser       root

# Mandatory : user password. You must have a password.
# MySQL 管理者密碼
MYSQLPassword   rootpw

# Mandatory : database to open.
# Pure-FTPd 要用的資料庫檔名
MYSQLDatabase   pureftpd

# Mandatory : how passwords are stored
# Valid values are : “cleartext”, “crypt”, “md5” and “password”
# (“password” = MySQL password() function)
# You can also use “any” to try “crypt”, “md5” *and* “password”
# 密碼編碼的方式,可以使用 cleartext 明碼 / md5 使用 MD5 編碼加密  / crypt 用 DES 編碼加密 / password MySQL 的編碼加密
MYSQLCrypt      cleartext

# Query to execute in order to fetch the password
# 虛擬帳號符合 User 欄位時,選取登入者的密碼欄位
MYSQLGetPW      SELECT Password FROM users WHERE User=’L’

# Query to execute in order to fetch the system user name or uid
# 當虛擬帳號符合 User 欄位時,選取登入者的使用者 ID
MYSQLGetUID     SELECT Uid FROM users WHERE User=’L’

# Optional : default UID – if set this overrides MYSQLGetUID

#MYSQLDefaultUID 500

# Query to execute in order to fetch the system user group or gid
# 當虛擬帳號符合 User 欄位時,選取登入者的群組 ID
MYSQLGetGID     SELECT Gid FROM users WHERE User=’L’

# Optional : default GID – if set this overrides MYSQLGetGID
# 內定的群組 GID
#MYSQLDefaultGID 500

# Query to execute in order to fetch the home directory
# 當虛擬帳號符合 User 欄位時,選取登入者的家目錄
MYSQLGetDir     SELECT Dir FROM users WHERE User=’L’

重新啟動 Pure-FTPd FTP Server
# /etc/init.d/pure-ftpd restart

建立資料庫
# vim  /root/pureftpd.sql
CREATE TABLE users (
  User VARCHAR(16) BINARY NOT NULL,
  Password VARCHAR(64) BINARY NOT NULL,
  Uid INT(11) NOT NULL default ‘-1’,
  Gid INT(11) NOT NULL default ‘-1’,
  Dir VARCHAR(128) BINARY NOT NULL,
  PRIMARY KEY  (User)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert into users values (‘u0910001′,’abCxyZ’,’500′,’500′,’/home/virtualuser/u0910001′);
insert into users values (‘u0910002′,’QazXsw’,’500′,’500′,’/home/virtualuser/u0910002′);

# /usr/bin/mysqladmin -u root -p create pureftpd
# /usr/bin/mysql -u root -p pureftpd < /root/pureftpd.sql

測試
# mkdir -p /home/virtualuser/{u0910001,u0910002}
# chown -R virtualuser:virtualgrp /home/virtualuser/{u0910001,u0910002}

# lftp -u u0910001 192.168.154.167
密碼:
lftp u0910001@192.168.154.167:~> ls -l
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:17 .
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:17 ..
lftp u0910001@192.168.154.167:/>

如果系統有使用 SELinux,要記得把家目錄的功能打開
# setsebool -P ftp_home_dir 1
# setsebool -P allow_ftpd_full_access=1

更複雜的設定
CREATE DATABASE pure-ftpd;
CREATE TABLE `users` (
`id` int(32) unsigned NOT NULL auto_increment,
`User` varchar(16) NOT NULL default ”,
`Password` varchar(64) NOT NULL default ”,
`Uid` varchar(11) NOT NULL default ‘-1’,
`Gid` varchar(11) NOT NULL default ‘-1’,
`Dir` varchar(128) NOT NULL default ”,
`QuotaSize` smallint(5) NOT NULL default ‘0’,
`QuotaFiles` int(11) NOT NULL default ‘0’,
`ULBandwidth` smallint(5) NOT NULL default ‘0’,
`DLBandwidth` smallint(5) NOT NULL default ‘0’,
`ULRatio` smallint(6) NOT NULL default ‘0’,
`DLRatio` smallint(6) NOT NULL default ‘0’,
`comment` tinytext NOT NULL,
`ipaccess` varchar(15) NOT NULL default ‘*’,
`status` enum(‘0′,’1’) NOT NULL default ‘0’,
`create_date` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`modify_date` datetime NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (`id`,`User`),
UNIQUE KEY `User` (`User`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

Pure-FTPd FTP Server 使用虛擬帳號登入

修改 /etc/pure-ftpd/pure-ftpd.conf 設定檔
# vim /etc/pure-ftpd/pure-ftpd.conf
# PureDB user database (see README.Virtual-Users)
PureDB /etc/pure-ftpd/pureftpd.pdb
# Automatically create home directories if they are missing
CreateHomeDir yes

重新啟動 Pure-FTPd FTP Server
# /etc/init.d/pure-ftpd restart
Stopping pure-ftpd:                                        [  OK  ]
Starting pure-ftpd:                                        [  OK  ]
[@more@]
新增虛擬群組及使用者
# groupadd virtualgrp
# useradd -d /home/virtualuser -g virtualgrp -s /sbin/nologin virtualuser

新增 s0990001 使用者,並設定 s0990001 使用者的密碼
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001
Password:
Enter it again:

密碼檔位置
# ls -l /etc/pure-ftpd/pureftpd.passwd
-rw——-. 1 root root 95 Jan 1 23:41 /etc/pure-ftpd/pureftpd.passwd

建立認證資料庫
建立認證資料庫 /etc/pure-ftpd/pureftpd.pdb
# /usr/bin/pure-pw mkdb

上面二個步驟,也可以用下面的指令一行完成
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001 -m

如果系統沒有自動建立使用者的家目錄,必須要手動建立
# mkdir /home/virtualuser/s0990001
# chown -R virtualuser:virtualgrp /home/virtualuser/s0990001

如果系統有使用 SELinux,要記得把家目錄的功能打開
# setsebool -P ftp_home_dir 1
# setsebool -P allow_ftpd_full_access=1

# 修改 s0990001 這一個使用者,下載最大頻寬 50kb,只能在 0800-1600 連線,ip 連線範圍 192.168.250.0/24,140.111.74.0/24
# /usr/bin/pure-pw usermod s0990001 -t 50 -z 0800-1600 -r 192.168.250.0/24,140.111.74.0/24 -m

也可以在建立使用者時就先限定
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001 -t 50 -z 0800-1600 -r 192.168.250.0/24,140.111.74.0/24 -m

# 顯示 s0990001 使用者的狀況
# /usr/bin/pure-pw show s0990001

# 修改 s0990001 使用者的密碼
# /usr/bin/pure-pw passwd s0990001 -m

# 刪除 s0990001 使用者
# /usr/bin/pure-pw userdel s0990001 -m

# 列出所有的虛擬帳號使用者
# /usr/bin/pure-pw list

更詳細的 pure-pw 用法
# /usr/bin/pure-pw –help

Usage :

pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

pure-pw usermod <login> -f <passwd file> -u <uid> [-g <gid>]
-D/-d <home directory> -[c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

pure-pw userdel <login> [-f <passwd file>] [-m]

pure-pw passwd <login> [-f <passwd file>] [-m]

pure-pw show <login> [-f <passwd file>]

pure-pw mkdb [<puredb database file> [-f <passwd file>]]

pure-pw list [-f <passwd file>]

-d <home directory> : chroot user (recommended)
-D <home directory> : don’t chroot user
-<option> ” : set this option to unlimited
-m : also update the /etc/pure-ftpd/pureftpd.pdb database
For a 1:10 ratio, use -q 1 -Q 10
To allow access only between 9 am and 6 pm, use -z 0900-1800

參數說明:
-t :限制下載頻寬
-T :限制上傳頻寬
-q :限制上傳比率
-Q :限制下載比率
-r :限定能連線的 IP 範圍(遠端)
-R :限制不能連線的 IP 範圍(遠端)
-n :限定最多的檔案數
-N :限制檔案的大小
-z :限制連線的時間
-i :限制本地端的 IP 可以連線範圍
-I :限制本地端的 IP 不可以連線的範圍

產生大量的學生的 Moodle 帳號

為了方便學生使用 Moodle,所以除了可以使用 LDAP 做帳號的認證外,也可以採用一次匯入的方式來處理。
學生的帳號
# head -2 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990

在 Moodle 中,大批匯入帳號,有固定的格式,有固定的格式用 awk 就是很方便的處理方式
[@more@]# vim mkmoodleuser.awk
# 帳號密碼檔格式
# 一忠 1 林○○   s0990001 NHw113 s0990

{print $4″,”$4″,”$1$2$3″,”$4″@tces.ilc.edu.tw,”$5 }

大批產生 Moodle 帳號
# awk -f mkmoodleuser.awk 102_class41.lst
s0990499,s0990499,四忠01蔡中火,s0990499@tces.ilc.edu.tw,123456
s0990999,s0990999,四忠02陳大水,s0990999@tces.ilc.edu.tw,234567

如果產生的格式沒問題,導引到輸出檔
# awk -f mkmoodleuser.awk 102_class41.lst > MoodleUser.txt

大在檔案的上面加上一行,變成
# cat MoodleUser.txt
username,firstname,lastname,email,password
s0990499,s0990499,四忠01蔡中火,s0990499@tces.ilc.edu.tw,123456
s0990999,s0990999,四忠02陳大水,s0990999@tces.ilc.edu.tw,234567

在 Moodle 中匯入
1. 首頁 / 網站管理 / 用戶 / 帳戶

2. 上傳使用者

3.  將使用者檔案拉到上傳使用者的框框,也可以用 選擇一個檔案的方式,來指定檔案
 

4.  預覽上的使用者帳號

5. 按 上傳使用者

6. 如果密碼過於簡單,或是不符 Moodle 的規定時,要出現警告

7. 過於簡單的密碼,登入之後,系統會要求一定要更改密碼

大批產生學生帳號的 LDIF 格式檔

每學年初都會由校務行政系統由擷取新的學生資料,並搭配亂數密碼,使用 awk 來大批產生學生帳號,在建立學生帳號時,可以建立硬碟容量限制 Quota、建立 Samba 密碼、建立學生個人網頁、設定帳號使用期限、初始化個人目錄設定…….等等,一些瑣碎的事都可以一個步驟完成。
在處理 Open LDAP Server 時,也想要利用這樣的方式來處理這個部份,稍微試了一下,看起來應該是沒有太大的問題。
底下是實驗的學生資料,以 csv 格式,每個學生一列資料,以空格當做欄位間隔
欄位分別是 班級 座號 姓名 帳號 密碼 群組
# head -2 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990[@more@]建立 LDAP 密碼檔
# vim mkldifpw.awk
# 產生密碼
{print “slappasswd -s “$5 }

測試
# awk -f mkldifpw.awk 102_class41.lst | sh
{SSHA}CmIwt8puhug01FSBsdqVSpQgMkkuuQWv
{SSHA}9sgDt6+WDZG4y9nZasVL5jRgpbkMq3AU

輸出成密碼檔
# awk -f mkldifpw.awk 102_class41.lst | sh > /root/102_class41_ldifpw.lst

把 102_class41.lst 和 102_class41_ldifpw.lst 組合起來
# paste -d ” ” 102_class41.lst 102_class41_ldifpw.lst > 102_class41_ldap.lst
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
四忠 02 陳大水 s0990999 234567 s0990  {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr

建立產生 ldif 的 awk 檔
# vim mkldif.awk
# 帳號密碼檔格式
四忠 01 蔡中火 s0990499 123456 s0990 {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN

{print “dn: uid=”$4″,ou=”$6″,ou=Student,dc=ldap,dc=tces.ilc.edu.tw” }
{print “uid: “$4 }
{print “cn: “$1$2$3 }
{print “sn: “$1$2$3 }
{print “mail: “$4″@tces.ilc.edu.tw” }
{print “objectClass: person” }
{print “objectClass: organizationalPerson” }
{print “objectClass: inetOrgPerson” }
{print “objectClass: posixAccount” }
{print “objectClass: top” }
{print “userPassword: “$7 }
{print “loginShell: /sbin/nologin” }
{print “uidNumber: 500” }
{print “gidNumber: 500” }
{print “homeDirectory: /home/”$6″/”$4 }
{print “gecos: “$1$2$3 }
{print “” }

測試一下
# awk -f mkldif.awk 102_class41_ldap.lst
dn: uid=s0990499,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990499
cn: 四忠01蔡中火
sn: 四忠01蔡中火
mail: s0990499@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990499
gecos: 四忠01蔡中火

dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

最後可能比較麻煩的是 uidNumber 的部份,因為 uidNumber 是建立帳號時,系統依帳號的使用而自動編號產生的,當然也可以在建立學生帳號時,直接指定使用者的 uidNumber
# useradd
-u, –uid UID                 user ID of the new account

凍結學生帳號

六年級學生畢業後,學生帳號原先就會直接刪除,但考慮到一些因素,所以決定先凍結一段時間,再行刪除。
底下是操作步驟:
1. 首先先取出要凍結的帳號(凍結 s0910 開頭的帳號)
# grep s0910 /etc/passwd > /tmp/lockuser[@more@]2. 利用下列的 Script 凍結

# cat lockuser.sh
#! /bin/bash

shopt -s -o nounset

ACTfile=${1:?’錯誤! 請提供帳號檔!’}
[ ! -f “$ACTfile” ] && echo “帳號檔 $ACTfile 不存在.” && exit 1

declare -i okdel=0
act=”
TMP=$(mktemp /tmp/menu.XXXXXX)
  awk ‘BEGIN{FS=” “}{print $1}’ $ACTfile > $TMP

#
# 主程式區
#
  while read act
  do
      passwd -l $act
          if [ $? -eq 0 ]; then
                 ((okdel++))
         echo “已鎖定帳號 $act ….”
          fi
  done < $TMP
  [ -f “$TMP” ] && rm -f $TMP
  echo “共鎖定了 $okdel 個帳號.”

執行方式
# sh lockuser.sh /tmp/lockuser
3.操作過程
鎖定使用者 s0910181 的密碼。
passwd: 成功
已鎖定帳號 s0910181 ….
鎖定使用者 s0910232 的密碼。
passwd: 成功
已鎖定帳號 s0910232 ….
共鎖定了 370 個帳號.

要直接刪除使用也是可以,只要把 passwd -l 改成 userdel -r 即可!