diff コマンド

コマンド概要

ファイルを比較し差異を表示する。

コマンドオプション

-q
差異があるファイルのみを表示
-r
サブディレクトリを再起的に処理
-N
存在しないファイルを空ファイルとして比較処理

コマンドサンプル

2つのディレクトリに差異がないかを確認

ファイルサーバーの引っ越しのために全てのファイルを古い NAS から新しい NAS へコピーしました。コピーした後にコピーされていないファイルがないかを確認しました。

diff -qrN /Volumes/SOURCE_DIR/ /Volumes/DEST_DIR/

参考

rsync コマンド

コマンド概要

ディレクトリの内容を丸ごとコピーする。

コマンドオプション

-a
アーカイブモード。-rlptgoD と同等。(注意: -A,-X,-U,-N,-H は含まれない)
-r
ディレクトリを再帰的に処理する
-l
シンボリックリンクをシンボリックリンクとしてコピーする
-p
パーミッションを保持する
-t
更新日時を保持する
-g
グループを保持する
-o
オーナーを保持する (root 権限で実行時のみ)
-D
–devices –specials と同等
–devices
デバイスファイルを保持する (root 権限で実行時のみ)
–specials
スペシャルファイルを保持する
-h
表示される数値に単位を付与して読みやすくする
–delete
コピー先に存在するがコピー元には存在しないファイルを削除する
–info=progress2
全コピー作業の総合的な進捗のみを出力する (バージョン 3.1.0 以降)

コマンドサンプル

ファイルサーバーの引っ越し

ファイルサーバーの引っ越しのために全てのファイルを古い NAS から新しい NAS へコピーしました。

rsync -ah --delete --info=progress2 /Volumes/SOURCE_DIR/ /Volumes/DEST_DIR

参考

7 Days to Die サーバーをインストール (Ubuntu 18.04 LTS)

サーバー
Network Presence – VALUE SSD VPS #2E
CPU
2コア + 2コア(追加) → 4コア
メモリー
8GB
OS
Ubuntu Server 18.04.4 LTS 64Bit
パッケージ バージョン
steamcmd 0~20130205-1

steamcmd をインストール

32 bit 用のリポジトリを追加

64 bit の Ubuntu を使っている場合は、steamcmd のパッケージをインストールできないので、以下のコマンドでリポジトリを追加します。

$ sudo add-apt-repository multiverse
$ sudo dpkg --add-architecture i386
$ sudo apt update

steamcmd をインストール

以下のコマンドで steamcmd をインストールします。

$ sudo apt install lib32gcc1 steamcmd

steamcmd を操作するユーザーを作成

以下のコマンドで steamcmd を実行するユーザーを作成します。

$ sudo useradd -r -m -U -s /bin/bash steam

7 Days to Die サーバーをインストール

以下のコマンドで steam ユーザーで steamcmd を起動します。初回の起動時にはアップデートまず開始されます。

$ sudo su - steam
$ steamcmd

しばらくすると、アップデートが終了して “Steam>” で始まる steamcmd のコンソールが開始します。 

匿名ユーザーでログインし、7 Days to Die の専用サーバー (ID:294420) をインストールします。

サーバーのバージョンを指定する場合は “-beta” オプションで指定します。a19.2 をインストールする場合は “-beta alpha19.2” を追加します。無効なバージョンを -beta オプションで指定すると最新版がインストールされます。

Steam> login anonymous
Steam> force_install_dir /home/steam/7dtd/
Steam> app_update 294420 -beta alpha19.2
Steam> quit

以下のエラーメッセージが出た場合は、ディスクの容量が不足しています。

Error! App '294420' state is 0x202 after update job.

設定ファイルを変更

サーバーを起動

以下のコマンドでサーバーを起動します。

$ cd ~/7dtd
$ ./startserver.sh  -configfile=serverconfig.xml

参考

Sourcetree で diff ツールが起動しなくなる問題

mac 版の Sourcetree の外部 diff ツールがいつの間にか開かなくなっていました。

Xcode に付属している FileMerge を外部ツールとして使えるように設定しなおします。

実行環境

OS
macOS Catalina Version 10.15.7
Sourcetree
Version 4.0.2 (236)

症状

ファイルを右クリックして “External Diff” をクリックしても FileMerge が開きません。

