zsh の設定調整
macOSの標準シェルがzshになって、Linux環境にもzshを入れて使い始めたけど、時々予想外の動きをしてくれた。
リモートのファイルをscpでコピーしようと “scp remote:*.c .”みたいなことをしたら、no match*.c みたいなエラー。ワイルドカード展開のタイミングが bash などと違うみたい。
逆に、リモートホスト名が書いてある状態だと、ファイル名補完でリモートに接続しようとして待ちが発生して使い勝手も悪くなるといった情報もある。
そこで、上記2つの問題に対応するために、.zshrc に以下の内容を追加。
PROMPT="%F{cyan}[%n@%m %1~]%(#.#.$)%f " setopt nonomatch zstyle ':completion:*:complete:scp:*:files' command command -
macOS Catalina と zsh
macOS Catalina(10.15)
基本ファイルシステムがリードオンリーになるとか、システムの変更がいつもになく危険そうでアップデートを躊躇っていた、macOS Catalina だけど、人柱の方々の撃沈のネタもなく、ようやく Catalina を入れてみた。
でも、心配だった割には、特に重大なトラブルもなく、インストールは終わった。
この後、Macports なども更新を行った。一部、ossp-uuid のパッケージが不具合を発生して、”sudo port clean ossp-uuid” を実行した程度。
Debian環境も zsh に移行
インストールも無事に終わったけど、Catalina からは標準 shell が zsh に変更になった。そこで、身の回りの Debian の環境でも zsh を入れてみた。
ただ、インストールしようとすると、zsh-static という動的リンクをしないパッケージもある。
システムの動的リンクライブラリが異常になっても動くようにということだろう。そこで admin では、zsh-static を使うようにしておいた。
$ sudo aptitude install zsh zsh-static $ chsh -s /bin/zsh $ sudo chsh -s /bin/zsh-static root
OpenHAB2 のインストール
SiriやGoogle home との相性を考え、家電制御のために、openhab2 をインストール
OpenHabのリポジトリ登録
$ wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' \ | sudo apt-key add - $ sudo apt-get install apt-transport-https $ echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' \ | sudo tee /etc/apt/sources.list.d/openhab2.list $ sudo apt-get update
OpenHabのインストール
$ sudo aptitude install openhab2 $ sudo systemctl daemon-reload $ sudo systemctl enable openhab2.service
Java環境の設定
上記の設定で、openhub2 のインストールは終わったけど、”systemctl start openhab2.service”を実行しても動いてくれない。起動スクリプトのための設定が必要。
(( /etc/default/openhab2 )) : OPENHAB_HTTP_PORT=8080 OPENHAB_HTTP_ADDRESS=192.168.xxx.0 :
相変わらず動かないけど、/var/log/opehhab2/openhab.log を見ると、Java のエラーが出ている。改めて確認すると、java のバージョンが java-8 で、9以降だと動かないみたい。改めて openjdk-8 をインストールし、systemdの設定で JAVA_HOME を指定するように変更。
$ sudo aptitude search openjdk-8 openjdk-8-jdk-headless $ sudo vi /usr/lib/systemd/system/openhab2.service (( /usr/lib/systemd/system/openhab2.service )) : [Service] Environment=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 : $ sudo systemctl start openhab2.service
ネットワークが繋がらない filter-aaaa-on-v4
最近、職場や自宅にて時々ネットワークが繋がらないときがある。
ネットワークの設定などは自前サーバを配置しているとはいえ、ちゃんと設定してあるはず。
繋がらないという状態でも、異なるサイトなら問題なくつながるので、プロバイダーや自宅ネットワークが落ちているということはない。でも、ふと IPv6 アドレスが問題になっているのかと反省。
自宅内は閉じているとはいえ、IPv6が使える状態。もしかして、上流接続はIPv4しか使えないけど、たまにIPv6アドレスを引いてしまうとかであろうか。
filter-aaaa-on-v4
そこで、色々調べ、IPv4 アドレスからの問い合わせは、IPv6 を使わせないための設定をしてみた。
((( /etc/bind/named.conf.options ))) options { : listen-on-v6 { any; } ; filter-aaaa-on-v4 yes ; }
動作確認
$ nslookup localhost Name: localhost Address: 127.0.0.1 $ nslookup localhost ::1 Name: localhost Address: 127.0.0.1 Name: localhost Address: ::1
気のせいかもしれないけど、職場の環境も filter-aaaa-on-v4 つけたけど、IPv4 fallback がなくなったのかな。応答が速くなったように感じる。
Capture The Flags 講座のアフターケア
子供が Capture The Flags の講座に参加したけど、簡単な説明後いきなりミニCTF大会だったので、さっぱり分からないだろうから、少し解き方の説明。
ドメインの秘密
ドメイン名とは、IPアドレスは覚えられないのでコンピュータにつけた名前。そのドメイン名とIPアドレスのデータベースがDNS。通常は、コンピュータ名からIPアドレスを調べる時に使う。unix や windows で DNS 情報を調べるコマンドが、nslookup。
最新の unix 環境では、nslookup ではなく、dig しか入っていないかもしれない。
その場合は、
$ sudo apt-get install dnsutils
((( 基本的使い方 ))) $ nslookup [オプション] ドメイン名 [DNSサーバ] ((( 問い合わせ例 ))) $ nslookup tsaitoh.net 8.8.8.8 # GoogleのDNSサーバに問い合わせる例(正引き) $ nslookup 64.33.3.150 8.8.8.8 # (逆引き=IPアドレスからドメイン名を調べる) $ nslookup -query=A tsaitoh.net # IPv4アドレスを調べる $ nslookup -query=AAAA www.yahoo.com # IPv6アドレスを調べる $ nslookup -query=MX tsaitoh.net 8.8.8.8 # メールサーバ情報を調べる $ nslookup -query=TXT tsaitoh.net 8.8.8.8 # SPF1というメールサーバの信頼性情報
我が家では、自宅専用のDNSサーバが動いている特殊な事例。インターネットのグローバルアドレス空間でどう見えているかを知りたい場合は、DNSサーバに 8.8.8.8 を使う。Google が、記憶しやすいIPアドレスで誰もが使っていい高速のDNSサーバを提供してくれている。
Webページを見つけろ
サーバとの通信では、IPアドレスで相手のコンピュータを見つけるけど、1台のコンピュータ内で複数のネットワークプログラムが動いていた時、どのプログラムと通信するのか区別する必要がある。そのための情報がポート番号。IPアドレスを電話番号に例えるなら、ポート番号は内線電話番号みたいなもの。
このポート番号は、プログラムによって番号は◯◯を使うべき…という値が決まっている(よく知られたポート番号)。Webサーバ(HTTP)は80番、Webサーバ暗号版(HTTPS)は443番、メールサーバ(SMTP)は25番….。
ポート番号で接続するサービスが決まるけど、学内だけで外に見せたくないWebサーバなどがある場合は、ファイアウォールで特定のポート番号を流通させないようにする場合もある。そういう場合には、通常のポート番号以外を使って通信することがある。
Webサーバに接続する時には、80番を使いたくない場合には、http://コンピュータ名:ポート番号/ と URL にポート番号付きで指定することもできる。
ポートスキャン
このポート番号が解らない時は、ポートスキャンというツールがある。ポート1番で通信してみる、ダメなら2番…という繰り返しをしてくれるツール。一番有名なツールが、nmap。ウィルスなどが仕掛けられて、外部からのネットワーク接続を受ける状態(バックドアが仕掛けられた状態)になったのを見つけるのが本来の使い方。
nmap は通常インストールされない(こんな危ないツール普通はシロートに使わせるものではない)。使いたい場合は、
$ sudo apt-get install nmap
((( 基本的使い方 ))) $ nmap [オプション] 接続先 $ sudo nmap tsaitoh.net # サーバ tsaitoh.net を調べる $ sudo nmap -A tsaitoh.net # ソフトの種類も調べてくれる。
ポート番号が解って、そのサーバソフトに接続してみる場合、telnet がよく使われる。
本来は、ネットワークの先のコンピュータを操作するためのソフト(リモート接続23番ポート)だけど、通信を暗号化しないため、セキュリティ的には危険なので、リモート接続用途で使うことは少ない。
Windowsでは、telnetは初期状態でインストールされない。unix で telnet を使いたい場合は、
$ sudo apt-get install telnet
((( 基本的使い方 ))) $ telnet コンピュータ名 [ポート番号] $ telnet tsaitoh.net 80 # 80番ポート(HTTP)に接続 GET / # トップページのHTMLが帰ってくる。 $ telnet tsaitoh.net 25 # 25番ポート(SMTP)に接続 QUIT # 接続を切る
隠れたデータ
ウィルスなどにコンピュータに感染させる場合、ファイル名などを偽っってあったりするので、ファイルの種別を調べたり、その中の命令を分析する必要がある。その場合によく用いる基本コマンド。
((( 基本的使い方 ))) $ file ファイル名 # 指定したファイルが何か簡単に調べてくれる。 $ file a.out # a.out の中身を調べる $ strings ファイル名 # ファイルの中身の文字として表示できるものを表示する。 $ strings a.out # a.out の中の文字情報を抽出 $ nm ファイル名 # オブジェクトファイルのシンボル(関数名や変数名)を表示 $ nm a.out # stripされたa.outでは抽出できない。
逆アセンブル
実行プログラムがどのような処理をしているのか内容を見たい場合は、逆アセンブル(機械語をアセンブリ言語に変換)する。ただし、一般的な実行プログラムでは、関数番地や変数名番地の情報が消されているので、OS の仕組みの知識が必要。
簡単に解析をするのであれば、objdump などを使うことが多い。ここでは、gdb を紹介する。
gdb(GNU Debugger)は、Cコンパイラ(gcc = GNU C Compiler)のためのデバッガ。linux だとプログラムが異常終了すると、coredump(実行時のメモリ内容を出力する機能) するので、この情報でプログラムの異常処理を探す時に使う。
デバッガは通常はインストールされないよな。
$ sudo apt-get install gdb
((( 基本的使い方 ))) a.out は、何らかのC言語のソースで事前に作っておくこと。 | // helloworld.c | #include <stdio.h> | int main() { | printf( "Hello World¥n" ) ; | return 0 ; | } $ gcc helloworld.c $ gdb a.out (gdb) break main # main にブレークポイントを設置 (gdb) run # プログラムを実行 (gdb) step 10 # 10行分処理を実行 (gdb) disas main # main 以降を逆アセンブル (gdb) quit ((( 異常処理とその場所を見つける ))) 異常終了するプログラムの例 | // segv.c | #include <stdio.h> | int main() { | *((int*)NULL) = 123 ; # 0番地にデータを書き込む | return 0 ; | } $ gcc -g segv.c # コンパイル時に名前情報を実行プログラムに埋め込む。 $ ulimit -c unlimited # coredump 機能を有効にする $ ./a.out Segmentation fault (コアダンプ) $ gdb a.out core # 異常終了した行が表示される
Perl CPAN更新溜まってた
Perl の CPAN モジュールが溜まってた。
過去メモに沿って、更新
(( アップデート可能なモジュールを一覧 )) # perl -MCPAN -e 'CPAN::Shell->r' (( 全部をアップデート )) # perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'
iphoneの検知難しい
大学でアパート住まいの子供が、帰っているのか確認するために、LINE beacon を置いて検知を試したけど、bluetooth を切って既読スルーなヤツなので、ほとんど検知することができない。
そこで、アパートでは無線LANルータを使ってるし Raspberry-Pi で、arpalert を使えば簡単に検知できるだろうと、実験中。でも iPhone はセキュリティ対策なのか、 arp の返答は必要最小限なので同じサブネットとはいえ、そのままでは通信の必要の無い raspberry-pi には、ARP 情報が送られてこない。また ping には返答しないようで、単純に ping で確認も困難。ということで単純な arpalert では検知が難しいなぁ。
定時処理で、”arping -c 1 -I wlan0 IPHONEのIPアドレス” を実行させて、強制的に ARP を送ってもらうか…
cec-clientのデバイス番号とアドレス番号
自宅では、テレビやケーブルテレビチューナーやレコーダを赤外線リモコンで制御できるようにしているが、電源はトグル動作でON→OFFかOFF→ONという制御ができない。そこで、HDMI端子経由のチャンネル制御を行っている。
この際に、デバイス番号とcecのアドレス番号を使うが、デバイス番号が時々変化している。
しかたがないので、cecのscan処理でデバイス番号とアドレス番号の対応情報を保存するようにしてみた。
#!/usr/bin/perl my $cec = "/usr/bin/cec-client -d 1 -s" ; open( my $fd , "/bin/echo 'scan' | $cec |" ) || die( "Can't open $cec\n" ) ; open( my $ft , "> /home/xxxxxxxx/lib/cec-table.sh" ) || die( "Can't open cec-table.sh\n" ) ; my $device = "" ; my $dev_str = "" ; my $address = "" ; my $osd_str = "" ; print $ft "#!/bin/bash\n" ; while( my $line = <$fd> ) { if ( $line =~ /^device\s+#(\d+):\s+(.*?)$/ ) { $device = $1 ; $dev_str = $2 ; } elsif ( $line =~ /^address:\s+(\d+)\.0\.0\.0$/ ) { $address = $1 ; } elsif ( $line =~ /^osd\s+string:\s+(.*?)$/ ) { $osd_str = $1 ; print $ft "DEV[$address]=$device\n" ; print $ft "OSD[$address]=\"$osd_str\"\n" ; } } close( $fd ) ; close( $ft ) ;
stretchで起動しづらい
自宅で色々と動いている Raspberry-Pi 。OS更新はまめにやっているけど、外気温測定に使っているのが Jessie のままだったのに気づく。stretch に上げたけど、どうも起動に失敗する。更新に失敗したかと思ったけど、キーボードをつなぐために USB WiFi を抜いて起動すると、普通に動いている。
今までも、多少 boot が不安定なのはあったけど、stretch になって起動シーケンスが最適化されたのか、WiFi 有効化のタイミングが早まり、ブート時の電力不足が発生していると思われる。
ひとまず、改造面倒だし USB WiFi を抜いて、boot がそれなりに進んでから USB を指して対応。
アマチュア無線: aprx を動かしてみた
知り合いより譲り受けた、TH-D72を活用したいということで、APRS の iGate 局を動かしてみた。
我が家は、ロケーション的に福井市にあるリピータにも、ハンディ機では接続できず、無線機の位置情報などをインターネットに伝えることができる APRS や、インターネットを経由した通話ができる D-STAR などを、あまり活用することが難しい。
aprx を動かす
そこで、TH-D72 を APRS の iGate 局として動かすために、aprx をインストール。
以下のように設定したけど、まずい所がないか要チェックだな。ひとまず、データ流しまくりでaprsインターネット側には、迷惑をかけていないはず。ハンディ機なので、どのあたりまで電波が飛んでいるのか、チェックしてみよう。
$ sudo aptitude install aprx $ sudo vi /etc/aprx.conf $ sudo systemctl enable aprx.service $ sudo systemctl start aprx.service
# /etc/aprx.conf mycall JR9PVZ-10 myloc lat 3553.48N lon 13613.33E <aprsis> passcode 22202 server rotate.aprs2.net </aprsis> <logging> pidfile /var/run/aprx.pid rflog /var/log/aprx/aprx-rf.log aprxlog /var/log/aprx/aprx.log dprslog /var/log/aprx/dprs.log </logging> <interface> serial-device /dev/ttyUSB1 9600 8n1 KISS initstring "HBAUD 9600\x0dKISS ON\x0dRESTART\x0d" alias RELAY,WIDE,TRACE callsign $mycall # callsign defaults to $mycall tx-ok true # transmitter enable defaults to false telem-to-is false # set to 'false' to disable </interface> <beacon> beaconmode both cycle-size 60m beacon symbol "I#" $myloc comment "Tx-iGate + Digipeater" </beacon> <digipeater> transmitter $mycall <source> source $mycall </source> </digipeater>
TH-D72の設定
[TNC]-[TNC] | KISSモード | |
[メニュー]-310 | データバンド | A-BAND |
[メニュー]-311 | パケットスピード | 9600 bps |
— | 無線周波数 | 144.640 MHz |