ขึ้นข้อความ -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
ข้อความนี้:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
💡 หมายเหตุ: ข้อความ warning นี้ไม่กระทบการใช้งานปกติของระบบ แต่แก้ไขแล้วจะไม่ขึ้นทุกครั้งที่เปิด shell
เกิดจาก ระบบไม่รู้จัก locale ที่คุณตั้งค่าไว้ โดยเฉพาะ UTF-8
1. ตรวจสอบ locale ที่ติดตั้ง:
teee@san:~$ locale -a
C
C.utf8
en_US.utf8
POSIX
th_TH.utf8
คุณอาจเห็นรายการเช่น en_US.utf8 หรือ th_TH.utf8
2.ถ้าไม่มี locale ที่ต้องการ ให้ generate:
ตัวอย่างสำหรับ en_US.UTF-8:
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8
3.แก้ไฟล์ environment ของผู้ใช้ (เช่น ~/.bashrc หรือ ~/.profile)
teee@san:~$ export LC_CTYPE=UTF-8
teee@san:~$ export LC_CTYPE=en_US.utf8
teee@san:~$ source ~/.bashrc
teee@san:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
4. Logout/Login อีกครั้ง
การอัปเกรด จาก Debian 12.11 (Bookworm) → Debian 13.0 (Trixie)
การอัปเกรด จาก Debian 12.11 (Bookworm) → Debian 13.0 (Trixie) ทำได้แบบ in-place upgrade (ไม่ต้องลงใหม่)
ขั้นตอนการอัปเกรด Debian 12 → 13
⚠️ ข้อควรระวัง
• ควร backup ข้อมูลและ config สำคัญ (เช่น /etc, /home, ฐานข้อมูล ฯลฯ) ก่อน
• ทำการอัปเกรดผ่าน SSH + tmux/screen เผื่อเน็ตหลุดจะได้ไม่พัง
• ต้องมี free space ใน / และ /boot พอสมควร
1. อัปเดต Debian 12 (Bookworm) ให้ล่าสุดก่อน
sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt –purge autoremove
ตรวจสอบเวอร์ชัน
root@san:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm
ควรขึ้นว่า Debian GNU/Linux 12.11 (bookworm)
2. เปลี่ยน APT sources ไปที่ Trixie
เปิดไฟล์ /etc/apt/sources.list ด้วย editor (เช่น nano)
sudo nano /etc/apt/sources.list
แล้วเปลี่ยนคำว่า bookworm → trixie
#deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
#deb http://deb.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
#deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb http://deb.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
3. อัปเดตแพ็กเกจให้เห็น repo ใหม่
sudo apt update
4. ทำ minimal upgrade
sudo apt upgrade –without-new-pkgs
5. อัปเกรดเต็มระบบเป็น Debian 13
sudo apt full-upgrade
ตรงนี้จะใช้เวลานาน และอาจมี prompt ถามว่าจะเก็บไฟล์ config เดิมหรือใช้ไฟล์ใหม่ (แนะนำกด N เพื่อเก็บ config เดิม เว้นแต่คุณอยาก reset)
6. ล้างของเก่า
sudo apt –purge autoremove
7. รีบูตเครื่อง
sudo reboot
8. ตรวจสอบเวอร์ชันหลังอัปเกรด
lsb_release -a
ควรขึ้นว่า
root@san:/home/teee# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 13 (trixie)
Release: 13
Codename: trixie
แต่ถ้าขึ้น Error
Description: Debian GNU/Linux 13.0 (trixie)
Errors were encountered while processing:
ca-certificates
php-composer-ca-bundle
python3-certifi
python3-requests
freeradius-config
python3-pip
python3-httplib2
ca-certificates-java
python3-reportbug
liblwp-protocol-https-perl
libwww-perl
python3-pip-whl
reportbug
E: Sub-process /usr/bin/dpkg returned an error code (1)
ปัญหานี้เจอบ่อยตอน major upgrade ของ Debian → สาเหตุคือ dependency chain เปลี่ยน / มีไฟล์ค้าง / แพ็กเกจไม่ compatible แบบตรงๆ
root@san:~# dpkg –configure -a
Setting up ca-certificates (20250419) …
Updating certificates in /etc/ssl/certs…
0 added, 0 removed; done.
Setting up php-composer-ca-bundle (1.5.6-1) …
Setting up python3-certifi (2025.1.31+ds-1) …
Setting up python3-requests (2.32.3+dfsg-5) …
Setting up freeradius-config (3.2.7+dfsg-1) …
Installing new version of config file /etc/freeradius/3.0/certs/Makefile …
Installing new version of config file /etc/freeradius/3.0/clients.conf …
Installing new version of config file /etc/freeradius/3.0/mods-available/date …
Installing new version of config file /etc/freeradius/3.0/mods-available/detail …
Installing new version of config file /etc/freeradius/3.0/mods-available/eap …
Installing new version of config file /etc/freeradius/3.0/mods-available/json …
Installing new version of config file /etc/freeradius/3.0/mods-available/ldap …
Installing new version of config file /etc/freeradius/3.0/mods-available/ldap_google …
Installing new version of config file /etc/freeradius/3.0/mods-available/linelog …
Installing new version of config file /etc/freeradius/3.0/mods-available/mschap …
Installing new version of config file /etc/freeradius/3.0/mods-available/python3 …
Installing new version of config file /etc/freeradius/3.0/mods-available/radutmp …
Installing new version of config file /etc/freeradius/3.0/mods-available/rest …
Installing new version of config file /etc/freeradius/3.0/mods-available/smsotp …
Configuration file ‘/etc/freeradius/3.0/mods-available/sql’
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer’s version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** sql (Y/I/N/O/D/Z) [default=N] ? N
Configuration file ‘/etc/freeradius/3.0/radiusd.conf’
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer’s version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
*** radiusd.conf (Y/I/N/O/D/Z) [default=N] ? N
root@san:~# apt -f install
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
The following packages were automatically installed and are no longer required:
icu-devtools libicu-dev libnsl-dev libpthread-stubs0-dev libsub-override-perl libtirpc-dev node-busboy node-end-of-stream node-pump python3-httplib2 python3-pycurl python3-pyparsing
python3-pysimplesoap sgml-base
Use ‘apt autoremove’ to remove them.
0 upgraded, 0 newly installed, 0 to remove and 419 not upgraded.
root@san:~# apt autoremove
root@san:~# sudo apt update
root@san:~# apt list –upgradable
root@san:~# apt upgrade
Aug 18 14:07:33 san apachectl[1755]: apache2: Syntax error on line 146 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/perl.load: Cannot load /usr/lib/apache2/module>
Aug 18 14:07:33 san apachectl[1752]: Action ‘start’ failed.
Aug 18 14:07:33 san apachectl[1752]: The Apache error log may have more information
อันนี้เป็น error ของ Apache2 หลังอัปเกรด Debian → module perl โหลดไม่ได้
ซึ่งหมายถึง ไฟล์ mod_perl.so หายไป หรือไม่ compatible กับ Apache เวอร์ชันใหม่ (เพราะ Debian 13 ใช้ Apache 2.4.62 ขึ้นไป → mod_perl เดิมของ Debian 12 ไม่ใช้ได้แล้ว)
วิธีแก้ปัญหา
1. เช็คว่ามี mod_perl package ติดตั้งอยู่หรือไม่
dpkg -l | grep libapache2-mod-perl2
•ถ้าไม่เจอ → ต้องติดตั้งใหม่
•ถ้ามีแต่ไฟล์ไม่อยู่ → ลอง reinstall
2. ติดตั้งหรือ reinstall mod_perl
sudo apt update
sudo apt install –reinstall libapache2-mod-perl2
3. ถ้ายังมี error → ปิดการโหลด perl module ไปก่อน
sudo a2dismod perl
sudo systemctl restart apache2
Apache จะรันได้ตามปกติ แต่จะ ไม่มี mod_perl (ใช้ CGI/Perl script ไม่ได้)
4. ถ้าต้องการ mod_perl จริง ๆ
•ตรวจสอบ path ของ module:
ls -l /usr/lib/apache2/modules/ | grep perl
•แล้วแก้ไขไฟล์ /etc/apache2/mods-enabled/perl.load ให้ตรงกับไฟล์ที่มีอยู่จริง เช่น:
Apache
LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
(บางเวอร์ชันอาจจะชื่อ mod_perl.c หรือ path ย้าย)
5. Restart Apache อีกครั้ง
sudo systemctl restart apache2
sudo systemctl status apache2
👉 คำถามคือ: ยังต้องใช้ Perl บน Apache อยู่ไหม (เช่นรัน CGI/Perl script)?
•ถ้าไม่ใช้ → แค่ a2dismod perl แล้ว Apache จะกลับมาปกติ
•ถ้ายังใช้ → ต้องลง libapache2-mod-perl2 ใหม่ให้ตรงกับ Debian 13
✅ เสร็จแล้ว คุณจะได้ Debian 13.0 stable (Trixie)
วิธีแชร์การใช้งาน Microsoft 365 Family (O365 Family)
Microsoft 365 Family (O365 Family) เป็นแพ็กเกจสมาชิก Microsoft Office แบบครอบครัวที่เน้นให้ ใช้งานได้หลายคนและหลายอุปกรณ์ โดยจ่ายค่าสมาชิกเพียงครั้งเดียวต่อปี/ต่อเดือน
จุดประสงค์หลักในการใช้งาน
1. ใช้โปรแกรม Office เต็มรูปแบบ
-
Word, Excel, PowerPoint, Outlook, OneNote, Access* และ Publisher* (*เฉพาะ Windows)
-
ไม่ใช่แค่เวอร์ชันเว็บ แต่เป็นเวอร์ชันติดตั้งเต็ม (Full desktop app) ที่ฟีเจอร์ครบกว่า
2. ใช้ได้หลายคนในครอบครัว
-
ใช้ได้สูงสุด 6 คน ต่อหนึ่งสมาชิก
-
แต่ละคนมี บัญชี Microsoft ส่วนตัว แยกกัน (ไม่ปะปนข้อมูล)
3. ใช้ได้หลายอุปกรณ์พร้อมกัน
-
Windows PC, Mac, iPad, iPhone, Android
-
1 คนสามารถลงได้ สูงสุด 5 เครื่อง พร้อมใช้งานได้พร้อมกัน
4. พื้นที่จัดเก็บข้อมูลบนคลาวด์ OneDrive
-
1TB ต่อคน (รวมสูงสุด 6TB ถ้าใช้ครบ 6 คน)
-
เก็บไฟล์, รูป, วิดีโอ และซิงค์ข้ามอุปกรณ์
-
มีฟีเจอร์ Personal Vault (โฟลเดอร์เข้ารหัส) สำหรับเก็บไฟล์สำคัญ
5. ฟีเจอร์เสริมด้านความปลอดภัย
-
OneDrive Ransomware detection & recovery (กู้คืนไฟล์ได้ถ้าโดนมัลแวร์)
-
Password-protected sharing สำหรับไฟล์ที่แชร์ให้คนอื่น
6. ใช้ Outlook Premium features
-
ไม่มีโฆษณาใน Outlook.com
-
สามารถสร้างโดเมนอีเมลส่วนตัว (เช่น yourname@yourdomain.com) ถ้าผูกกับ Microsoft 365
7. อัปเดตฟีเจอร์ใหม่ตลอดเวลา
-
ได้รับการอัปเดตและเวอร์ชันใหม่ล่าสุดของ Office โดยไม่ต้องซื้อใหม่ทุกครั้ง
O365 Family คือแพ็กเกจที่ออกแบบมาเพื่อให้ ครอบครัวหรือกลุ่มเล็กๆ ใช้ Office แบบเต็ม, มีพื้นที่ OneDrive ส่วนตัว, และฟีเจอร์ความปลอดภัย พร้อมใช้ได้หลายอุปกรณ์โดยไม่ต้องซื้อหลายไลเซนส์
ถ้าซื้อ Microsoft 365 Family 1 แพ็กเกจ แล้วชวนคนในครอบครัวมาใช้ด้วย แต่ละคนจะได้บัญชี Microsoft ของตัวเอง ไม่ต้องแชร์รหัสกัน และข้อมูลทุกอย่างจะแยกออกจากกันชัดเจน
ตัวอย่างให้เห็นภาพง่าย ๆ
ถ้าใช้บัญชีเดียวกัน (ไม่แยกบัญชี)
-
ทุกคนจะล็อกอินด้วยอีเมลเดียว เช่น tee@outlook.com
-
ไฟล์ใน OneDrive, ประวัติใน Word, Excel, Outlook จะรวมกันหมด
-
ถ้าคนหนึ่งลบไฟล์ ไฟล์นั้นจะหายของทุกคน
ถ้าใช้แบบแยกบัญชี (ที่ Family ให้มา)
-
แต่ละคนจะมีบัญชีของตัวเอง เช่น
-
tee@outlook.com
-
mom@outlook.com
-
dad@outlook.com
-
-
แต่ละคนได้ 1TB OneDrive ส่วนตัว
-
ไฟล์, อีเมล, ปฏิทิน, การตั้งค่า จะอยู่แยกกัน
-
คนอื่นในครอบครัว ไม่สามารถเห็นหรือแก้ไขไฟล์ของเราได้ เว้นแต่เราแชร์ให้
สรุปคือ Microsoft 365 Family ไม่ได้ให้ทุกคนแชร์บัญชีเดียวกัน แต่ให้สิทธิ์ ใช้งานแพ็กเกจ Office และ OneDrive ในบัญชี Microsoft ส่วนตัวของแต่ละคน ซึ่งปลอดภัยกว่าและเป็นส่วนตัวมากกว่า
ถ้าซื้อ Microsoft 365 Family แล้วอยากให้ แต่ละคนในครอบครัวมีบัญชี Microsoft แยกกัน (ไม่รวมกันเป็น Account เดียว) ต้องทำแบบนี้
ขั้นตอน
-
ทุกคนต้องมีบัญชี Microsoft ของตัวเอง
-
ถ้ายังไม่มี ให้สมัครฟรีที่ https://signup.live.com
-
อีเมลที่สมัครสามารถใช้ @outlook.com, @hotmail.com หรืออีเมลส่วนตัว (@gmail.com, @yahoo.com) ก็ได้
-
-
เจ้าของแพ็กเกจ (Admin) ล็อกอินเข้า Microsoft Account
-
ไปที่หน้า การแชร์สมาชิก: https://account.microsoft.com/services/microsoft365/share
-
-
ส่งคำเชิญให้คนในครอบครัว
-
กด “เริ่มการแชร์” / “Start sharing”
-
เลือก ส่งคำเชิญทางอีเมล แล้วใส่อีเมลของคนที่ต้องการเชิญ (ต้องเป็นอีเมลที่ผูกกับบัญชี Microsoft ของเขา)
-
-
คนที่ถูกเชิญ จะได้รับอีเมลเชิญ
-
กดปุ่ม “ยอมรับ” / “Accept”
-
ล็อกอินด้วยบัญชี Microsoft ของตัวเอง
-
หลังจากนั้น บัญชีของเขาก็จะมีสิทธิ์ใช้ Microsoft 365 เต็มฟีเจอร์ และได้ OneDrive 1TB ส่วนตัว
-
-
ทุกคนจะได้สิทธิ์เหมือนกัน
-
ใช้ Word, Excel, PowerPoint, Outlook แบบเต็ม
-
พื้นที่ OneDrive 1TB แยกกัน
-
ข้อมูลไม่ปะปนกัน เว้นแต่ตั้งใจแชร์ไฟล์
📌 ข้อดีของการแยกบัญชีแบบนี้
- แต่ละคนจัดการไฟล์และอีเมลตัวเองได้อิสระ
- ปลอดภัยกว่าเพราะไม่ต้องแชร์รหัสผ่านกัน
- ลบหรือแก้ไฟล์ของใครก็ไม่กระทบคนอื่น
-
Microsoft O365 อนุญาตการใช้งาน IMAP
1. Login เข้า O365 Microsoft
Microsoft 365 Admin Center portal
เลือกตรง > แสดงข้อมูลทั้งหมด > ข้อมูลประจำตัว
เพิ่มชื่อ App Registration
กด Register > สร้าง Client Credentials
กำหนดระยะเวลาวันหมดอายุของ App Secret. และอย่าลืม Copy เก็บไว้บน Notepad ทั้ง value และ Secret ด้วย
ต่อมาให้ไปเพิ่ม API Permissions ให้กับ App. > Add a permission
อย่าลืมไปเพิ่ม Authentication ว่าต้องการติดต่อกับ IMAP เป็นแบบไหน
ตรง menu Authentication > http://localhost
ในที่นี้จะใช้เป็น Web Auth เปิดไว้สำหรับเขียน App Node.Js เข้าไปติดต่อ
วิธีเพิ่ม Harddisk ให้กับ Linux Guest บน VmWare
วิธีเพิ่ม Harddisk ให้กับ Linux Guest บน VmWare
> Vmware Guest และได้ Edit เพื่อเพิ่ม Harddisk
และตรวจสอบ Harddisk ที่เพิ่มเข้าไปใหม่เจอในระบบหรือไม่ด้วยคำสั่ง lsblk
หากไม่เจอ Harddisk ใหม่ที่เพิ่มเข้ามาให้ใช้คำสั่ง
for host in /sys/class/scsi_host/host*; do
echo “- – -” | sudo tee $host/scan
done
และตรวจสอบใหม่ก็จะเจอ Harddisk ใหม่ที่เพิ่มเข้ามา
นำไปใช้งาน สร้าง Physical Volume (PV) ใหม่
root@oracle:/home/teee# pvcreate /dev/sdb
Physical volume “/dev/sdb” successfully created.
ขยาย Volume Group (VG)
ตรวจสอบก่อนว่าใช้ File System ชนิดไหน
resize2fs(สำหรับ ext4) หรือ xfs_growfs(สำหรับ xfs)
-
ext4: resize2fs สามารถทำแบบ online ได้ ถ้า mount อยู่แล้ว
ติดตั้ง openldap บน ubuntu 24.04
ติดตั้ง OpenLDAP บน Ubuntu 24.04
1: อัปเดตระบบ
root@ldapserv:~# apt update && sudo apt upgrade -y
2: ติดตั้ง OpenLDAP และเครื่องมือที่เกี่ยวข้อง
root@ldapserv:~# apt install slapd ldap-utils -y
ระบบจะติดตั้ง slapd (OpenLDAP server) และ ldap-utils (เครื่องมือ CLI)
>> ใน Ubuntu 24.04 อาจไม่มี prompt ให้กำหนดรหัสผ่านของ admin (cn=admin) ในระหว่างติดตั้ง
Configuring slapd
Please enter the password for the admin entry in your LDAP directory.
Administrator password: xxxxx
Auto Start Service ตอนเปิดเครื่อง
#sudo systemctl enable slapd
3: ตั้งค่ารหัสผ่านสำหรับ LDAP admin ด้วย dpkg-reconfigure
ตั้งค่า config สำหรับ OPENLDAP ใหม่
root@ldapserv:~# dpkg-reconfigure slapd
คำถามที่คุณจะเจอ:
1. Omit OpenLDAP server configuration? → เลือก No
2. DNS domain name: → เช่น example.com
3. Organization name: → เช่น Example Inc
4. Administrator password: → ตั้งรหัสผ่าน
5. Database backend to use: → เลือก MDB (ค่าเริ่มต้น)
6. Remove the database when slapd is purged? → No
7. Move old database? → Yes
หลังจากนั้นระบบจะตั้งค่าฐานข้อมูลให้ใหม่ทั้งหมด
root@ldapserv:~# netstat -lntp
Active Internet connections (only servers)
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 17736/slapd <–OPENLDAP
tcp6 0 0 :::22 :::* LISTEN 823/sshd: /usr/sbin
tcp6 0 0 :::389 :::* LISTEN 17736/slapd
4: ทดสอบ LDAP ด้วย ldapsearch ตัวอย่าง omtel.co.th
การ search ข้อมูลจาก LDAP server เช่น omtelldap.omtel.co.th จำเป็นต้องทราบ:
1.Base DN (จุดเริ่มต้นของ directory tree ที่จะค้นหา เช่น dc=omtel,dc=co,dc=th)
2.Credentials (ถ้าต้อง bind ด้วย user/password)
3.Port ที่ใช้ (ปกติ 389 สำหรับ LDAP หรือ 636 สำหรับ LDAPS)
4.Filter ที่ต้องการค้นหา เช่น (objectClass=person) หรือ (uid=someone)
ldapsearch -x -H ldap://localhost -D “cn=admin,dc=omtel,dc=ltd” -w ‘รหัสผ่าน’ -b “dc=omtel,dc=ltd”
# extended LDIF
#
# LDAPv3
# base <dc=omtel,dc=co,dc=th> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# omtel.co.th
dn: dc=omtel,dc=co,dc=th
objectClass: top
objectClass: dcObject
objectClass: organization
o: omptelldap
dc: omtel
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
แบบนี้ถือว่าสำเร็จแล้ว!
การตอบกลับจาก ldapsearch ของคุณ:
•แสดงว่าเชื่อมต่อกับ LDAP server ได้สำเร็จ (result: 0 Success)
•มีการคืนค่า entry ของ dc=omtel,dc=co,dc=th ได้ 1 รายการ (root entry ของ directory tree)
•ไม่มี error ใด ๆ เช่น invalid credentials หรือ no such object
ขั้นตอนถัดไป (หากต้องการ):
5. หากต้องการ:
•สร้าง OU (organizationalUnit) เช่น People, Groups
•เพิ่มผู้ใช้ เช่น uid=tee,ou=People,…
ให้ใช้ไฟล์ .ldif เช่น:
ตัวอย่าง: add_base.ldif
dn: ou=People,dc=omtel,dc=co,dc=th
objectClass: organizationalUnit
ou: People
dn: uid=tee,ou=People,dc=omtel,dc=co,dc=th
objectClass: inetOrgPerson
cn: Naitinoi Sak
sn: Sak
uid: tee
userPassword: {SSHA} password
root@ldapserv:~# ldapadd -x -D “cn=admin,dc=omtel,dc=co,dc=th” -w ‘LDAP Password’ -f add_base.ldif
adding new entry “ou=People,dc=omtel,dc=co,dc=th”
adding new entry “uid=tee,ou=People,dc=omtel,dc=co,dc=th”
root@ldapserv:/home/teee# cat add_people_ou.ldif
dn: ou=People,dc=omtel,dc=co,dc=th
objectClass: organizationalUnit
ou: People
#ldapadd -x -D “cn=admin,dc=omtel,dc=co,dc=th” -w ‘xxxxPassxxxxx’ -f add_people_ou.ldif
root@ldapserv:/home/teee# cat gen-user.sh
#!/bin/bash
# BASE DN
BASE_DN=”dc=worldinfinity,dc=co,dc=th”
echo “==== สร้าง LDIF สำหรับเพิ่มผู้ใช้ LDAP ====”
read -p “Login (uid): ” LOGIN
read -p “Full Name (ชื่อ-นามสกุล): ” FULLNAME
# แยกชื่อกับนามสกุล
FIRSTNAME=$(echo “$FULLNAME” | cut -d’ ‘ -f1)
LASTNAME=$(echo “$FULLNAME” | cut -d’ ‘ -f2)
read -s -p “Password: ” PASSWORD
echo
# เข้ารหัสรหัสผ่าน
ENCRYPTED_PASS=$(slappasswd -s “$PASSWORD”)
# สร้าง LDIF
LDIF_FILE=”user_${LOGIN}.ldif”
cat < “$LDIF_FILE”
dn: uid=$LOGIN,ou=People,$BASE_DN
objectClass: inetOrgPerson
uid: $LOGIN
cn: $FULLNAME
sn: $LASTNAME
givenName: $FIRSTNAME
userPassword: $ENCRYPTED_PASS
EOF
echo “✅ ไฟล์ LDIF ถูกสร้างแล้ว: $LDIF_FILE”
root@ldapserv:/home/teee# cat list_ldap_users.sh
#!/bin/bash
# LDAP base และข้อมูลการล็อกอิน
BASE_DN=”ou=People,dc=worldinfinity,dc=co,dc=th”
BIND_DN=”cn=admin,dc=worldinfinity,dc=co,dc=th”
read -s -p “กรุณาใส่รหัสผ่านของ LDAP admin: ” LDAP_PASS
echo
echo “📋 รายชื่อผู้ใช้ใน $BASE_DN:”
echo “——————————-”
ldapsearch -x -D “$BIND_DN” -w “$LDAP_PASS” -b “$BASE_DN” “(objectClass=inetOrgPerson)” uid cn sn dn | \
awk ‘
BEGIN { user = “” }
/^dn:/ { if (user != “”) print user; user = $0 }
/^uid:/ { user = user “\n ” $0 }
/^cn:/ { user = user “\n ” $0 }
/^sn:/ { user = user “\n ” $0 }
END { if (user != “”) print user }
‘ | less
root@ldapserv:/home/teee# cat delete_ldap_user.sh
#!/bin/bash
# ฐานข้อมูล LDAP
BASE_DN=”dc=worldinfinity,dc=co,dc=th”
OU=”People”
# Admin DN และรหัสผ่าน
LDAP_ADMIN_DN=”cn=admin,$BASE_DN”
read -s -p “กรุณาใส่รหัสผ่านของ LDAP admin: ” LDAP_ADMIN_PASS
echo
# รับ UID จากผู้ใช้
read -p “กรอก UID ของผู้ใช้ที่ต้องการลบ: ” UID
# DN ที่จะลบ
USER_DN=”uid=$UID,ou=$OU,$BASE_DN”
# ยืนยันการลบ
read -p “คุณแน่ใจหรือไม่ว่าต้องการลบผู้ใช้ $USER_DN ? (y/n): ” CONFIRM
if [[ “$CONFIRM” != “y” ]]; then
echo “❌ ยกเลิกการลบ”
exit 1
fi
# ลบด้วย ldapdelete
ldapdelete -x -D “$LDAP_ADMIN_DN” -w “$LDAP_ADMIN_PASS” “$USER_DN”
# ตรวจสอบสถานะ
if [ $? -eq 0 ]; then
echo “✅ ลบผู้ใช้ $UID สำเร็จแล้ว”
else
echo “❌ ล้มเหลวในการลบผู้ใช้ $UID (อาจไม่มีอยู่จริงหรือรหัสผ่านผิด)”
fi
สามารถ Connect Test จากโปรแกรม LDAP Client Test เช่น
https://jxplorer.org/downloads/users.html
https://sourceforge.net/projects/ldapadmin/files/ldapadmin/1.8.3/
ตัวอย่าง
Ubuntu Netplan 24.04 Example- Proxmox
root@ldapserv:/etc/netplan# nano 50-cloud-init.yaml
network:
version: 2
ethernets:
ens18:
dhcp4: no
addresses:
– 192.168.100.30/24
routes:
– to: default
via: 192.168.100.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
root@ldapserv:/etc/netplan# netplan apply
WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running.
root@ldapserv:/etc/netplan# sudo systemctl status openvswitch-switch
Unit openvswitch-switch.service could not be found.
root@ldapserv:/etc/netplan# apt install openvswitch-switch -y
[*] systemd-logind.service
ตั้งให้เริ่มทำงานอัตโนมัติทุกครั้งที่บูต:
root@ldapserv:/etc/netplan# systemctl enable openvswitch-switch
Synchronizing state of openvswitch-switch.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable openvswitch-switch
ติดตั้ง Kea DHCP Server บนเครื่อง Mac M1 (Apple Silicon) เพื่อแจก DHCP สำหรับเครือข่าย 192.168.1.0/24
teee@NP ~ % brew install kea
ตรวจสอบตำแหน่งไฟล์ config
teee@NP ~ % cd /opt/homebrew/etc/kea/
teee@NP kea % ls
kea-ctrl-agent.conf kea-dhcp-ddns.conf kea-dhcp4.conf kea-dhcp6.conf keactrl.conf
แก้ไขไฟล์ kea-dhcp4.conf
ให้กำหนดการแจก IP สำหรับ subnet 192.168.1.0/24 แบบนี้:
sudo nano /opt/homebrew/etc/kea/kea-dhcp4.conf
ใส่ config (หรือแก้ไขบล็อก subnet4 ให้เหมือนด้านล่าง):
{
“Dhcp4”: {
“interfaces-config”: {
“interfaces”: [ “en0” ] // หรือใส่ชื่อ interface ที่ต้องการ
},
“lease-database”: {
“type”: “memfile”,
“persist”: true,
“name”: “/opt/homebrew/var/kea/kea-leases4.csv”
},
“subnet4”: [
{
“id”: 1,
“subnet”: “192.168.1.0/24”,
“pools”: [
{
“pool”: “192.168.1.100 – 192.168.1.200”
}
],
“option-data”: [
{
“name”: “routers”,
“data”: “192.168.1.1”
},
{
“name”: “subnet-mask”,
“data”: “255.255.255.0”
},
{
“name”: “domain-name-servers”,
“data”: “8.8.8.8, 1.1.1.1”
}
]
}
],
“loggers”: [
{
“name”: “kea-dhcp4”,
“output_options”: [
{
“output”: “/opt/homebrew/var/log/kea/kea-dhcp4.log”
}
],
“severity”: “INFO”
“debuglevel”: 0
}
]
}
}
แก้ “interfaces”: [ “en0” ] ให้ตรงกับชื่อ network interface ของคุณ (รัน ifconfig เพื่อเช็ค เช่น en0, bridge100, หรือ utun0)
สร้างโฟลเดอร์สำหรับ log และ leases ถ้ายังไม่มี
teee@NP kea % sudo mkdir -p /opt/homebrew/var/log/kea
teee@NP kea % sudo mkdir -p /opt/homebrew/var/kea
teee@NP kea % sudo mkdir -p /opt/homebrew/var/kea
teee@NP kea % sudo touch /opt/homebrew/var/kea/kea-leases4.csv
teee@NP kea % sudo chown $(whoami) /opt/homebrew/var/kea/kea-leases4.csv
กำหนด Static IP ให้ Mac (เช่น 192.168.1.1)
ไปที่ System Settings > Network > เลือก interface ที่คุณจะใช้ (เช่น Wi-Fi หรือ USB Ethernet) แล้วตั้งเป็น Manual IP: 192.168.1.1 Subnet: 255.255.255.0
รัน Kea DHCP Server
teee@NP kea % /opt/homebrew/sbin/kea-dhcp4 -c /opt/homebrew/etc/kea/kea-dhcp4.conf
ตรวจสอบ log
teee@NP /opt % tail -f /opt/homebrew/var/log/kea/kea-dhcp4.log
ทดสอบจากอุปกรณ์ลูกข่าย
เชื่อมต่อสาย LAN จาก Mac ไปยังเครื่องลูกข่าย หรือผ่าน Ethernet adapter แล้วให้เครื่องลูกข่ายขอ IP ผ่าน DHCP — จะได้รับ IP ในช่วง 192.168.1.100 – 192.168.1.200
teee@NP kea % sudo /opt/homebrew/sbin/kea-dhcp4 -c /opt/homebrew/etc/kea/kea-dhcp4.conf
2025-05-19 13:13:04.137 INFO [kea-dhcp4.dhcp4/8221.0x208ce1f00] DHCP4_STARTING Kea DHCPv4 server version 2.6.2 (stable) starting
2025-05-19 13:13:04.140 INFO [kea-dhcp4.commands/8221.0x208ce1f00] COMMAND_RECEIVED Received command ‘config-set’
แปลว่า Kea DHCPv4 server ได้เริ่มต้นทำงานเรียบร้อยแล้วโดยไม่มี error
teee@NP /opt % sudo lsof -iUDP:67
Password:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kea-dhcp4 8221 root 12u IPv4 0x76203903121f674e 0t0 UDP 10.10.1.113:bootps
bootps = UDP/67 (DHCP Server)
วิธีการ STOP KEA
teee@NP /opt % ps aux | grep kea-dhcp4
teee 8652 0.0 0.0 410732512 1488 s000 S+ 1:20PM 0:00.01 grep kea-dhcp4
root 8221 0.0 0.1 410778736 6144 ?? S 1:13PM 0:00.09 /opt/homebrew/sbin/kea-dhcp4 -c /opt/homebrew/etc/kea/kea-dhcp4.conf
root 8220 0.0 0.0 410886720 3664 ?? S 1:13PM 0:00.02 sudo /opt/homebrew/sbin/kea-dhcp4 -c /opt/homebrew/etc/kea/kea-dhcp4.conf
Kill ด้วย PID:
teee@NP /opt % sudo kill 8221
teee@NP /opt % ps aux | grep kea-dhcp4
teee 8682 0.0 0.0 410724320 1392 s000 S+ 1:22PM 0:00.00 grep kea-dhcp4
tftpd on macbook m1
Check tftpd running
teee@NP ~ % netstat -na |grep \*.69
teee@NP ~ % apropos tftp
makewhatis: /opt/local/man: Not a directory
tftp(1) – trivial file transfer program
tftpd(8) – Internet Trivial File Transfer Protocol server
CURLOPT_TFTP_BLKSIZE(3) – TFTP block size
CURLOPT_TFTP_NO_OPTIONS(3) – send no TFTP options requests
tftp(1) – trivial file transfer program
tftpd(8) – Internet Trivial File Transfer Protocol server
Start tftpd
teee@NP ~ % sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
Check tftpd start
teee@NP ~ % netstat -na |grep \*.69
udp4 0 0 *.69 *.*
udp6 0 0 *.69 *.*
Symlink the tftpboot folder
teee@NP ~ % cd /private
teee@NP /private % sudo rm -rf tftpboot
teee@NP / % mkdir /Users/teee/tftpboot
teee@NP / % sudo ln -s /Users/teee/tftpboot tftpboot
teee@NP / % sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist
teee@NP / % sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
Copy file into position
teee@NP / % cd /Users/teee/tftpboot
Stop tftpd
teee@NP ~ % sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist
teee@NP ~ % netstat -na |grep \*.69
Linux ค้นหาไฟล์ที่เก่ากว่า 30 วันให้ลบออก
ใน Linux สามารถใช้คำสั่ง find เพื่อค้นหาและลบไฟล์ที่ เก่ากว่า 1 เดือน ได้ตามนี้
คำสั่ง:-
#find /path/to/folder -type f -mtime +30 -exec rm -f {} \;
/path/to/folder = โฟลเดอร์ที่คุณต้องการค้นหา (เช่น /var/log หรือ /mnt/backup)
-type f = เลือกเฉพาะไฟล์ (ไม่รวมโฟลเดอร์)
-mtime +30 = ไฟล์ที่ ถูกแก้ไขครั้งสุดท้ายมากกว่า 30 วัน (ประมาณ 1 เดือน)
-exec rm -f {} \; = ลบไฟล์ที่เจอทันที
ถ้าต้องการแค่ดูรายการไฟล์ (ไม่ลบ):
#find /path/to/folder -type f -mtime +30