対策

Sourcetree の Preferences を開いて、Diff タブを開きます。

Visual Diff Tool で Custom… を選び、Diff Command と Arguments に以下を入力する。

/Applications/Xcode.app/Contents/Applications/FileMerge.app/Contents/MacOS/FileMerge
-left $LOCAL -right $REMOTE

MS Office Home & Business 2019 で必要なアプリだけをインストールする

信じられない事ですが、どうやら Microsoft Office 2019 では、必要なアプリのみを選択してインストールするということができないらしい・・。以前のバージョンであれば、インストールする時に選択できたのですが・・。

一応、不可能ということではなく、Office Deployment Tool という企業向けのツールを使って、XML に設定を書く事でインストールするアプリケーションを選択することが可能です。

今回は Microsoft Office Home & Business 2019 を Outlook と OneNote を除いてインストールしました。

実行環境

OS
Microsoft Windows [Version 10.0.19042.630] 64bit

Office Deployment Tool の準備

Office Deployment Tool をダウンロードして実行します。どこにファイルを解凍するのかを選択します。

解凍先のフォルダを開いて、”configuration-Office365-x64.xml” をエディタで開き、以下の内容に置き換えます。

<Configuration>
  <Add OfficeClientEdition="64" Channel="Monthly">
    <Product ID="HomeBusiness2019Retail">
      <Language ID="en-us" />
      <!-- <Language ID="ja-jp" /> -->
      <ExcludeApp ID="Access" />
      <!-- <ExcludeApp ID="Excel" /> -->
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="Lync" />
      <ExcludeApp ID="OneDrive" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Outlook" />
      <!-- <ExcludeApp ID="PowerPoint" /> -->
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="Teams" />
      <!-- <ExcludeApp ID="Word" />	 -->
    </Product>
  </Add>
</Configuration>

<Product ID=”HomeBusiness2019Retail“> の部分は、所持しているライセンスに対応する ID を指定しないとアクティベートできなくなります。 このページで指定可能な ID の一覧が見られます。

<ExcludeApp ID=”Outlook” /> で Outlook を除外しています。Excel、Power Point、Word のみがインストールされるように設定しました。

その他のオプションもあります。

Office をインストール

PowerShell を開き、Office Deployment Tool を解凍したフォルダへ移動します。

以下のコマンドで設定ファイルを指定して Office をインストールします。

.\setup.exe /configure .\configuration-Office365-x64.xml

後はインストールが終わるのを待つだけです。ちなみに、インストール中にインストールしているアプリケーションが表示されています。

Office Deployment Tool を使ってインストールした場合
標準のインストーラーでインストールした場合

すでにインストールしたアプリケーション

すでに不要なアプリケーションをインストールしてしまった場合は、上記の方法で再インストールすれば、不要なアプリケーションは自動的にアンインストールされます。Office を一度丸ごとアンインストールする必要はありません。

参考

CapsLock キーを Ctrl キーに変更する

CapsLock キーが邪魔すぎるので CapsLock キーを Ctrl キーに変更して、ダブル Ctrl キー状態にしてしまいます。

実行環境

OS
Microsoft Windows [Version 10.0.19042.610] 64bit

レジストリの変更

以下の内容をテキストファイルに保存して、拡張子を .reg に変更して実行します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

OpenWrt にユーザーが SSH でログインした時にメールで通知する

予期していない SSH ログインを検知するために、 SSH でユーザーがログインした時にメールで通知を行うようにしました。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 19.07.3
パッケージ バージョン
msmtp 1.8.7-2

msmtp をインストール

ルーターからメールを送信するために SMPT クライアントをインストールします。

Postfix のような完全な MTA をインストールすることもできますが、ソフトウェアのサイズが大きい、定期的なディスクアクセスが発生する等の OpenWrt で使うには不向きな点があります。このため、SMPT クライアントから外部のメールサーバーを経由してメールを送信します。

以下のコマンドで msmtp をインストールします。

# opkg update
# opkg install msmtp

ファイル /etc/msmtprc を編集して以下の行を追加、変更します。パスワードを平文で設定ファイルに書くことになるので、 msmtp のために新しく送信専用のフリーメールアドレスを取得しました。

host           smtp.gmail.com
port           587
from           username@gmail.com
auth           on
user           username
password       PASSWORD

