カテゴリーアーカイブ Linux

著者:杉浦

【Linux】xxdコマンドでバイナリファイルを16進数で表示、16進数からバイナリファイルを構築

 バイナリファイルを扱う時、特に面倒なのは読み書きにバイナリ専用の道具が必要になることです。16進数表記のテキストにすることで一気に操作しやすくなります。Linuxのコマンドを用いるならば次のようにこれを実現できます。リンクはDebianですが大体同じ感じで他の色々なLinuxデストリにも入っているようです(手元のGit Bashでもできました)。
xxd(1) — xxd — Debian unstable — Debian Manpages

xxd -p ファイル名

 これを使うだけで次の様にバイナリファイルが16進表記で表示されます。これを読みやすい様2^n文字区切りにして保存すればそれでOKです(自分の場合、リダイレクトでファイル化→手元のサクラエディタで弄る、としています)。そうすればバイナリファイルのフォーマットのリファレンスと快適ににらめっこして作業を進められます。

 似たような16進表記用コマンドにhexdump, odというものもあります。
 編集した後の16進表記ファイルをバイナリファイルに再構築する必要もあります。これは次のコマンドでできます。

xxd -r -p 16進表記ファイル名 出力されるバイナリファイル名

 オプションもろくに覚える必要もなく実に簡単です。

  • この記事いいね! (1)
takahashi 著者:takahashi

Certbotで証明書の更新後に自動で特定の処理をさせる方法

無料でSSL証明書を発行してもらえるサービスであるLet’s Encryptですが、同時に更新とSSL証明書の設定の自動化を行うCertbotという仕組みを提供しているのも特徴です。

このCertbotですが、いくつかプラグインがあり、ワイルドカード(任意のサブドメインに適用できる)SSL証明書を取得しない場合、メインで使用しているWebサーバー向けのCertbotプラグインを使用すると、自分の方で細工しなくても、Webサーバーを停止することなく自動で取得時の認証や証明書の適用を行ってくれます。

ただ、ワイルドカード証明書の場合はDNS-01という、ドメインを登録しているDNSサーバーを使用した認証方法に限定されてしまうため、上記のようなWebサーバー向けのプラグインを使用することができません。

この場合、ワイルドカード証明書を取得時、もしくは更新時にSSL証明書のインストールや差し替えは行われますが、Webサーバーへの自動適用は行われません。

この状態のままだと、せっかくSSL証明書を自動で更新できても、自動でWebサーバーに読み込まれないため、”いつの間にか期限切れになってた…”なんて状況が発生してしまうことになります。

そこで、僕の場合はSSL更新時に合わせてWebサーバーを自動的に再起動できるように、スクリプトを次のようにしていました。

/usr/bin/certbot renew --force-renew >> /var/log/letsencrypt/ssl-renew.log 2>&1 && service webサーバーのサービス名 restart >> /var/log/letsencrypt/ssl-renew.log 2>&1

ただこの方法では、まれにSSL更新とWebサーバーの再起動のタイミングが悪く、Webサーバーの再起動が失敗してしまうことがありました。

SSL更新からWebサーバー再起動の間で数秒間マージンを置くことで一応はちゃんと動作するようになったのですが、あくまで固定した秒数待つだけで、SSLの更新状態のチェックなどは行っていないため、必ずしも対策できているとはいいがたい状況でした。

さてどうやればうまくできるかなーと考えていたところ、実はCertbot自体に、処理完了後に特定のコマンドを実行させることができる機能があることを知りました。

例えば、証明書取得時のコマンドに

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory

のようにするかと思いますが、このコマンドに

--post-hook="実行したいコマンド"

のようなオプションを付加することで、SSL取得処理終了後に指定したコマンドを実行してくれます。

例えば、証明書取得終了後にnginxを再起動させたい場合は

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory
--post-hook="service nginx restart"

のようにすると、SSL取得処理が終了した時点でnginxを再起動させることができます。

取得時に指定したオプションはcertbotの設定ファイルに記録されるため、2回目以降の更新時では

sudo certbot renew

とするだけでpost-hookも含めて処理してくれるようになります。

