この記事は openSUSE Advent Calendar 2022 の5日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、hostnamectl を紹介します。

コマンド名: hostnamectl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
hostnamectl は、システムのホスト名や関連する情報の表示や変更を行うプログラムです。昔ながらの、ホスト名を表示するプログラム hostname は、引数を指定しないで入力すると、単にホスト名を返すだけですが、hostnamectl を引数を指定しないで実行すると、

 Static hostname: suse154
       Icon name: computer-vm
         Chassis: vm
      Machine ID: 61ee5253e44f403c9918308e232c84b8
         Boot ID: 2dc4f7eae3724c6497708a64e08a516c
  Virtualization: kvm
Operating System: openSUSE Leap 15.4
     CPE OS Name: cpe:/o:opensuse:leap:15.4
          Kernel: Linux 5.14.21-150400.24.33-default
    Architecture: x86-64
 Hardware Vendor: QEMU
  Hardware Model: Standard PC _i440FX + PIIX, 1996_

と、たくさんの情報を表示します。今回テストしている環境が KVM 配下であることもバレてしまいます。旧来の hostname コマンドと互換を取るには、引数として hostname を指定すれば良いです。単に hostname を返します。
もちろん、root でないとできませんが、host 名を変更することも可能です。

# hostnamectl hostname suse154A
# hostnamectl hostname
suse154A

そのほかに、JSON形式で出力することも可能です。

hostnamectl --json=pretty
{
        "Hostname" : "suse154",
        "StaticHostname" : "suse154",
        "PrettyHostname" : null,
        "DefaultHostname" : "localhost",
        "HostnameSource" : "static",
        "IconName" : "computer-vm",
        "Chassis" : "vm",
        "Deployment" : null,
        "Location" : null,
        "KernelName" : "Linux",
        "KernelRelease" : "5.14.21-150400.24.33-default",
        "KernelVersion" : "#1 SMP PREEMPT_DYNAMIC Fri Nov 4 13:55:06 UTC 2022 (76cfe60)",
        "OperatingSystemPrettyName" : "openSUSE Leap 15.4",
        "OperatingSystemCPEName" : "cpe:/o:opensuse:leap:15.4",
        "OperatingSystemHomeURL" : "https://www.opensuse.org/",
        "HardwareVendor" : "QEMU",
        "HardwareModel" : "Standard PC _i440FX + PIIX, 1996_",
        "ProductUUID" : null
}

JSON 形式で出力する場合、hostname オプションを指定すると、json 機能は無効になってしまうようです。

従来からの hostname コマンドもたぶん残っていくとは思いますが、新しい hostnamectl コマンドも覚えて置いた方が良いかもしれません。

この記事は openSUSE Advent Calendar 2022 の7日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、loginctl を紹介します。

コマンド名: localectl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
loginctl は、systemd の login マネージャからの情報を表示したり設定するためのツールです。表示に関しては、従来の w コマンドや ps コマンド などの機能が含まれています。たとえば、現在ログインしている情報は、下記のように表示されます。

%loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
     13    0 root
      6 1000 ribbon seat0 tty2

w コマンドではこのように表示されます。表示する内容がかなり異なります。

%w
 20:10:49 up 12:55,  5 users,  load average: 0.00, 0.01, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ribbon   :        :                15:20   ?xdm?   2:18   0.07s gdm-session-worker [pam/gdm-password]
ribbon   tty2     tty2             15:20   12:55m  0.08s  0.08s /usr/lib/gnome-session-binary
ribbon   pts/0    192.168.X.Y      18:17   10:29   0.28s  0.00s less
ribbon   pts/2    192.168.X.Y      19:46    1.00s  0.11s  0.01s w
root     pts/3    ::1              20:02    7:58   0.09s  0.09s -bash

自分自身のセッション情報は session-status サブコマンドで表示できます。

%loginctl session-status
12 - ribbon (1000)
           Since: Sat 2022-12-03 19:46:34 JST; 28min ago
          Leader: 7798 (sshd)
             TTY: pts/2
          Remote: 192.168.X.Y
         Service: sshd; type tty; class user
           State: active
            Unit: session-12.scope
                  ┣ 7798 "sshd: ribbon [priv]" ""
                  ┣ 7800 "sshd: ribbon@pts/2" "" ""
                  ┣ 7801 -bash
                  ┣ 8134 loginctl session-status
                  ┗ 8135 less

さらに、 user-status サブコマンドで、詳細な情報を得ることができます。pstree コマンドにも似た感じです。

