Wednesday, June 30, 2021

Map drive ubuntu by sshfs

sudo apt-get install sshfs

sudo mkdir /mnt/droplet

sudo sshfs -o allow_other,default_permissions root@xxx.xxx.xxx.xxx:/mnt/droplet /mnt/droplet

sudo sshfs -o allow_other,default_permissions,IdentityFile=~/.ssh/id_rsa root@xxx.xxx.xxx.xxx:/ /mnt/droplet

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04
  • https://blog.inslash.com/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh-5562de89b80b

Set remote ssh by public key authentication on Ubuntu 20.04

  • ประเด็นคือจะใช้ scp ใน shell script โดยใช้ private key ในการ login ssh

Step

  • บนเครื่อง client เราจะสร้าง key ที่ฝั่งนี้นะ

$ ssh-keygen

  • มันจะให้เราตั้งชื่อ key เขงเรา ถ้าไม่ใส่แล้ว enter เราจะได้ private key คือ  id_rsa และ public key คือ  id_rsa.pub

Output

Generating public/private rsa key pair.

Enter file in which to save the key (/your_home/.ssh/id_rsa):

  • ถ้ามันมีไฟล์ชื่อนี้อยู่แล้วมันจะแสดงแบบนี้

Output

/home/your_home/.ssh/id_rsa already exists.

Overwrite (y/n)?

  • ใส่ passphrase อะไรก็ได้ หรือ ไม่ใส่ก็ได้ (ผู้เขียนแนะนำไม่ใส่นะคับ เพราะถ้าใส่แล้ว ก็ต้องใช้ passphrase แทน password อยู่ดี) แล้ว enter ได้เลย

Output

Enter passphrase (empty for no passphrase):

  • ได้ผลลัพธ์แบบนี้คือ เรียบร้อย

Output

Your identification has been saved in /your_home/.ssh/id_rsa

Your public key has been saved in /your_home/.ssh/id_rsa.pub

The key fingerprint is:

SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host

The key's randomart image is:

+---[RSA 3072]----+

|                .|

|               + |

|              +  |

| .           o . |

|o       S   . o  |

| + o. .oo. ..  .o|

|o = oooooEo+ ...o|

|.. o *o+=.*+o....|

|    =+=ooB=o.... |

+----[SHA256]-----+

  • จากนั้น ให้เราทำการ คัดลอกข้อมูลใน id_rsa.pub คัดลอกไปวางไว้ ที่ไฟล์บน server ทำได้ 2 แบบ 
  • แบบแรกด้วย ssh-copy-id

$ ssh-copy-id username@remote_host

  • คำสั่งนี้มันจะทำการคัดลอกข้อมูลใน id_rsa.pub ไปวางในไฟล์ username@remote_host:~/.ssh/authorized_keys
  • แบบสอง manual copy content to server
  • คือให้เราคัดลอกข้อมูลใน  id_rsa.pub  ไปวางที่ไฟล์ authorized_keys บน server ที่เราจะ remote ไป พาธจะอยู่ประมาณนี้ /root/.ssh/authorized_keys หรือ /home/username/.ssh/authorized_keys 
  • ทดสอบที่ฝั่ง client remote โดยใช้ private key

$ ssh -i ~/.ssh/id_rsa username@remote_host

  • หรือเราจะได้ map drive ด้วย private key โดย

$ sudo sshfs -o IdentityFile=~/.ssh/id_rsa username@xxx.xxx.xxx.xxx:/ /mnt/droplet

Add

  • private key (id_rsa) อันนี้เราเอาไปใช้ที่ client เครื่องอื่น ได้เลย โดยไม่ต้องไปสร้าง key สำหรับ client ใหม่ให้เสียเวลา
  • อีกเรื่อง คือ private key default ที่เราสร้างขึ้นโดยไม่ใส่ชื่อ คือ id_rsa (Ubuntu 18.04 client สร้าง)
  • ปกเราจะใช้ ssh remote แบบนี้ ในกรณีใช้ public key authen