なお、このpost-hookはssl証明書の処理が完了したら、失敗・成功にかかわらず実行する、という指定になってますが、処理前に実行させたり、証明書更新が行われた後のみ実行、といった指定も可能となっているようです。

Let’s EncryptのSSL証明書更新時にサービスを再起動する – Qiita

このあたりの設定をうまく使えば、運用がより楽になりそうですね。

  • この記事いいね! (0)
著者:ym

CentOS 8 rel.

先日9月24日に CentOS 8 の正式リリースの案内がありましたね。

[CentOS-announce] Release for CentOS Linux 8 and CentOS Streams

https://lists.centos.org/pipermail/centos-announce/2019-September/023449.html

CentOS-8 (1905) リリースノート

主な変更点

ネットワーカーな部分としては iptables → nftables と変化しているあたりは見ておこうと思います。

CentOS 7 自体はあまり触る機会がないまま CentOS 8 を使う事になりそうです。

  • この記事いいね! (1)
takahashi 著者:takahashi

LinuxでCPUやマザーボードから温度を取得する方法

Linuxでは標準で(マシンのマザーボードやCPUなどが対応していれば)簡単に温度センサーの値にアクセスできる仕組みがあるようです。

cat /sys/class/thermal/thermal_zone数字/temp

などとすると、マザーボード上に存在する何かしらの温度センサーの値を拾うことができるようです。

ただし、センサーの値が読み取れるファイルの位置やディレクトリ構造などはマシンによって異なるため、じぶんでそれっぽい場所を探す必要があります。

$ cat /sys/class/thermal/thermal_zone0/temp
27800

上記の例の場合は、27800と出ていますが、これは27.800℃を表しているようです。

自分の環境の場合は

$ cat /sys/class/thermal/thermal_zone0/temp
27800
$ cat /sys/class/thermal/thermal_zone1/temp
29800
$ cat /sys/class/thermal/thermal_zone2/temp
44000

といった形で3か所のセンサーの値を読み取ることができました。

ただ、どの値がどの部分の温度なのかはマニュアル等を見ないと知ることができないのが難点です。

CPUの温度を知る方法もありました。

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_label 
Package id 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input 
44000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_label 
Core 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input 
42000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_label 
Core 1
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input 
43000

こちらはlabelも用意されていたため、どの温度なのかわかりやすかったです。

なお、どのセンサーが存在しているのか、どの温度がどの部分のものなのかを正確に知りたい場合はLinux向けの温度チェックツールを使うとわかりやすそうです。

lm_sensors – Arch Linux

参考サイト:

LinuxでCPUの温度を取得する – Qiita

LinuxでCPUの温度やファンの回転数を取得する – パソコン鳥のブログ

  • この記事いいね! (0)
takahashi 著者:takahashi

WSL上のLinuxでGUIを動かす方法

Windows上でLinux環境を動作させることができるWSLですが、実はGUI環境もインストールできることはご存知でしょうか。

今回はUbuntu・KaliLinuxにデスクトップ環境の一つであるXFceをインストールする方法をご紹介します。

まず、デスクトップ環境を起動する予定のあるユーザーの

~/.bashrc

ファイルをviなどで開き、ファイルの先頭に下記のように追記します。

export DISPLAY=:0.0 #display番号
export LIBGL_ALWAYS_INDIRECT=1

次に、必要なパッケージをインストールします。下記のコマンドを一行ずつ実行します。
なお、実際にパッケージをすべてインストールしたところ、2GB前後消費したので、PCに十分な空き容量があるかあらかじめチェックしておいてください。

sudo apt update
sudo apt upgrade
sudo apt install xfce4-terminal #Xfce4上で動作するターミナルアプリ
sudo apt install xfce4 #xfce4本体
sudo apt install fonts-takao #日本語用フォント(これがないと文字化けする)

インストール中に言語をどうするか聞かれるので、”日本語”を選択します。

インストールが完了すれば、Linux側の最低限のセットアップは完了です。

次にWindows上でLinuxのGUIが表示できるように準備します。

LinuxOSのGUIをWindowsで動作させるためにはWindows上で動作する”Xサーバー”が必要になるのでインストールします。

Windows用のXサーバーアプリはいくつかあるようなのですが、僕は”Xming”を使用しました。