%loginctl user-status
ribbon (1000)
           Since: Sat 2022-12-03 15:20:50 JST; 5h 8min ago
           State: active
        Sessions: 12 11 *6
          Linger: no
            Unit: user-1000.slice
                  ┣session-11.scope
                  ┃┣ 7431 "sshd: ribbon [priv]" ""
                  ┃┣ 7437 "sshd: ribbon@pts/0" "" ""
                  ┃┣ 7438 -bash
                  ┃┣ 7780 man loginctl
                  ┃┗ 7792 less
                  ┣session-12.scope
                  ┃┣ 7798 "sshd: ribbon [priv]" ""
                  ┃┣ 7800 "sshd: ribbon@pts/2" "" ""
                  ┃┣ 7801 -bash
                  ┃┣ 8270 loginctl user-status
                  ┃┗ 8271 less
                  ┣session-6.scope
                  ┃┣ 4748 "gdm-session-worker [pam/gdm-password]"
                  ┃┣ 4778 /usr/bin/gnome-keyring-daemon --daemonize --login
                  ┃┣ 4784 /usr/lib/gdm/gdm-wayland-session /usr/bin/gnome-session
                  ┃┣ 4788 /usr/lib/gnome-session-binary
                  ┃┗ 7997 /usr/bin/ssh-agent -D -a /run/user/1000/keyring/.ssh
                  ┗user@1000.service
                    ┣app.slice
                    ┃┣app-gnome-YaST2\x2dorg.opensuse.yast.LAN-5394.scope
                    ┃┃┣ 5523 dbus-launch --autolaunch 61ee5253e44f403c9918308e232c84b8 --binary-syntax>
                    ┃┃┗ 5524 /usr/bin/dbus-daemon --syslog-only --fork --print-pid 5 --print-address 7>
                    ┃┣app-gnome-gnome\x2dsoftware\x2dservice-5036.scope
                    ┃┃┗ 5036 /usr/bin/gnome-software --gapplication-service
                    ┃┣app-gnome-org.gnome.Evolution\x2dalarm\x2dnotify-5045.scope
                    ┃┃┗ 5045 /usr/lib/evolution-data-server/evolution-data-server/evolution-alarm-noti>
                    ┃┣app-gnome-org.gnome.SettingsDaemon.DiskUtilityNotify-5018.scope
                    ┃┃┗ 5018 /usr/lib/gsd-disk-utility-notify

そのほかに、セッションを強制切断する kill-session サブコマンドがあります。たとえば、ssh でログインしているセッションを強制切断するためには、
1) w コマンドでユーザを調べる
2) そのユーザが使っている sshd プロセスを ps コマンドで調べる
3) kill コマンドでそのプロセスを終了させる。
というステップが必要でしたが、loginctl では、セッション番号を表示させた後、そのセッションを終了するコマンドを入力することで作業が行えますので、手間が減ります。

# loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
     13    0 root
      6 1000 ribbon seat0 tty2

4 sessions listed.
# loginctl kill-session 13
# loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
      6 1000 ribbon seat0 tty2

3 sessions listed.

loginctl は、表示形式が見やすいので、w コマンドなどと併用すると便利でしょう。

この記事は openSUSE Advent Calendar 2022 の6日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、localectl を紹介します。

コマンド名: localectl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
localectl は、システムのロケールを表示したり、変更を行うコマンドです。そのほかに、キーボードマッピングの変更も行えます。locale コマンドと loadkeys や kbdconfig の後継とも考えることができます。ただし、機能は強化されています。
ロケールの表示については、 locale コマンドと localectl コマンドでは内容が違い、locale コマンドの方が環境変数に設定されている値を表示するのに対し、localectl コマンドでは、最低限の物のみを表示します。

%locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

%localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp
       X11 Model: microsoftpro
     X11 Options: terminate:ctrl_alt_bksp

また、localectl list-locales でロケールの一覧を表示することができますが、その結果は locale コマンドの結果とは異なっていました。locale コマンドで表示できる、UTF-8系以外のロケールが、localectl では表示されません。

% locale -a | grep ja
ja_JP.eucjp
ja_JP.shiftjisx0213
ja_JP.sjis
ja_JP.utf8

%localectl list-locales | grep ja
ja_JP.UTF-8

但し、localectl でロケールの一覧に表示されていない、たとえば ja_JP.sjis を指定しても、変更することはできました。ちなみに、ロケールの変更は、localectl のサブコマンド set-locale で指定します。

キーボードマップの変更はサブコマンド set-keymap で指定します。これも、loadkeys で指定できるキーマップと異なります。loadkeys の場合ですと、IA アーキテクチャを使用する場合には /usr/share/kbd/keymaps/i386/ 配下にあるキーマップを使いますが、そこにあるマップ一覧と同じものになっています。ただ、標準 jp106 以外の使い道は少ないと思いますが….