$ ssh -i /home/user/.ssh/id_rsa user@remotehost

$ scp -i /home/user/.ssh/id_rsa /localpath/file.txt remoteuser@remotehost:/path/copyto/ 

$s 

  • แต่เราสามารถใช้โดยไม่ต้องระบุ -i ได้เลย
$ ssh user@remotehost

$ scp /localpath/file.txt remoteuser@remotehost:/path/copyto/  

  • เข้าใจว่า เรา login userใหนอยู่มันจะไปหา private key ค่าเริ่มต้น ในที่นี้คือ /home/user/.ssh/id_rsa เลือกใช้ให้อัตโนมัติเลย
  • กรณีที่เราตั้งชื่อ  private key เป็นชื่ออื่นเราต้องใช้ -i ตามด้วยพาธไฟล์ private คือ ด้วยนะ
  • หรือ private key ใช้ชื่อ id_rsa อยู่แต่พาธไฟล์ไม่ได้อยุ่ภายใต้ /home/user/.ssh/ แบบนี้ก็ต้องใช้ option -i ด้วยเหมือนกรณีด้านบน

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04
  • https://blog.inslash.com/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh-5562de89b80b

mysqldump only function , procedure and triggers

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt <database> > outputfile.sql

Example

mysqldump --host=myhost --user=myuser --password=mypass --routines --no-create-info --no-data --no-create-db --skip-opt mydb > mydb.sql

  • ตัวอย่างเราจะได้ triggers + functions + procedures
  • เราจะไม่ได้ structure +  data

Add

  • โดยคอนฟิกเริ่มต้นถ้าเราใช้ mysqldump -u user -p dbname > dbname.sql เราจะได้ structure + data + view + trigger ประมาณนี้ 
  • แต่เราจะไม่ได้ function + procedure ถ้าอยากได้ ต้องใส่ --routines ด้วย

Ref

  • https://www.ducea.com/2007/07/25/dumping-mysql-stored-procedures-functions-and-triggers/
  • https://blogs.reliablepenguin.com/2015/09/17/mysqldump-triggers-only
  • https://mariadb.com/kb/en/mysqldump/
  • https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

How to full remove Mariadb on Ubuntu 20.04 (mariadb.service: Failed with result ...)

  • ประเด็นมีอยู่ว่า ต้องการย้ายฐาน MySQL ขนาดประมาณ 20GB
  • ทดสอบไป เรื่อยๆ จน mysql server พัง start ไม่ขึ้นคับพี่น้อง

$ systemctl status mysql

  • ได้ผลลัพธ์ประมาณนี้

root@Debian9A1:/var/log/mysql# systemctl status mariadb.service ● mariadb.service - MariaDB 10.3.15 database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Mon 2019-07-22 16:28:51 CEST; 24s ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 3987 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exit juil. 22 16:28:51 Debian9A1 systemd[1]: Starting MariaDB 10.3.15 database server... juil. 22 16:28:51 Debian9A1 systemd[1]: mariadb.service: Control process exited, code=exited status juil. 22 16:28:51 Debian9A1 systemd[1]: Failed to start MariaDB 10.3.15 database server. juil. 22 16:28:51 Debian9A1 systemd[1]: mariadb.service: Unit entered failed state. juil. 22 16:28:51 Debian9A1 systemd[1]: mariadb.service: Failed with result 'exit-code'
  • ทดสอบ apt remove mariadb-server แล้ว apt install mariadb-server แล้วก็ยังไม่หาย
  • เหมือนถอนไม่สมบูรณ์
Solved 
apt-get --purge remove "mysql*"
apt-get --purge remove "mariadb*"
apt-get install mariadb-server
Ref
  • https://serverfault.com/questions/976206/mariadb-wont-start-after-fresh-install-no-errors-no-logs