gmail を使う場合は以下のような設定ファイルになります。PASSWORD は記号を含まない英数字が無難です。

# Example for a system wide configuration file

# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default

# The SMTP smarthost
host smtp.gmail.com

# Use TLS on port 465
port 587
tls on
tls_starttls off

# Construct envelope-from addresses of the form "user@oursite.example"
from username@gmail.com

auth on
user username
password PASSWORD

# Syslog logging with facility LOG_MAIL instead of the default LOG_USER
syslog LOG_MAIL

一般ユーザーでもメールが送信できるようにするために設定ファイルのパーミッションを変更します。

# chmod 644 /etc/msmtprc

msmtp は sendmail コマンドと互換性があるので、シンボリックリンクを設置して sendmail コマンドとしても使えるようにします。

# ln -s /usr/bin/msmtp /usr/sbin/sendmail

以下のコマンドでメール送信のテストをします。”Sender’s Name <username@gmail.com>” と recipient@gmail.com で送信元と受信先を指定します。

# echo -e "Subject: Test mail\n\nThis is a test mail." | sendmail -f "Sender's Name <username@gmail.com>" recipient@gmail.com

メール送信スクリプトを設置

メール送信を行うスクリプト notify-login.sh を以下の内容で作成します。HOST_NAME、RECIPIENT、SENDER を変更して下さい。

#!/bin/sh

HOST_NAME="hogepiyo.com"
RECIPIENT="recipient@gmail.com"
SENDER="OpenWrt <username@gmail.com>"

SOURCE_IP=`echo $SSH_CONNECTION | cut -d " " -f 1`

MESSAGE="To: $RECIPIENT
Subject: '$USER' has logged in '$HOST_NAME'
From: $SENDER

'$USER' has logged in successfully from '$SOURCE_IP' on $HOST_NAME.
Login Time: `date +\"%Y-%m-%d %T %Z\"`

`env`
"

echo "$MESSAGE" | sendmail -t &

パーミッションを変更して実行可能にします。

# chmod 755 ./notify-login.sh

作成したスクリプトを実行してメールが送信されることを確認します。

# ./notify-login.sh

/etc/profile ファイルに以下の行を追加して、ログイン時にメールが送信されるようにします。

/path/to/script/notify-login.sh

テスト

SSH で再ログインしてメールが送信されることを確認します。

注意

SSH のポートフォワーディングのみを利用する接続ではメールが送信されません。

参考

OpenWrt 19.07 で Extroot を使ってディスク容量を拡張する

OpenWrt に必要なパッケージをインストールしているとディスク容量が不足してきたので、Extroot 機能を使ってディスク容量を拡張しました。もともとルーターは利用できるスペースが少ないので、サーバーをインストールする予定であれば早めに Extroot を適用しておくとよいと思います。

パッケージや設定ファイルが置かれているドライブ /overlay を USB メモリーにコピーして、以後 USB メモリーを /overlay としてマウントして使用します。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 19.07.3

USB メモリーをストレージとして追加

パッケージをインストール

必要なパッケージをインストールします。root で作業します。

# opkg update
# opkg install kmod-usb-storage kmod-usb-storage-uas usbutils block-mount

USB メモリーを接続し以下のコマンドでデバイスが認識されていることを確認します。

# lsusb -t
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=orion-ehci/1p, 480M

“Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M” が接続された USB メモリーを示しています。

以下のコマンドで USB メモリーが /dev/sd* として接続されていることを確認します。

# ls -l /dev/sd*
brw-------    1 root     root        8,   0 Jun 20 16:37 /dev/sda
brw-------    1 root     root        8,   1 Jun 20 16:37 /dev/sda1

さらに block コマンドで詳細な情報を確認します。

# block info | grep "/dev/sd"
/dev/sda1: UUID="34E8-19B0" LABEL="USB128GB" VERSION="FAT32" TYPE="vfat"

USB メモリーをフォーマット

USB メモリーを OpenWrt で使用するのに適したファイルシステムでフォーマットします。

ドライブの種類によって異なるパッケージをインストールし、適したファイルシステムでフォーマットします。

USB メモリーや SSD 等のフラッシュドライブの場合 (F2FS)

# opkg install f2fs-tools kmod-fs-f2fs
# mkfs.f2fs /dev/sda1

