ขึ้นข้อความ -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 เดียว) ต้องทำแบบนี้

ขั้นตอน

  1. ทุกคนต้องมีบัญชี Microsoft ของตัวเอง

    • ถ้ายังไม่มี ให้สมัครฟรีที่ https://signup.live.com

    • อีเมลที่สมัครสามารถใช้ @outlook.com, @hotmail.com หรืออีเมลส่วนตัว (@gmail.com, @yahoo.com) ก็ได้

  2. เจ้าของแพ็กเกจ (Admin) ล็อกอินเข้า Microsoft Account

  3. ส่งคำเชิญให้คนในครอบครัว

    • กด “เริ่มการแชร์” / “Start sharing”

    • เลือก ส่งคำเชิญทางอีเมล แล้วใส่อีเมลของคนที่ต้องการเชิญ (ต้องเป็นอีเมลที่ผูกกับบัญชี Microsoft ของเขา)

  4. คนที่ถูกเชิญ จะได้รับอีเมลเชิญ

    • กดปุ่ม “ยอมรับ” / “Accept”

    • ล็อกอินด้วยบัญชี Microsoft ของตัวเอง

    • หลังจากนั้น บัญชีของเขาก็จะมีสิทธิ์ใช้ Microsoft 365 เต็มฟีเจอร์ และได้ OneDrive 1TB ส่วนตัว

  5. ทุกคนจะได้สิทธิ์เหมือนกัน

    • ใช้ 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