Xming X Server for Windows – OSDN

リンク先ページのダウンロード一覧から

Xming-X-X-X-X-setup.exe

のような名前になっているファイルをダウンロードし、インストールします。

インストールが完了したら、”XLaunch” アプリを起動します。

赤枠の”One window”を選択し、Display numberを先程~/.bashrcに指定したdisplay番号と同じ番号(例: “0.0”なら0、”1.0″なら1)に合わせます。

以降の設定は最後の画面まで何も変更せずに”次へ”をクリックします。

上のような、最後の画面になったら、Save configurationをクリックすると、ここまでの設定内容をファイルに保存しておくことができ、次回以降はファイルを開くだけで設定した内容でXサーバーを起動できます。

configurationファイルの保存が完了したら、Xmingがすでに起動していないのを確認した上で”完了”をクリックします。

下の画像のような画面が表示されたら、準備完了です。

この状態で、Windows上からWSLのコンソールを開き、下記のコマンドを実行します。

startxfce4

すると、先程Xlaunchで起動したウインドウにXfceの画面が表示されます!

一見、見た目はかなり綺麗にでていて驚きました。

Windows上でLinuxがVMを通さずに動いているのを目の当たりしてしまうと、なかなか不思議な感覚になりますねw

ただし、完全に動作できるかというとまだまだ不具合もあるようで、なぜかChrome系のブラウザが起動できなかったり、ダブルクリックでファイルが開けなかったりなどの不具合があるようです。

これらについては今回参考にさせていただいた記事に緩和策も紹介されていましたが、完全には解決することはできないようです。

しかし次のWindows10 の大型アップデート(20H1) で、WSL2が搭載され、”本物”のLinuxカーネルが利用できるようになるとのことだったので、もしかするとこういった問題も解消するかもしれません。

Windows上でGUIも動かせるとなれば、余分なリソースを消費して仮想マシン上にLinuxをインストールすることなくほぼ実物に近いLinux環境をWindows上で動かせるということになり、開発もかなりしやすくなりそうですし、デュアルブートも必要なくなってくるかもしれませんね。

今後の展開が楽しみです。

参考: WSLでwindows上にLinuxのGUI環境を作る[メモ] – Qiita

  • この記事いいね! (0)
takahashi 著者:takahashi

Microsoftが正式にLinuxのexFAT対応を支援

HDDやSSDなどのストレージ上でファイルの管理の仕方を定義する”ファイルシステム”の一つとして、exFATと呼ばれるものがあります。

このexFATは昔Windows上でよく使われていたFAT32というファイルシステムを拡張したものです。

FAT32にはほかのモダンなファイルシステムと比較して、いろいろと難点がありました。

  • 4GBまでのファイルしか保存できない
  • 実質2TiB(厳密な1024進数上での2TBのこと)までのパーティションしか扱えない
  • 圧縮、暗号化機能なし
  • ジャーナリング機能なし

ジャーナリング機能がないためファイルシステムが破損しやすく、また、保存できるファイルの大きさにも制限がありました。

ただ、FAT32はほかのファイルシステムの中でも、Windows以外の多くのOSで実用的なレベルでサポートされている数少ないファイルシステムでもあります。
(NTFSも一応MacOSやLinuxでも使えますが、これらのOSで標準で使われるNTFS-3Gドライバは、実はNTFSを完全にサポートしておらず、Windowsで使用しているときと比較してリスクがあるらしいです。)

そんな中、MicrosoftはFAT32の改良版として、exFATというファイルシステムをリリースしています。

このexFATでは、モダンなファイルシステムにあってFAT32にはなかった性能や機能が盛り込まれています。

  • ファイルあたりの容量制限は16EiBに増加(現状のハードウェアでは1ファイル16EiBのファイルは事実上作成できないため実質無制限)。
  • 16 EiBまでのパーティションを扱える
  • ジャーナリング機能を搭載⇒FAT32と比較してデータが壊れにくい。
  • FAT32と比較して読み書きが高速

上記のように、FAT32と比較して、最新のマシンでも問題なく使えるレベルまでには進化しました。

ただ、FAT32と比較した唯一の欠点が、Linuxでのサポートがいまいちだった点です。

