在 MySQL 指令列模式下不輸入帳號密碼直接登入伺服器

在指令列模式下使用 mysql 指令登入伺服器時,正常情況下需要輸入帳號密碼進行登入,在安全考量上是很合情合理的事情;但是如果頻繁的進行相關作業(例如使用 mysqldump 個別匯出不同資料庫時),每一次都要輸入帳號密碼,會是一件令人困擾的事情。雖然在複製貼上的方法的情況下參數後面接上帳號與密碼就可以只輸入一次,但這種方式會讓帳號密碼曝光在 process monitor;在這種情況下,我們可以直接在家目錄建立一個 .my.cnf 檔進行一次性設定,之後無須輸入帳號密碼就可以登入伺服器。

[mysql]
user = calos
password = 123456

[mysqldump]
user = calos3257
password = 123456

其中,[mysql] 這一節的設定是用在使用 mysql 指令,而 [mysqldump] 則是在使用 mysqldump 時使用的。更多的設定可以參考 MySQL 官方說明文件

如果是將設定檔置於多人共用伺服器時,基於安全性考量,建議在作業完成後移除設定檔,或是使用 GnuPG 這類加密工具將設定檔進行加密,需要使用時再進行解密。


References:

發表留言

使用 GnuPG 對檔案加密與解密

使用多人共用的伺服器時不應該將機敏性檔案長置在上面,但是每次需要使用時都要重新上傳的話又有點麻煩。如果需要多次使用機敏性檔案,將檔案加密後供日後使用不失為一個好方法。能夠實現的工具非常多種,這邊使用 GnuPG 作為例子。

安裝

GnuPG 在 Ubuntu 為預設安裝,如果未安裝的話執行以下安裝指令即可。

sudo apt install gnupg -y

加密

使用 gpg -c 進行加密,會跳出提示輸入密碼

# 新增一個文字檔
echo 'caloskao.org' > my-file.txt

# 對文字檔加密
gpg -c my-file.txt
gpg: gpg-agent is not available in this session
Enter passphrase:

輸入兩次密碼後會產生額外一個加密後的檔案,檔名以 .gpg 結尾

-rw-rw-r--  1 calos calos  13 2019-09-17 11:05:02 my-file.txt
-rw-rw-r--  1 calos calos  94 2019-09-17 11:05:12 my-file.txt.gpg

解密

使用 gpg -d 進行解密

gpg -d my-file.txt.gpg
gpg: AES encrypted data
gpg: gpg-agent is not available in this session
Enter passphrase:

解密完成後會提示檔案已解密,並顯示解密後的檔案內容

gpg: encrypted with 1 passphrase
caloskao.org

可以搭配參數 -o 直接將解密後的內容輸出至檔案

gpg -o my-file.txt.decryped my-file.txt.gpg
gpg: AES encrypted data
gpg: gpg-agent is not available in this session
gpg: encrypted with 1 passphrase
cat my-file.txt.decryped
caloskao.org

參數 -c-d對稱式加解密,如需追求更強的加密強度,請使用 非對稱式加密(亦稱為公開金鑰加密)。


References:

發表留言

WSL Ubuntu 透過 APT 安裝軟體時出現 IPC connect call failed 與 NO_PUBKEY

安裝 MariaDB 時,官方貼心的提供了一個 Repository Configuration Tool,可以選好自己的作業系統與想要安裝的發行版後產生相對應的指令碼,直接複製貼上就可以透過套件管理員進行安裝。

這兩天在摸索 WSL (Windows Subsystem Linux),使用的發行版是 Ubuntu,而今天在 WLS 內安裝 MariaDB 10.4 時卻出現一些錯誤:

sudo apt-get install software-properties-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
software-properties-common is already the newest version (0.96.24.32.9).
The following packages were automatically installed and are no longer required:
  gyp javascript-common libhttp-parser2.7.1 libjs-async libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libuv1-dev nodejs-doc
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 21 not upgraded.

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
Executing: /tmp/apt-key-gpghome.jVRLtzEDLC/gpg.1.sh --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
gpg: connecting dirmngr at '/tmp/apt-key-gpghome.jVRLtzEDLC/S.dirmngr' failed: IPC connect call failed
gpg: keyserver receive failed: No dirmngr

sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic main'
Hit:1 http://free.nchc.org.tw/ubuntu bionic InRelease
Hit:2 http://free.nchc.org.tw/ubuntu bionic-updates InRelease
Get:3 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic InRelease [3901 B]
Hit:4 https://deb.nodesource.com/node_10.x bionic InRelease
Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease
Err:3 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1656F24C74CD1D8
Reading package lists... Done
W: GPG error: http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1656F24C74CD1D8
E: The repository 'http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

有兩個關鍵字:

  1. IPC connect call failed (Line 12)
  2. NO_PUBKEY (Line 25)

找了一下,發現是 WSL 自己的問題,跟 Ubuntu 沒有太大的關係;開發者 Ghost 表示是 WSL 下的 Ubuntu Bionic 第一版的問題,改用 curl 去把 key 抓下來後透過 sudo apt-key add 就可以解決:

It’s Bugging Since The First Bionics in wsl. But the temporary to pass this problems is using apt-key add instead adv options through wget or curl :
curl -sL “http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF” | sudo apt-key add

但是在 issue closed 後隔沒幾天有其他人表示說問題依然存在,並沒有被解決,最後發現只是各個軟體的 key 不一樣而已,開發者 foxliu 提醒依照安裝軟體的不同,要自己更換 key,以 MariaDB 來說,官方提供的 key 為 0xF1656F24C74CD1D8, 所以把指令改成這樣就好:

curl -sL "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xF1656F24C74CD1D8" | sudo apt-key add
OK

最後重新執行一次 sudo apt update,就可以把套件資訊抓回來了。

sudo apt update
Hit:1 http://free.nchc.org.tw/ubuntu bionic InRelease
Hit:2 http://free.nchc.org.tw/ubuntu bionic-updates InRelease
Hit:3 https://deb.nodesource.com/node_10.x bionic InRelease
Get:4 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic InRelease [3901 B]
Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease
Get:6 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic/main arm64 Packages [7787 B]
Get:7 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic/main amd64 Packages [8008 B]
Get:8 http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic/main ppc64el Packages [7793 B]
Fetched 27.5 kB in 4s (6549 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
24 packages can be upgraded. Run 'apt list --upgradable' to see them.

檢查一下套件資訊:

apt show mariadb-server
Package: mariadb-server
Version: 1:10.4.6+maria~bionic
Priority: optional
Section: database
Source: mariadb-10.4
Maintainer: MariaDB Developers <[email protected]>
Installed-Size: 10.2 kB
Depends: mariadb-server-10.4 (>= 1:10.4.6+maria~bionic)
Homepage: http://mariadb.org/
Download-Size: 3180 B
APT-Sources: http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.4/ubuntu bionic/main amd64 Packages
Description: MariaDB database server (metapackage depending on the latest version)
 This is an empty package that depends on the current "best" version of
 mariadb-server (currently mariadb-server-10.4), as determined by the MariaDB
 maintainers. Install this package if in doubt about which MariaDB
 version you need. That will install the version recommended by the
 package maintainers.
 .
 MariaDB is a fast, stable and true multi-user, multi-threaded SQL database
 server. SQL (Structured Query Language) is the most popular database query
 language in the world. The main goals of MariaDB are speed, robustness and
 ease of use.

N: There are 2 additional records. Please use the '-a' switch to see them.

如果安裝其他套件時出現類似的錯誤,把 key 替換應該都能解決。

Reference: Ubuntu 18.04 gpg dirmngr IPC connect call failed #3286

發表留言

GIT 遺失 commit 後的恢復方法

Git 可透過 resetrevert 來恢復前一個版本,在 commit 沒有 push 之前的話我通常都會使用 reset 來進行,而這次因為操作不熟悉而造成還沒 push 的 commit 遺失了,這時候要怎麼恢復?

Git 會把所有的操作紀錄都保留下來

Git 所有的操作都是在原先的紀錄上做修改,而且所有的紀錄都會留存下來。換句話說,你不管進行任何一種操作,Git 都有辦法讓你進行回滾。

執行 git reflog 即可看到所有操作紀錄

git reflog
9688fed [email protected]{0}: reset: moving to 9688fed
9688fed [email protected]{1}: reset: moving to HEAD
9688fed [email protected]{2}: reset: moving to HEAD^1
912851c (origin/develop, develop) [email protected]{3}: reset: moving to HEAD^1

※你可以加上參數 --stat 顯示異動的檔案。可支援的參數很多,如果想要獲得其他資訊,可以讀一下官方文件。

恢復被刪除的 commit

使用 git reset --hard <commit-id|HEAD> 可以將分支重設為指定的 commit 或是 HEAD(預設為最近一次的 commit)

注意:如果當下有未儲存的異動要先處理掉,不然會消失。(建議先用 git stash 先暫存起來)

git reflog 找到你想恢復的 commit id 後,執行下列指令即可恢復:

git reset --hard 551c724
HEAD is now at 551c724 tmp

Reference: 找回Git中丢失的Commit – 简书

發表留言

Refused to apply style from ‘style.css’ because its MIME type (‘text/html’) is not a supported stylesheet MIME type, and strict MIME checking is enabled.

今天把 Laravel 專案放到新建的 server 跑,出現了這個錯誤:

Refused to apply style from ‘http://localhost:8080/assets/styles/style.css‘ because its MIME type (‘text/html’) is not a supported stylesheet MIME type, and strict MIME checking is enabled.

找了很久都沒有找到原因,同時伴隨著部分頁面會出現 404。

Stackoverflow 這篇講了很多,但實際上我遇到的倒沒有這麼複雜,而且也不是因為因為 lib 引起的問題,最後在這篇找到解答,原來我只是忘記設定 Apache 的 Allow Override

DocumentRoot /var/www/sitefolder/public
ServerName site.domain.com
<Directory /var/www/sitefolder/public>
    AllowOverride All # 加上這行就可以了
    Allow from all
    Options +Indexes
</Directory>

最後執行 sudo systemctl reload apache2 就正常了。

References

發表留言