%localectl list-keymaps | grep jp
jp
jp-OADG109A
jp-dvorak
jp-kana86
jp106
mac-jp106
%find /usr/share/kbd/keymaps -name "jp*" -print
/usr/share/kbd/keymaps/i386/qwerty/jp106.map.gz
/usr/share/kbd/keymaps/xkb/jp-dvorak.map.gz
/usr/share/kbd/keymaps/xkb/jp-OADG109A.map.gz
/usr/share/kbd/keymaps/xkb/jp-kana86.map.gz
/usr/share/kbd/keymaps/xkb/jp.map.gz

localectl でのロケール変更は、システム全体の変更となるので、一時的な変更には使えません。一時的な変更は、環境変数を設定し直すことになります。キーボードの変更についても、loadkeys と同等のことはできますが、locale と言う名前でキーボードの操作、と言うことになるので、ちょっと分かりにくいかもしれません。使い道は限定されそうです。

この記事は openSUSE Advent Calendar 2022 の4日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、busctl を紹介します。

コマンド名: busctl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
busctl は、D-Bus の状態を表示させたり、設定を行ったりするためのツールです。取りあえず起動してみると、

NAME                                  PID PROCESS         USER    CONNECTION    UNIT                          SESSION DESCRIPTION
:1.0                                    1 systemd         root    :1.0          init.scope                    -       -
:1.1                                  632 wickedd-dhcp6   root    :1.1          wickedd-dhcp6.service         -       -
:1.10                                 705 wickedd-nanny   root    :1.10         wickedd-nanny.service         -       -
:1.105                               3249 busctl          ribbon  :1.105        session-4.scope               4       -
:1.13                                 720 ModemManager    root    :1.13         ModemManager.service          -       -
:1.16                                1120 gdm             root    :1.16         display-manager.service       -       -
:1.17                                1128 accounts-daemon root    :1.17         accounts-daemon.service       -       -
:1.2                                  618 avahi-daemon    avahi   :1.2          avahi-daemon.service          -       -
:1.24                                1275 power-profiles- root    :1.24         power-profiles-daemon.service -       -
:1.26                                1280 rtkit-daemon    root    :1.26         rtkit-daemon.service          -       -
:1.27                                1274 upowerd         root    :1.27         upower.service                -       -
:1.3                                  628 wickedd-auto4   root    :1.3          wickedd-auto4.service         -       -
:1.32                                1324 wpa_supplicant  root    :1.32         wpa_supplicant.service        -       -
:1.4                                  630 wickedd-dhcp4   root    :1.4          wickedd-dhcp4.service         -       -
:1.45                                1437 colord          colord  :1.45         colord.service                -       -

のように、現在のバスの一覧が表示されます。とは言っても、D-bus がどういう物で、何をしているかを分かっていないと、この表示の意味も分かりませんね。Wikipedia先生に聞いてみると、

D-Bus(Desktop Bus、ディーバス)は、メッセージバスと呼ばれる、アプリケーション間でやりとりを行うための、プロセス間通信 (IPC) 実装の1つである。

なのだそうです。
Unix系のプロセス間通信としては、パイプ、シグナル、ソケットとかいろいろありました。また、KDE や Gnome も独自のプロセス間通信機能を持っていました。それらの乱立を統一化するために作られたのが D-Bus ということになります。
ただ、D-Bus そのものは、ユーザが直接さわる物ではありません。あくまでもプロセス(プログラム)の世界で使われるものです。そのため、busctl も、D-Bus の動作の確認やデバッグ、テスト用に使われるものと思った方がよいでしょう。

この記事は openSUSE Advent Calendar 2022 の3日目です。

メーカー製のプロダクトの一部には、Windows/Mac だけではなくて Linux 向けの物を用意している場合があります。しかし、たまたま使おうとしたものが、Ubuntu 向けしかありませんでした。
そこで、Ubuntu 向けのバイナリ(dpkg として提供されている物) が openSUSE で動くかどうかを試してみました。

結論から言うと、できます。しかもやり方は難しくありません。

まず、Ubuntu 上で、openSUSE で動かしたいバイナリ(dpkg) をインストールします。この時、どこにインストールされたかを控えておきます。dpkg -deb -c dpkg名 とすれば一覧が表示されます。

次に、インストールされたファイルを全部まとめて openSUSE 側に持って行き、展開します。その後、展開したファイル中にあるターゲットのプログラムを起動すれば動作します。