ハードドライブの場合 (EXT4)

# opkg install e2fsprogs kmod-fs-ext4
# mkfs.ext4 /dev/sda1

マウント設定を変更

現在の /overlay を別の場所 (/rwm) にマウントするように設定を変更します。以後、古いデータを参照したい場合に利用します。

# uci -q delete fstab.rwm
uci set fstab.rwm="mount"
uci set fstab.rwm.device="`sed -n -e "/\s\/overlay\s.*$/s///p" /etc/mtab`"
uci set fstab.rwm.target="/rwm"
uci set fstab.rwm.enabled=1
uci commit fstab

USB メモリーを /overlay としてマウントします。

# DEVICE="/dev/sda1"
eval `block info "${DEVICE}" | grep -o -e "UUID=\S*"`
uci -q delete fstab.overlay
uci set fstab.overlay="mount"
uci set fstab.overlay.uuid="${UUID}"
uci set fstab.overlay.target="/overlay"
uci set fstab.overlay.enabled=1
uci commit fstab

(任意) マウント時にファイルシステムのチェックを行う場合は以下のコマンドを実行します。

# uci set fstab.@global[0].check_fs='1'
uci commit fstab

以下のコマンドで fstab サービスを有効化します。

# service fstab boot

データを USB メモリーにコピー

すでにインストールされているパッケージ等のデータを Extroot で使用する USB メモリーにコピーします。新しい fstab の設定をコピーするため最後に行います。

USB メモリーをマウントしデータをコピーします。

# mount /dev/sda1 /mnt/sda1
# cp -a -f /overlay/. /mnt/sda1
# umount /mnt/sda1

再起動

ルーターを再起動します。

# reboot

テスト

df コマンドでマウントされているドライブと容量を確認します。

# df

/overlay の容量が USB メモリーの容量になっているのが確認できます。

Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 2560      2560         0 100% /rom
tmpfs                   255976       120    255856   0% /tmp
/dev/sda1            121304064    533672 119353176   0% /overlay
overlayfs:/overlay   121304064    533672 119353176   0% /
ubi1:syscfg              30276       312     28380   1% /tmp/syscfg
tmpfs                      512         0       512   0% /dev
/dev/ubi0_1              24312     19696      3340  86% /rwm

参考

OpenWrt 19.07 と Gitolite で Git サーバーを構築

OpwnWrt をインストールしたルータで Git サーバーを構築しました。低消費電力でプライベートな Git サーバーです。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 19.07.3

マルチユーザー環境はすでに構築済みであることが前提です。また、Extroot を使ってディスク容量を拡張済み でありディスクの空き容量も数GB以上あることを前提にしています。

パッケージ バージョン
gitolite 3.6.11-2

Gitolite をインストール

OpenWrt の gitolite パッケージは /srv/git/ にリポジトリを保存することを想定しています。

Gitolite をインストールします。

# opkg update
# opkg install gitolite openssh-keygen

リポジトリ用のディレクトリを作成します。

# mkdir -p /srv/git/.ssh
# touch /srv/git/.ssh/authorized_keys
# chmod 700 /srv/git/.ssh
# chmod 600 /srv/git/.ssh/authorized_keys

git リポジトリ用のディレクトリのオーナーを変更します。git ユーザーと git グループは Gitolite のインストール時に作成されています。

# chown -R git:git /srv/git/

(ローカルPCで作業) Gitolite 管理用ユーザー git 用の鍵を作成します。Linux か mac の場合は以下のコマンドで作成できます。作成後に公開鍵を表示してコピーします。

$ ssh-keygen -t rsa -b 4096 -C "Gitolite-admin" -f ./gitolite_key_admin.key
$ cat ./gitolite_key_admin.key.pub

(注意) 鍵のコメントにスペースが入っていると、後のセットアップでエラーが出ます。スペースはハイフン等で置き換えてください。

FATAL: algorithm mismatch: AAAAB3Nz... vs. +^ at /usr/libexec/gitolite/lib/Gitolite/Common.pm line 409.

(OpenWrt で作業) 先ほどコピーした公開鍵を OpenWrt の /srv/git/admin.pub にペーストします。

# vi /srv/git/admin.pub

git ユーザーに切り替えて Gitolite の初期設定を行います。