Thursday, June 10, 2021

Update to PHP 7.4 on Ubuntu 18.04

  • list รายการ module php ที่เราใช้งานใน host เรา เพราะการติดตั้ง php ตัวใหม่ เราต้องไล่ติดตั้ง module ที่เราต้องใช้ด้วย ไม่เช่นนั้น ระบบที่เราใช้งานอยู่จะ เอ๋อ

$ sudo dpkg -l | grep php | tee packages-first.txt

  • หรือ ถ้าจะระบุเวอร์ชั่นแบบนี้ก็ได้ในกรณีมีหลายเวอร์ชั่นในเครื่องเดียว

$ sudo dpkg -l | grep php7.2 | tee packages-first.txt

  • จากนั้น update list ซะหน่อย

$ sudo apt-get update 

  • เพิ่ม repository สำหรับ php เวอร์ชั่นใหม่ๆ ซะหน่อย

$ sudo add-apt-repository ppa:ondrej/php

$ sudo apt-get update

  • ติดตั้งเวอร์ชั่นใหม่ได้เลย

$ sudo apt install php7.4 php7.4-common php7.4-cli

  • จากนั้นไล่ติดตั้ง module php ที่เรา list ไว้ในไฟล์ packages-first.txt

$ sudo apt install php7.4-bcmath php7.4-bz2 php7.4-curl php7.4-intl php7.4-mbstring php7.4-mysql php7.4-readline php7.4-xml php7.4-zip php7.4-gd php7.4-gmp

  • ติดตั้งเวอร์ชั่นใหม่เรียบร้อยก็ให้เราเปลี่ยนให้ host เราไปใช้เวอร์ชั่นใหม่โดย

$ sudo a2enmod php7.4

$ sudo a2dismod php7.2

$ sudo update-alternatives --set php /usr/bin/php7.4

$ sudo /etc/init.d/apache2 restart หรือ $ sudo systemctl restart apache2

Ref

  • https://danielbrinneman.com/update-to-php-7-4-on-ubuntu-18-04-on-digital-ocean-for-wordpress/
  • https://ostechnix.com/how-to-switch-between-multiple-php-versions-in-ubuntu/

การ update wordpress แบบ offline

  • ปกติตัว wordpress จะมีการ update หรือ ติดตั้ง plugin โดย FTP
  • บางที Host ก็ไม่เปิด FTP เปิดแต่ SFTP ทำไง

Solved

  • ไปดาวน์โหลดไฟล์ระบบ wordpress จากเว็บเค้ามา ก็จะได้ประมาณ zip มาใช้
  • แตกไฟล์ zip จากให้เราลบ folder wp-content ออก

  • หรือในกรณีเราปรับการแสดงผลวันที่ ในไฟล์  wp-includes\class-wp-locale.php
  • ก็ให้เราลบไฟล์  wp-includes\class-wp-locale.php ที่เราแตกจากไฟล์ zip
  • จากนั้นก็ upload ขึ้นไปทับของเดิมบน host ได้เลย

Note

  • กรณีเราก็ไฟล์ใหนที่ host แล้วไม่อยาก update เราก็ไปลบไฟล์นั้นออกจาก zip ไฟล์ที่เราแตกออกมา ก่อน upload ไปทับ
  • กรณีที่ต้องการ update หรือ install new plugin wordpress แบบ offline ก็ทำแบบเดียวกัน ให้เราไปดาวน์โหลด plugin จะได้ zip แล้วแตกออกจะได้ folder plugin ให้ upload ขึ้นไปวางภายใต้ wp-content/plugins/ ได้เลย update ก็เป็นการทับของเก่า ส่วนติดตั้งก็เป็นการเพิ่ม folder plugin ใหม่เข้าไปในนั้น


Wednesday, June 9, 2021

Error: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.

Error

Error: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.

Solved
  • แก้ไขไฟล์ wp-config.php
  • เพิ่ม ประมาณนี้

