jc – 將指令輸出結果轉為JSON格式

分享 jc 這指令,裝了以後,可以把一些指令的輸出轉為 json,之後就可以搭配 jq 來查詢 json 裡的資料。

安裝

RHEL8 的安裝,需要直接從 jc 的 github 頁面下載 linux binary 。

Debian/Ubuntu 可以使用 apt-get install jc

ArchLinux 可以用 pacman -S jc

MacOS 可以用 brew install jc

使用

例如

 非 jq 作法用 jq
掛載點mount | awk '{print $1;}'mount | jc --mount | jq -r ".[].filesystem"
digdig example.com | awk '/ANSWER\ SECTION/ { getline; print $5; }'dig example.com | jc --dig | jq -r '.[].answer[].data'

除了 mountdig 之外,也可以解析蠻多指令的,這部份可以參照 github 網頁

參考資料:

sudoers 檔案改壞了

昨天不小心在 /etc/sudoers.d 目錄下加了個檔案,格式有問題,導致之後下 sudo 指令都會出現這樣的錯誤:

sudo: unable to initialize policy plugin

本想說要來重開機,進 single 模式來修改了,還好,找到這篇:https://unix.stackexchange.com/questions/677591/how-to-restore-a-broken-sudoers-file-without-being-able-to-use-sudo

照這篇的方法來處理,就免於重開機的命運。

方法是這樣的,先開兩個終端機視窗,都登入需要處理 sudoers 的主機,在第一個終端機視窗輸入下面指令取得當前 bash 的 pid

echo $$

在第二個終端機視窗輸入

pkttyagent --process <pid>

這個 <pid> 就是前面取得的 bash 的 pid。

再回到第一個終端機視窗,因為我是在 /etc/sudoers.d 目錄下加了一個格式錯誤的檔案,所以就刪掉就可以。

pkexec rm -f /etc/sudoers.d/user1

文章裡,是提問者把檔案擁有者改錯了,導致有問題,所以他用的是 chown 來改擁有者。

文章裡有說明為什麼可以用 pkexec 來處理,這指令其實跟 sudo 差不多,主要是用 polkit 在處理,解答的人說的很仔細。

可喜可賀,學到一個有趣的指令,也解決了一個手殘改錯的問題。

ArchLinux更新出現signature is unknown trust

今天在更新 ArchLinux 時,出現了類似這樣的錯誤,導致後續沒辦法繼續更新。

signature from "Andreas Radke andyrtr@archlinux.org" is unknown trust

本以為會像 Ubuntu 一樣,需要去 gpg server 找金鑰匯入,不過搜尋以後找到這篇:Update / pacman / keyring problem ,發現很容易就可以解決。

只要先執行下面這行,先去更新 keyring 套件即可

sudo pacman -S archlinux-keyring

RHEL8 iSCSI

target 主要提供 iSCSI 裝置,客戶端要使用這個裝置,就需要設置 iSCSI initiator。

我設置 iSCSI target 的方式主要是參考:How to Share Storage via iSCSI Target in RHEL 7/CentOS 7 還有 RHEL8 的管理存儲設備手冊裡的第七章

客戶端的設置,則是參考:How to Configure iSCSI initiator in RHEL 7/CentOS 7

iSCSI target

首先安裝 targetcli

yum install targetcli
systemctl start target
systemctl enable target
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

然後執行 targetcli ,targetcli 指令跟 bash 操作很接近,有 ls ,每個資源則用 cd 進入,操作可以用 create, delete 等,很直覺。

第一步是進入 iscsi 去建立 target

iscsi/
create

若需要使用指定的名稱,則是用

create iqn.2006-04.com.example:444

第二步是建立 backstore,這邊只建立 block storage,是告知 backstore 名稱是 block1,使用的實體裝置是 /dev/sdb

cd /backstores
block/ create name=block1 dev=/dev/sdb

第三步是建立 portal,這邊會先把預設的刪除,再重新建立。這主要是設定要 listen 的 位址跟 port。把預設的刪除掉的原因是,0.0.0.0 範圍太大。

cd /iscsi/iqn.2006-04.example:444/tpg1
delete ip_address=0.0.0.0 ip_port=3260
create 192.168.11.147

第四步是建立 lun

/iscsi/iqn.2006-04.example:444/tpg1/luns/ create /backstores/block/block1

第五步是建立 ACL

/iscsi/iqn.2006-04.example:444/tpg1/acls/ create iqn.2006-04.com.example.foo:888

最後,要重新啟動 target.service

systemctl restart target

iSCSI 客戶端

首先是安裝套件

yum install iscsi-initiator-utils -y

再來是修改設定,主要的設定檔是在 /etc/iscsi/initiatorname.iscsi

內容要填入前面所建立的 acl

InitiatorName=iqn.2006-04.com.example.foo:888

填寫完成後,重新啟動 iscsi.service

systemctl enable iscsi.service
systemctl start iscsi.service

然後去做 discovery,這個步驟會去試探指定的 IP 是否有 iscsi target,然後取得資訊存起來。

iscsiadm -m discovery -t st -p 192.168.11.147 –discover
192.168.11.147:3260,1 iqn.2006-04.com.example:444

這步驟若沒問題,可以在 /var/lib/iscsi/nodes 下找到檔案,這檔案裏面就是連線的資訊。

接下來就是登入

iscsiadm -m node -T iqn.2006-04.com.example:444 -l

這行若成功,就可以用 dmesg 查到 “Attached” 的字樣,表示已經掛載上來了。

這邊有個關鍵,就是有更動 /etc/iscsi/initiatorname.iscsi 內容的話,一定要重新啟動 iscsi.service ,否則會使用到之前的設定,導致失敗。

gcin出現Cannot open /usr/share/gcin/table/.kbm

某天點了 gcin 的 tray icon,按了裡面的「切到舊的注音鍵盤」,之後,切換到 gcin,就會出現下面的訊息

Cannot open /usr/share/gcin/table/.kbm

這超奇怪,放了好幾天,終於受不了。嘗試了以下幾個作法:

  1. 試著移除 gcin,再重新安裝 gcin,不行。
  2. 試著去複製以前的 gcin 設定,不行。

後來才在 gcin 討論區裡找到這篇:Ubuntu 14.04 gcin 安裝啟動後竟抓不到注音符號表??—->X@.kbm

只要執行以下指令,把 ~/.gcin/config 下的 phonetic-keyboard* 刪除即可

rm ~/.gcin/config/phonetic-keyboard*

果然解鈴還須繫鈴人。