例えば、Linux上で視覚的にパーティションの編集やディスクのフォーマットができる gparted ではNTFSは何とか操作できますが、exFATは作成することすらで着ない状況でした。

そんなexFATですが、先日Microsoftから、Linux上でexFATをちゃんと扱えるようにするための実装の支援を公式に行うことが発表されました。

Microsoft、Linuxカーネルで公式に「exFAT」サポート – ITMedia News

うまくいけば、Linuxカーネル上でも標準でexFATがサポートされ、どのOSでも扱うことができる安全なファイルシステムとして利用できる状態になるかもしれません。

USBメモリなど、最近はOSを問わずファイルを移動したい場合も非常に多くなっているので、こういった対応はとてもありがたいですね。

公式サポートのリリースが楽しみです。

  • この記事いいね! (0)
著者:杉浦

【Linux】ほぼワンライナーで中身の伴ったファイルを作る

 SSHしてタイミングや画面の状態を考慮せず一行コマンドのスパムだけで環境構築したい時なんかに使えます。エディタを開くのもファイルのアップロードのための権限を得るのも面倒だけどsudoとコマンド送信はできるみたいな時、特に使えます。
 echoの結果をファイルに出力することで実現します。例えば次の様にシェルスクリプトのファイルを作れます。

set +H
echo -e "#!/bin/sh\n/home/pi/RTKLIB/app/str2str/gcc/str2str -in serial://ttyACM0:115200 -out tcpsvr://:12345\n" | sudo tee /opt/str2str_tcp_svr.sh

 以下解説です。
 一行目のset +Hはヒストリ参照の無効化のためのコマンドです。シェルには!hogeの様に打つと最近使ったhogeから使ったコマンドを呼び出す機能があります。面倒なオプションをコピペするよりもサクサク操作できるなど利点がありますが今回は邪魔になりがちです。シェルスクリプトファイルを生成したい時、先頭の#!/bin./shを誤って解釈していしまうので無効化します。setはヒストリ参照以外にも多くのオプションの制御ができます。
 二行目の-eは改行の有効化(\nが改行コードと扱われるようになる)です。これで複数行にわたるファイルの中身を表現します。ファイルをどこかで下書きした後に改行コードを文字列\nに置換すると楽です。
 できあがったファイルの中身をsudo tee [ファイル]で吐き出します。sudoのため権限絡みのファイル生成問題を避けられます。teeは次の通りのコマンドでパイプで渡された標準入力であるechoの中身をファイルに書き込みます。標準出力(画面とか)にも出力されるため書き込み内容も見やすい形で確かめられ安全安心です。

$ tee --help
使用法: tee [オプション]... [ファイル]...
標準入力を各 FILE にコピーし、標準出力にも出力します。

  -a, --append              指定されたファイルに追加し、上書きしない
  -i, --ignore-interrupts   割込みシグナルを無視
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

FILE に - を指定した場合、標準出力に再度コピーします

GNU coreutils online help: 
tee の翻訳に関するバグは  に連絡してください。
完全な文書を参照する場合は info coreutils 'tee invocation' を実行してください。
  • この記事いいね! (1)
takahashi 著者:takahashi

Linux系OSでタイムゾーンを変更する方法

OSに設定されているタイムゾーンが自分の使用したいものと異なっている場合、数時間時刻がずれてしまうことになるので、いろいろ困ることがあります。

そういった場合はタイムゾーンを設定しなおさないといけません。

Linuxでのタイムゾーンの変更方法をご紹介します。

/usr/share/zoneinfo

を見ると

$ ls /usr/share/zoneinfo
Africa      CET      Egypt    GMT+0      Iran       MST7MDT  Pacific    UCT          leap-seconds.list
America     CST6CDT  Eire     GMT-0      Israel     Mexico   Poland     US           localtime
Antarctica  Canada   Etc      GMT0       Jamaica    Msft     Portugal   UTC          posix
Arctic      Chile    Europe   Greenwich  Japan      NZ       ROC        Universal    posixrules
Asia        Cuba     Factory  HST        Kwajalein  NZ-CHAT  ROK        W-SU         right
Atlantic    EET      GB       Hongkong   Libya      Navajo   Singapore  WET          zone.tab
Australia   EST      GB-Eire  Iceland    MET        PRC      SystemV    Zulu         zone1970.tab
Brazil      EST5EDT  GMT      Indian     MST        PST8PDT  Turkey     iso3166.tab