define('COOKIE_DOMAIN', $_SERVER['HTTP_HOST'] );

Ref

  • https://wordpress.org/support/topic/error-cookies-are-blocked-or-not-supported-by-your-browser-you-must-enable-coo-10/

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA

  • ได้ error นี้ตอนพยายาม create wildcard certificate ของ letsencrypt ด้วย certbot ใน Ubuntu 18.04

sudo certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d *.example.com

  • ปัญหาคือ certbot client เก่าไปว่างั้น รันดูด้วย $ sudo certbot --version ได้ 0.27 นะ ก็ยังใช้เวอร์ชั่นนี้ไม่ได้
  • จะ apt install certbot ก็เป็น เวอร์ชั่นนี้แหละใหม่สุดว่างั้น

Solved 

  • ใช้ไม่ได้ก็ถอนมันออกก่อน ด้วยคำสั่ง 

$ sudo apt-get remove certbot

  • จากนั้นติดตั้ง certbot ผ่าน snapd (ถ้ามันยังไม่มี snap core มันจะติดตั้งให้อัตโนมัติด้วยคำสั่ง่ด้านล่าง)

$ sudo snap install --classic certbot

  • เพิ่ม environment ให้  certbot โดยสร้างลิ้งไปไว้ใน /usr/bin/

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

  • เราสามารถรัน certbot ได้เลยไม่ต้องใส่พาธเต็ม
  • เช็ค certbot version อีกรอบเราจะได้ certbot 1.0 เลยนะ
$ sudo certbot --version
  • รันคำสั่งสร้าง wildcard cer ได้เลย

sudo certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d *.example.com

จากนั้นมันจะขึ้นให้ตรวจสอบ DSN ของเราจริงป่าว โดยสร้าง TXT Record ใส่ name เป็น _acme-challenge และ ใส่ค่าตามที่มันแสดงใน terminal

Please deploy a DNS TXT record under the name

_acme-challenge.example.com with the following value:

z5MrZ6d-aqFJQRmp_lGi9RTQHPa1aTC9J2O7wDKzp9

Before continuing, verify the record is deployed.

  • รอสัก 10 นาที ค่อยกด Enter  ต่อเพื่อ verify หรือมันจะมี url ตรวจสอบ dns record ว่า txt record เราเพิ่มสำเร็จยัง ถ้ามีแล้วกด Enter
  • หรือเช็ค txt record ใหม่จากเว็บ https://mxtoolbox.com/TXTLookup.aspx ว่า record ใหม่เข้าหรือยัง โดยใส่ค่าค้นหาเป็น _acme-challenge.example.com
  • มันจะสร้าง key ไว้ที่พาธนี้ 

/etc/letsencrypt/live/example.com/fullchain.pem

/etc/letsencrypt/live/example.com/privkey.pem

  • กรณีมันมี certbot ที่สร้างไว้แล้วเช่น มี /etc/letsencrypt/live/example.com folder ตามพาธนี้แล้ว
  • มันจะสร้างพาธใหม่ให้เราประมาณ
  • /etc/letsencrypt/live/example.com-0001 ไล่ตัวเลขไปเรื่อยๆ
  • ซึ่งเราสามารถลบมันออกได้โดย

$ sudo certbot delete --cert-name example.com

  • มันก็จะไปลบ folder นั้นไป แล้วเราค่อยสร้าง cer ใหม่เราก็จะได้ /etc/letsencrypt/live/example.com มาพร้อม cer ใหม่ด้วย ทำให้ไม่ต้องไปแก้ config ใน vhost
  • อายุ cer เค้า 90 วัน เราตั้งค่าให้สร้างใหม่อัตโนมัติโดย

$ sudo crontab -e

0 1 * * * /usr/bin/certbot renew >> /var/log/letsencrypt/renew.log