# su - git
$ gitolite setup -pk ~/admin.pub

admin.pub はすでに管理用リポジトリにコピーされていて不要なので削除します。

$ rm ~/admin.pub

Gitolite の管理用リポジトリをクローン

(ローカルPCで作業) Gitolite の管理用リポジトリ gitolite-admin をクローンします。以下のアドレスをクローンします。鍵は先ほど作成した gitolite_key_admin.key を使用します。Linux の git でも Windows の Sourcetree でもクローンできました。

ssh://git@<ADDRESS>:<PORT>/gitolite-admin
ssh://git@hogepiyo.com:2020/gitolite-admin

以後はこの gitolite-admin リポジトリを操作して Gitolite を設定していきます。

新しいユーザーを追加

(ローカルPCで作業) 管理ユーザーではない一般ユーザーを追加します。一般ユーザー用の鍵を新たに作成し、公開鍵を <Username>.pub のファイル名で gitolite-admin/keydir/ に保存します。

.../gitolite-admin/keydir/john.pub

新しいリポジトリを追加

(ローカルPCで作業) リポジトリの管理は gitolite-admin\conf\gitolite.conf を編集して行います。

テストとして hello-world リポジトリを追加します。

repo gitolite-admin
    RW+     =   admin

repo testing
    RW+     =   @all

repo hello-world
    RW+     =   @all

変更をコミット

(ローカルPCで作業) 変更を反映するには gitolite-admin リポジトリにコミットしてプッシュします。

hello-world リポジトリをテスト

(ローカルPCで作業) ssh://git@<ADDRESS>:<PORT>/hello-world を新しく作成した一般ユーザーでクローンできるかテストします。

参考

OpenWrt 19.07 でマルチユーザー環境を構築

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 19.07.3

一般ユーザーを追加

初期状態では root ユーザーのみで一般ユーザーが存在しないので一般ユーザーを追加します。 useradd コマンドも使用できないので opkg でインストールします。

# opkg update
# opkg install shadow-useradd

useradd コマンドで一般ユーザーを追加します。シェルは busybox ビルトインの ash を指定します。同時に追加するユーザー名と同名のグループを作成してメンバーにします。

# useradd -m -d /home/<USERNAME> -s /bin/ash -U <USERNAME>
-m
ホームディレクトリを作成
-d
ホームディレクトリのパスを指定
-s
シェルを指定
-U
ユーザー名と同じ名前のグループを作成して新しいユーザーをメンバーにする

一般ユーザーにパスワードを設定します。

# passwd <USERNAME>

一般ユーザーに sudo 権限を付与

sudo コマンドもインストールされていないのでまずはインストールします。

# opkg install sudo

visudo コマンドで /etc/sudoers を編集し、sudo の設定をします。

# visudo

sudo グループユーザーが sudo コマンドを利用できるようにするため、以下の行のコメントを解除して有効化します。

%sudo ALL=(ALL) ALL

グループを編集するために groupadd と usermod コマンドをインストールします。

# opkg install shadow-groupadd shadow-usermod

sudo システムグループを作成します。

# groupadd --system sudo

一般ユーザーを sudo グループに追加します。

# usermod -a -G sudo <USERNAME>
-a
ユーザーのサブグループを追加する。-G オプションと併用
-G
サブグループのリストを指定する。複数指定時はカンマで区切る

su コマンドをインストール

su コマンドも使えないのでインストールしておきます。

# opkg install shadow-su

一般ユーザーに SSH アクセスを許可

一般ユーザーのホームディレクトリに公開鍵を保存して、SSHでアクセスできるようにします。

# su - <USERNAME>
$ mkdir ~/.ssh/
$ chmod 700 ~/.ssh

(ローカル PC で作業) OpenWrt ではなくローカルの PC で公開鍵を作成するか、すでにある鍵を利用します。Linux か mac の場合は以下のコマンドで作成できます。

$ ssh-keygen -t rsa -b 4096 -C "<COMMENT OF THIS KEY>" -f ./ssh_key
$ cat ./ssh_key.pub

(OpenWrt で作業) ~/.ssh/authorized_keys に公開鍵をペーストします。

$ vi ~/.ssh/authorized_keys

authorized_keys ファイルのパーミッションを変更します。

$ chmod 600 ~/.ssh/authorized_keys

参考