たとえば、QNAP が提供している、QNAP NAS 一覧を表示したり、ログインしたりするためのツール QFinderPro で試してみましょう。Ubuntu 上では、dpkg の内容は

$ dpkg-deb -c QNAPQfinderProUbuntux64-7.8.2.0928.deb
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/bin/
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/bin/QNAP/
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/
-rw-rw-r-- qnap/qnap      5587 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/cs.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6546 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/da.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5731 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/de.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap     13337 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/el.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5497 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/en.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5847 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/es.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6431 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/fi.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5945 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/fr.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6025 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/hu.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5752 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/it.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6276 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/ja.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap     38927 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/ko.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6498 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/nl.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6454 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/nn.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5714 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/pl.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5700 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/pt.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5716 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/ro.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      7367 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/ru.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6516 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/sv.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      8952 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/th.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5696 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/tr.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      5093 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/zhcn.UEPConsentForm.htm
-rw-rw-r-- qnap/qnap      6582 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/Docs/zhtw.UEPConsentForm.htm
drwxrwxr-x qnap/qnap         0 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/License/
-rw-rw-r-- qnap/qnap     94964 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/License/QfinderThirdPartySoftwareNotices.htm
-rwxrwxr-x qnap/qnap  20314824 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/QfinderPro
-rwxrwxr-x qnap/qnap       274 2022-09-28 18:55 ./usr/local/bin/QNAP/QfinderPro/QfinderPro.sh
(以下略)

となっています。ですので、/usr/local/bin/QNAP 配下やその他を何らかの手段で openSUSE 側に持って行き、展開します。あとは、 /usr/local/bin/QNAP/QfinderPro/QfinderPro.sh を実行すれば、Ubuntu 向けとして提供されているプログラムが openSUSE でも動きます。

この記事は openSUSE Advent Calendar 2022 の1日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。
今回は、bluetoothctl を紹介します。

コマンド名: bluetoothctl
パッケージ: bluez-5.55-150300.3.11.1.x86_64
動作: ○

詳細:
bluetooth の制御をするためのコマンドです。初っ端からですが、systemd とは無関係です。動作には、bluethoothd が必要です。
手持ちの、openSUSE が動く物理マシンでは、bluetooth 機能が標準で入っていなかったので、USB 接続の、バッファローの USB アダプタを使って検証してみました。

まずは、systemd で bluetoothd を起動しておきます。
続いて、USB アダプタを差し込み、bluetoothctl を起動します。
起動すると、プロンプトが表示されるので、デバイスのスキャンをするため、スキャンコマンドを入力すると、エラーになってしまいます。

# bluetoothctl
Agent registered
[CHG] Controller 00:1B:DC:F3:8B:51 Pairable: yes
[bluetooth]# scan on
Failed to start discovery: org.bluez.Error.NotReady
[bluetooth]#

これは、USB Bluetooth アダプタを差し込んだだけでは、まだ機能が動いていないためです。まずは、Bluetooth アダプタの機能を有効にするため、power on と入力します。すると、今度は見えるようになりました。

# power on
[CHG] Controller 00:1B:DC:F3:8B:51 Class: 0x00000104
Changing power on succeeded
[CHG] Controller 00:1B:DC:F3:8B:51 Powered: yes
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:1B:DC:F3:8B:51 Discovering: yes
[NEW] Device 77:6C:E6:94:2A:38 77-6C-E6-94-2A-38
[NEW] Device 7E:4D:FE:CB:CC:D9 7E-4D-FE-CB-CC-D9
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -73
[NEW] Device 4C:FD:32:93:41:95 4C-FD-32-93-41-95
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -65
[NEW] Device 46:D9:DC:39:CC:E8 46-D9-DC-39-CC-E8
[NEW] Device 8C:DE:52:B8:AB:EA SRS-X33
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -73
[CHG] Device 77:6C:E6:94:2A:38 RSSI: -65
[bluetooth]#

ここで、pair コマンドを入力すると

# pair 8C:DE:52:B8:AB:EA
Attempting to pair with 8C:DE:52:B8:AB:EA
[CHG] Device 8C:DE:52:B8:AB:EA Connected: yes
[CHG] Device 8C:DE:52:B8:AB:EA Modalias: bluetooth:v0039p1582d2110
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 00001108-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device 8C:DE:52:B8:AB:EA ServicesResolved: yes
[CHG] Device 8C:DE:52:B8:AB:EA Paired: yes
Pairing successful
[bluetooth]#

となり、ペアリングが出来るようになりました。

この先は試してみていませんが、デバイスの削除とか情報の取得とか色々できるようです。
GUI な環境が無い状況での bluetooth 利用には使えると思います。