Ref

  • https://lakin-mohapatra.medium.com/generate-lets-encrypt-free-wildcard-certificate-on-ubuntu-18-dcf26f458e13
  • https://studiesonline.in/setup-and-install-lets-encrypt-wildcard-ssl-on-ubuntu-18-04-20-04/
  • https://certbot.eff.org/lets-encrypt/ubuntubionic-apache

File has unexpected size...Mirror sync in progress?... เมื่อ apt update หรือ apt install

  • Error ประมาณนี้ตอนเราพยายามติดตั้ง package บน Ubuntu 18.04 ของเราใน

oot@8854c7bad7ae:/# apt-get update

Hit:1 http://security-cdn.debian.org/debian-security buster/updates InRelease

Hit:2 http://cdn-fastly.deb.debian.org/debian buster InRelease

Hit:3 http://cdn-fastly.deb.debian.org/debian buster-updates InRelease

Get:4 http://apt.postgresql.org/pub/repos/apt buster-pgdg InRelease [46.2 kB]

Get:5 http://apt.postgresql.org/pub/repos/apt buster-pgdg/main amd64 Packages [138 kB]

Err:5 http://apt.postgresql.org/pub/repos/apt buster-pgdg/main amd64 Packages

  File has unexpected size (137678 != 138126). Mirror sync in progress? [IP: 87.238.57.227 80]

  Hashes of expected file:

   - Filesize:138126 [weak]

   - SHA256:8a5dec4b72ef7e16bb0336a385f5072cb4092d5a935ada6095b5c971a9d3420a

   - SHA1:9d30afef3e3590e5adadabd04845fd547f5f88f7 [weak]

   - MD5Sum:ed36fcbcb7d390b2772bc81a12cf786b [weak]

  Release file created at: Mon, 23 Sep 2019 14:11:10 +0000

Fetched 46.2 kB in 3s (15.7 kB/s)


Err:8 http://ppa.launchpad.net/ondrej/php/ubuntu bionic/main amd64 libapache2-mod-php7.4 amd64 7.4.18-2+ubuntu18.04.1+deb.sury.org+1

  File has unexpected size (969 != 1340244). Mirror sync in progress? [IP: 91.189.95.85 80]

  Hashes of expected file:

   - SHA256:2d0e4a53fef0c187ee445857c18c82e68d35408e482a8ed0d8d54a303543e94d

   - SHA1:89177397ca9971a3451914876d65c62f5ebd0ebf [weak]

   - MD5Sum:3be8c0d74fb1cd2b5974fe02b499fd08 [weak]

   - Filesize:1340244 [weak]

E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php7.4/php7.4-common_7.4.18-2+ubuntu18.04.1+deb.sury.org+1_amd64.deb  File has unexpected size (961 != 927848). Mirror sync in progress? [IP: 91.189.95.85 80]

   Hashes of expected file:

    - SHA256:6580bbf3eab8efc0c0a84fd208af61db440a1014b943768b2f85276652073fc2

    - SHA1:ea4fd0219577a644e33d2bbb2dc605abf3c9df5b [weak]

    - MD5Sum:5184b74d7614d5691eb8a7363f8656af [weak]

    - Filesize:927848 [weak]

  • ค้นหาใน google เค้าแนะนำให้ว่า DNS น่าจะมีปัญหา ให้เปลี่ยนค่า dns ลองดู ก็ยังเป็นเหมือนเดิม
  • ค้นหาใน forum ของ fortigate เจอว่า ติด Policy profile บางตัว

Solved

  • ปัญหาคือ  ของเคสนี้คือ ติด policy ของ Fortigate ต้องหาให้เจอ


  • เคสนี้ติดที่ DLP Sensor profile ตัวนี้
  • ที่ไปตรวจสอบที่ ขาออก ALLOW HTTP-GET, HTTP-POST 2 ตัวนี้พอ
  • ถ้ายังไม่ได้อีกให้ทำที่ ขาเข้าด้วย น่าะจผ่าน