In diesem Artikel erfahren Sie, wie Sie CentOS 7-Computern die Anmeldung einer seriellen Konsole über Bluetooth von einem anderen Gerät aus ermöglichen.
Ich denke, dass die Methode für andere Distributionen etwas anders ist, aber ich denke, dass sie auf die gleiche Weise erreicht werden kann.
Wenn Sie einen Linux-Computer betreiben (insbesondere für Server), stellen Sie häufig über SSH oder ähnliches eine Verbindung von einem anderen Terminal über das Netzwerk her. Konnten Sie jedoch jemals keine SSH-Verbindung herstellen, indem Sie während einer SSH-Verbindung Folgendes tun?
-- /etc/init.d/network stop
( systemctl stop network
)
kill
sshdEs ist praktisch, die serielle Konsole dafür zu aktivieren (?). Sie können sich über die serielle Konsole anmelden, indem Sie die seriellen Schnittstellen des Linux-Computers und des Terminal-Computers verbinden. Die meisten modernen PCs verfügen jedoch nicht mehr über eine serielle Schnittstelle. [^ 1]
[^ 1]: Es ist ein 9-poliger D-Sub RS-232C. Vor langer Zeit? Es ist seit ungefähr verschwunden. Es gibt auch ein USB-serielles Konvertierungskabel, das jedoch jeweils etwa 2.000 Yen kostet. Um Maschinen ohne serielle Schnittstelle anzuschließen, schließen Sie jeweils ein Konvertierungskabel an und verbinden Sie sie mit einem seriellen Kabel. Es kostet Geld und ich bin nicht der einzige, der es für ein bisschen Unsinn hält.
Hier kommt Bluetooth ins Spiel. Obwohl die serielle Schnittstelle von modernen PCs verschwunden ist, ist Bluetooth in vielen PCs enthalten (USB-Dongle ist zu einem relativ niedrigen Preis erhältlich, auch wenn er nicht enthalten ist). Eine serielle Kommunikation ist auch über Bluetooth möglich. Ich habe versucht, damit eine serielle Konsolenverbindung herzustellen, daher werde ich die Prozedur veröffentlichen.
Da das Betriebssystem CentOS 7 ist und die GUI-Desktop-Umgebung zum Zeitpunkt der Installation ausgewählt ist, denke ich, dass einige Pakete nicht in einer minimalen Installation installiert werden. Führen Sie bei Bedarf eine yum install
durch.
Darüber hinaus werden SELinux-Richtlinien erstellt und integriert, damit SELinux in einem gültigen Status verwendet werden kann. Wenn Sie SELinux deaktiviert haben (Zulässig), können Sie die Schritte unter Erstellen und Anwenden von SELinux-Richtlinien überspringen. [^ 2]
[^ 2]: Selbst im Fall von Permissive werden beim Überspringen des SELinux-Verfahrens viele Überwachungsprotokolle ausgespuckt, sodass ich denke, dass es endlich keinen Verlust gibt. Ich denke, es hängt von der Situation ab, aber ich denke, die Ära der unvermeidlichen Deaktivierung von SELinux ist fast vorbei.
Nehmen Sie zuerst die Einstellungen auf der Linux-Computerseite vor und führen Sie dann das Pairing mit dem Terminal-Computer durch. Sie können nur über das gekoppelte Terminal eine Verbindung zur seriellen Konsole herstellen.
Die Details der Bluetooth-bezogenen Begriffe und Befehle werden nicht erläutert. Oder besser gesagt, ich habe es selbst gemacht, also verstehe ich es nicht genug, um es zu erklären ...
Richten Sie zunächst den Linux-Computer ein, an den die serielle Konsole angeschlossen ist.
Wenn Bluetooth nicht verfügbar ist, wird die Story nicht gestartet. Überprüfen Sie daher zunächst, ob sie verfügbar ist.
Sie können dies überprüfen, indem Sie auf dmesg grep
wie folgt ausführen.
$ grep -i bluetooth /var/log/dmesg
[ 9.890172] Bluetooth: Core ver 2.22
[ 9.890205] Bluetooth: HCI device and connection manager initialized
[ 9.890211] Bluetooth: HCI socket layer initialized
[ 9.890215] Bluetooth: L2CAP socket layer initialized
[ 9.890223] Bluetooth: SCO socket layer initialized
[ 9.930770] Bluetooth: hci0: read Intel version: 370810011003110e00
[ 9.936104] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq
[ 10.271789] Bluetooth: hci0: Intel Bluetooth firmware patch completed and activated
Bearbeiten Sie /etc/bluetooth/main.conf, um AutoEnable zu aktivieren. Standardmäßig ist Bluetooth beim Booten auf Linux-Computern deaktiviert, jetzt jedoch beim Booten. [^ 3]
[^ 3]: Wenn Sie nach dem Start jederzeit aktivieren / deaktivieren möchten, können Sie dies mit "Einschalten" / "Ausschalten" mit "Bluetoothctl" tun.
Der relevante Teil befindet sich am Ende der Datei.
/etc/bluetooth/main.conf
-AutoEnable=false
+#AutoEnable=false
+AutoEnable=true
Ändern Sie bei systembezogenen Elementen den Betrieb von bluetooth.service beim Start und nehmen Sie die Einstellungen so vor, dass beim seriellen Herstellen einer Verbindung eine Anmeldeaufforderung angezeigt wird.
Erstellen Sie ein Verzeichnis bluetooth.service.d unter / etc / system / systemd / und erstellen Sie eine Drop-In-Konfigurationsdatei darin. Ich denke, dass der Dateiname fast alles sein kann, solange er mit ".conf" endet.
ini:/etc/system/systemd/bluetooth.service.d/add-spp.conf
[Service]
ExecStart=
ExecStart=/usr/libexec/bluetooth/bluetoothd --compat
ExecStartPost=/usr/bin/sdptool add SP
Diese Konfigurationsdatei fügt ein SPP (Serial Port Profile) für die serielle Kommunikation über Bluetooth hinzu, wenn Bluetoothd gestartet wird. Sie müssen bluetoothd
mit der Option --compat (oder -C) starten, bevor Sie sdptool
verwenden können.
Erstellen Sie eine neue Datei unter / etc / system / systemd /.
/etc/system/systemd/[email protected]
[Unit]
Description=RFCOMM Getty on %I
Documentation=https://qiita.com/tetsuy/items/d9220ac66bd18fd0a01b
After=bluetooth.service
Requires=bluetooth.service
Before=getty.target
IgnoreOnIsolate=yes
[Service]
ExecStart=/bin/rfcomm watch %I 1 /sbin/agetty 115200,38400,9600 %I
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
[Install]
WantedBy=getty.target
rfcomm watch
wartet auf eine serielle Verbindung und erstellt bei Verbindung ein RFCOMM-Gerät (/ dev / rfcommX) und führt den angegebenen Befehl aus (startet einen untergeordneten Prozess). Wenn Sie angeben, dass hier "agetty" ausgeführt werden soll, und / dev / rfcommX übergeben, wird die Anmeldeaufforderung an der seriellen Quelle angezeigt.
Obwohl es ein wenig vom Thema abweicht, gibt es einen Artikel, der erklärt, dass das Bearbeiten der Einheitendatei von systemd das Bearbeiten der Datei unter / usr / lib / systemd / system /
bedeutet, aber die Methode ist ** falsch. ** ist. (Dateien in diesem Verzeichnis können während des Systemd-Updates aktualisiert werden.)
Referenz: [Red Hat Enterprise Linux 7-Systemadministratorhandbuch / 10.6.4. Ändern vorhandener Gerätedateien](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ sect-Managing_Services_with_systemd-Unit_Files # sect-Managing_Services_with_systemd-Unit_File_Modify)
Zurück zur Geschichte: Sobald die beiden oben genannten Dateien erstellt wurden, werden sie in systemd wiedergegeben und aktiviert.
# systemd daemon-reload
# systemd enable [email protected]
Erstellen Sie als Nächstes eine neue Regeldatei unter /etc/udev/rules.d/.
config:/etc/udeb/rules.d/90-rfcomm.rules
KERNEL=="rfcomm[0-9]*", ENV{ID_MM_DEVICE_IGNORE}="1"
Wenn Sie dies nicht tun, reagiert ModemManager auf die RFCOMM-Gerätedatei / dev / rfcomm0, die erstellt wurde, wenn Sie eine Bluetooth-Verbindung vom Terminal herstellen und Daten, die wie ein AT-Befehl aussehen, an das Terminal senden (dies ist für die Anmeldeaufforderung seltsam). Zeichen unterbrechen).
Sie können systemd {stop, disable} ModemManager
verwenden, aber da es sich um einen Dienst handelt, der standardmäßig aktiviert ist, habe ich eine Ausschlussregel hinzugefügt, damit ich zu keinem Zeitpunkt süchtig werde.
Aufgrund verschiedener Forschungen zu SELinux konnte ich diesmal einen Schritt von "Ich hasse es, SELinux nicht zu essen" machen. Für diejenigen, die nicht gerne wie ich essen, würde ich gerne in den Bergen ausführlicher schreiben, aber ich werde es weglassen, weil die Lautstärke zu stark zunimmt.
In einer SELinux-fähigen Umgebung funktionierte das manuelle Starten von rfcomm
über die Shell einwandfrei, aber als ich versuchte, es als Daemon von systemd aus zu starten, funktionierte es nicht. Nachdem wir die Ursache untersucht hatten, fanden wir Folgendes.
Wenn es keine entsprechende SELinux-Richtlinie gibt, habe ich beschlossen, sie selbst zu erstellen, und sie daher mit dem Befehl "ausearch" im zulässigen Modus stetig zerstört. Der Inhalt der erstellten Richtlinie umfasst ungefähr die folgenden vier Punkte.
rfcomm
, untergeordnete Prozesse zu erzeugen rfcomm
agetty
als untergeordneten Prozess startet, wird seine Domain auf "getty_t" umgestellt.Von diesen ist der wichtigste Punkt 2.
Der Zugriff auf login-bezogene Ressourcen über den "Agetty" -Prozess ist natürlich standardmäßig zulässig. In diesem Fall wird die Operation jedoch abgelehnt. Dies liegt daran, dass der Prozess "agetty" in diesem Fall in der Domäne "bluetooth_t" ausgeführt wird, obwohl die Berechtigungsrichtlinie unter der Annahme festgelegt ist, dass der Prozess "agetty" in der Domäne "getty_t" ausgeführt wird. (Da der untergeordnete Prozess die Domäne des übergeordneten Prozesses übernimmt, geschieht dies, wenn "rfcomm" in der Domäne "bluetooth_t" "agetty" startet.)
Wenn Sie eine SELinux-Richtlinie erstellen, versetzen Sie sie normalerweise in den zulässigen Modus und verwenden Sie den Befehl "ausearch", um eine Regel zu schreiben, mit der SELinux abgelehnte Aktionen einzeln im Überwachungsprotokoll ausführen kann. Wenn Sie dies in diesem Fall töricht tun, können Prozesse in der Domäne "bluetooth_t" auf login-bezogene Ressourcen zugreifen. Sie werden wahrscheinlich viele Regeln schreiben, und es scheint nicht gut für die Sicherheit zu sein.
Ich schreibe also eine Domain-Übergangsregel, damit der Prozess in der ursprünglichen "getty_t" -Domain gestartet wird, wenn rfcomm
agetty
startet.
Dadurch kann "agetty" gemäß der Standardautorisierungsrichtlinie arbeiten.
Nun, die Erklärung ist lang, aber es geht darum, wie eine Richtlinie erstellt und angewendet wird.
Installieren Sie das Paket selinux-policy-devel, das zum Generieren der SELinux-Richtliniendatei erforderlich ist.
# yum install selinux-policy-devel
Erstellen Sie außerdem eine te-Datei (Type Enforcement), die die Grundlage für die Richtliniendatei bildet. Die Position ist überall in Ordnung, aber vorläufig ist es / root / selinux /. Wenn Sie make
ausführen, werden mehrere Dateien generiert, einschließlich des Verzeichnisses. Daher ist es besser, ein neues dediziertes Verzeichnis zu erstellen.
/root/selinux/rfcomm-getty.te
module rfcomm-getty 1.0;
require {
type bluetooth_t;
type getty_exec_t;
type getty_t;
type local_login_t;
class file { execute open read };
class process { transition sigchld signal };
class socket { read write };
}
allow bluetooth_t getty_exec_t:file { execute open read };
allow bluetooth_t getty_t:process { transition sigchld };
allow bluetooth_t local_login_t:process signal;
type_transition bluetooth_t getty_exec_t:process getty_t;
allow getty_t bluetooth_t:socket { read write };
allow getty_t bluetooth_t:process sigchld;
allow local_login_t bluetooth_t:process sigchld;
allow local_login_t bluetooth_t:socket { read write };
Generieren Sie aus dieser von Ihnen erstellten Datei eine pp-Datei (Policy Package) und wenden Sie die Richtlinie an.
# cd /root/selinux
# make -f /usr/share/selinux/devel/Makefile rfcomm-getty.pp
/usr/share/selinux/devel/include/contrib/container.if:14: Error: duplicate definition of container_runtime_domtrans(). Original definition on 14.
...snip...
/usr/share/selinux/devel/include/contrib/container.if:498: Error: duplicate definition of container_runtime_typebounds(). Original definition on 684.
Compiling targeted rfcomm-getty module
/usr/bin/checkmodule: loading policy configuration from tmp/rfcomm-getty.tmp
/usr/bin/checkmodule: policy configuration loaded
/usr/bin/checkmodule: writing binary representation (version 19) to tmp/rfcomm-getty.mod
Creating targeted rfcomm-getty.pp policy package
rm tmp/rfcomm-getty.mod.fc tmp/rfcomm-getty.mod
# ls
rfcomm-getty.fc
rfcomm-getty.if
rfcomm-getty.pp
rfcomm-getty.te
tmp
Ich erhalte eine Fehlermeldung, aber es ist in Ordnung, wenn rfcomm-getty.pp generiert wird.
Installieren Sie die von semodule -i
generierte Richtlinie.
# semodule -i rfcomm-getty.pp
Starten Sie zu diesem Zeitpunkt den Computer neu und die serielle Konsole sollte sich über Bluetooth im Standby-Modus befinden.
Von hier aus müssen Sie den Terminalcomputer koppeln, der mit dem Linux-Computer verbunden werden soll, und sich bei der seriellen Konsole anmelden.
Um eine serielle Konsolenverbindung über Bluetooth herzustellen, müssen der Linux-Computer und der Terminal-Computer im Voraus gekoppelt werden. Umgekehrt bedeutet dies, dass Sie von einem nicht zuvor gekoppelten Terminal aus keine Verbindung zu einer seriellen Konsole über Bluetooth herstellen können.
Damit Geräte über Bluetooth miteinander kommunizieren können, müssen sie zuerst gekoppelt werden. Nachdem ein Gerät von umgebenden Geräten erkannt werden kann, sendet das andere Gerät eine Kopplungsanforderung an dieses Gerät.
Hier ist ein Beispiel für das Pairing von einem Windows 10-Computer. [^ 4]
[^ 4]: Im Gegenteil, ich denke, dass es auf die gleiche Weise verwendet werden kann, selbst wenn Sie von der Seite des Linux-Computers aus koppeln (nicht verifiziert), aber ich denke, dass dies in Bezug auf das Verfahren einfacher ist.
Machen Sie zuerst den Linux-Computer von bluetoothctl
erkennbar.
# bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX HOSTNAME [default]
[bluetooth]# show
Controller XX:XX:XX:XX:XX:XX
Name: HOSTNAME
Alias: HOSTNAME
Class: 0x000104
Powered: yes
Discoverable: no
Pairable: yes
UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
Modalias: usb:v1D6Bp0246d052C
Discovering: no
Geben Sie an der Bluetoothctl-Eingabeaufforderung show
ein, um die Controller-Informationen anzuzeigen. Wenn Sie bestätigen, dass "Powered: yes" und "Pairable: yes" eingestellt und "erkennbar ein" sind, kann der Linux-Computer standardmäßig 3 Minuten lang über Bluetooth erkannt werden.
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller XX:XX:XX:XX:XX:XX Discoverable: yes
[bluetooth]#
Wenn "Pairable: no" eingestellt ist, schlägt die Kopplung fehl, auch wenn sie gefunden werden kann. Das Pairing ist mit pairable on
möglich.
Das Pairing wird von der Seite des Terminalcomputers aus durchgeführt, solange es erkennbar ist.
Beschreibt das Pairing von einem Windows-Computer. Natürlich ist das Verfahren anders, aber Sie können eine Verbindung von einem anderen Betriebssystem aus herstellen.
Ich denke, dass dies alles ist, was Sie tun müssen, um das Pairing abzuschließen (die Eingabeaufforderung bluetoothctl
auf der Linux-Seite zeigt auch an, dass das Pairing abgeschlossen wurde).
Überprüfen Sie außerdem die Zuordnung der seriellen Schnittstelle. Wenn Sie mit aktiviertem SPP koppeln, werden Ihnen automatisch zwei COM-Ports zugewiesen (eingehend und ausgehend).
Sie können eine Verbindung zur seriellen Konsole herstellen, indem Sie den hier "Ausgehend" zugewiesenen Port öffnen (in diesem Beispiel COM4).
Der schnellste Weg, einen COM-Port zu öffnen, ist die Verwendung des Tera-Begriffs, den Sie wahrscheinlich ständig verwenden.
Geben Sie bei der Verbindung mit SSH den Hostnamen und den Port an, wählen Sie jedoch "Seriell", wählen Sie den COM-Port aus und klicken Sie auf "OK". nur das. Auf dem Bildschirm sollte eine Anmeldeaufforderung angezeigt werden.
Bei einer Verbindung über Bluetooth vom Terminal aus wird das folgende Fehlerprotokoll ausgegeben.
/dev/rfcomm0: cannot get controlling tty:Es ist eine Operation, die nicht erlaubt ist
/dev/rfcomm0: cannot get controlling tty:Es ist eine Operation, die nicht erlaubt ist
/dev/rfcomm0: cannot set process group:Unangemessenes ioctl für Gerät
Ich verstehe die Dinge um TTY immer noch nicht ...
Wenn Sie die Ursache kennen, lassen Sie es mich bitte wissen!
Dies sind die Websites und Artikel, auf die ich verwiesen habe. Vielen Dank.
Ich verwende eine Terminal-App namens ConnectBot unter Android, aber diese App unterstützt keine serielle Verbindung wie Tera Term.
Wenn Sie im Play Store nach "Bluetooth serial" suchen, finden Sie viele Bluetooth-Terminal-Apps, aber keine davon ist so einfach zu bedienen wie die, die Sie ständig verwenden.
Deshalb! Eine App mit dem Namen "Bluetooth Bridge (+ TCP)" wird angezeigt.
Dies ist eine App, die die Kommunikation zwischen zwei Bluetooth oder TCP verbindet. Eine ist eine serielle Bluetooth-Verbindung, die andere ist ein TCP-Server, der jeden Port überwacht, um die bidirektionale Kommunikation zu überbrücken. Von der üblichen Terminal-App aus ist Telnet zum angegebenen Port von localhost in Ordnung!
Ich bin kein Fan dieser App, aber es war ein guter Job, also habe ich sie vorgestellt.