あらゆるタイムゾーンの設定が書かれたファイルが置かれています。

これらは名前のタイムゾーンの設定がそれぞれ入っているので、設定したいタイムゾーンファイルのリンクを/etc/localtimeとして張ります。

ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

(日本語時間に設定する場合)

ただ、この設定では再起動時に変更する前のタイムゾーンに戻されてしまうようなので、永続化させるためには
/etc/sysconfig/clock
下記のように変更します。

ZONE="Asia/Tokyo"
UTC=false

これで設定完了です。

【Linux】タイムゾーン(Timezone)の変更 – Qiita

  • この記事いいね! (0)
著者:杉浦

【Linux】複数ディレクトリにまたがって特定の正規表現に当てはまるの最新のファイル一つのパスを得るコマンド

 Linuxのコマンドはかなり機械語に近いところで最適化されており高速です。PHPのファイルシステムを介していては遅いと言わざるを得ないような場面でもコマンドをexecすれば高速です(プログラム実行関数を扱う際は文字列のエスケープなど対策を忘れないようにする必要があります。任意コード実行のセキュリティホールに繋がるので細心の注意が必要です)。
 とある単一のディレクトリの中で最新をとってくるのは簡単です。

ls -lt ./* | grep -e \.ほしいファイルの拡張子$ | head -n 1| awk '{print $NF}'

lsコマンドのtオプションはファイルを最終更新日時順に表示します. grepでほしいファイル種別に表示を絞り込みます。headコマンドの-n 1で最初の一行のみの表示を取得します。awkの$NFには区切られた文字の内の最後が入ります。結果次の様にファイルのパスが出力されます。

複数ディレクトリはちょっと手間です。ls dirA/* dirB/*とするとディレクトリごとの結果が出てくるのでまとめてソートする必要があります。

ls -l --full-time dirA/* dirB/* dirC/* | grep -e \.ほしいファイルの拡張子$ | sort -k 6,7 -r | head -n 1| awk '{print $NF}'

lsの–full-timeオプションで日時表示をソートしやすい形(なしだと月日で手間)にして出力。sortで6,7列目(-k 6,7)の日時を降順(-r)でソートします。最後はディレクトリ一つの時同様にhead -n 1| awk ‘{print $NF}で完成です。

  • この記事いいね! (1)
takahashi 著者:takahashi

Kali Linuxの言語を日本語化する方法

ペネトレーションテストツールを多数収録している、セキュリティ系ハッカー御用達(クラッカーではない(←重要))のLinuxディストリビュージョンとして有名なKali Linuxですが、実はWindowsのWSLでも利用可能になっています。

このWSL版Kali Linuxですが、以前ご紹介したWSL版Ubuntuと同様、デフォルトでは言語が英語になっていますが、日本語化を行うこともできます。

ただし、同じDebian系とはいえUbuntuと手順が異なっているので注意です。

Kali Linuxで日本語化を行うには”locales”というパッケージが必要です。

入っていない場合はまずインストールをします。

sudo apt update
sudo apt install locales

locales のインストールが完了したら、下記のコマンドを実行します。

sudo dpkg-reconfigure locales

下記のような画面が出てくるので、ja_JP.UTF-8 UTF-8 を選択します。(スペースキーで選択できます。)

選択したらTABキーを押して<OK>の部分が赤くなったらEnterキーを押します。

次にシステムの標準言語を選択する画面が表示されますので、

こちらでも”ja_JP.UTF-8″を選択し、Tabキー->OKでエンターキーを押します。

これで設定完了です。

あとは一度ターミナルを開きなおし、何かコマンドを実行すると…

日本語に対応しているコマンドであればバッチリ日本語に切り替わっています。

Kali Linuxを日本語で使いたい方はぜひ試してみてください。

Change language of installed Kali

Docker debian系のlocaleを日本語化する – Qiita

  • この記事いいね! (0)