2019/08/12(月)Tera Term の「リンク」と「接続」


Tera Term の「リンク」と「接続」

Tera Term は、複数のプログラムで構成されていて、相互にプロセス間通信をすることで成り立っています。

Tera Term のヘルプから画像を引用します。

Tera Term モジュール構成
Tera Term モジュール構成

上記の図からは Tera Term 本体 (ttermpro.exe) と Tera Term マクロ実行プログラム (ttpmacro.exe) が異なることがわかります。
「リンク」と「接続」の違いを説明する上で、これの理解が必要になります。

リンク

Tera Term マクロ実行プログラム (ttpmacro.exe) から見た Tera Term 本体 (ttermpro.exe) へのアクセス有無を「リンク」と呼んでいます。
このため、マクロが Tera Term 本体へ通信している状態を「リンクしている」と呼び、マクロが Tera Term 本体へ通信していない状態を「リンクしていない」と呼んでいます。

リンクするためには ttpmacro.exe が connect 等で ttermpro.exe と DDE によるプロセス間通信を行う必要があります。
DDE については、このページの下部にもう少し技術的な内容を書いたのでここでは省略します。

また Tera Term を終了した場合、デフォルト設定では併せてリンクも終了するようになっています。

Point:
DDE による Tera Term 内アプリケーション同士のプロセス間通信。

接続

Tera Term 本体が「Tera Term を構成するプログラム以外」のサーバやスイッチングハブ等と通信している状態を「接続」や「アクセス」と呼んでいます。

Telnet や SSH 等のプロトコルで通信している状態ですね。

Point:
TCP/IP による通信。

DDE

DDE (Dynamic Data Exchange) は日本語で「動的データ交換」とも呼ばれる Windows 2.0 (1987年) の時代に発表されたプロセス間通信のメカニズムです。

DDE 通信から見た Tera Term の「リンク」は Tera Term 本体がサーバ、マクロ実行プログラムがクライアントになっています。
サーバ - クライアントモデルで通信していると書くと TCP/IP による Telnet や ssh との通信と混乱しかねませんが、実のところ概念は同じものでも利用している技術が異なります。

OLE (Object Linking and Embeddin) の登場以降では活躍の場が少なくなったものの VBA といったマクロを介さず利用できることから 2017 年 10 月にはセキュリティ研究者が DDE を悪用したマルウェア拡散手順を公開、2017年12月には Word の DDE 機能がデフォルトで Disable される*1という変遷がありました。

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/ADV170021

この攻撃手法については https://www.ipa.go.jp/files/000063813.pdf に詳しいため、参照いただければ幸いです。
参照先の PDF では「この文書には、他のファイルへのリンクが含まれています。リンクされたファイルのデータでこの文書を更新しますか?」といったダイアログボックスが表示されていることがわかります。

これらのことから、セキュリティの向上という名目で DDE が無効化される流れも想像できます。
Windows で DDE が利用できなくなると Tera Term マクロが動作しなくなります。

*1 : Excel や Outlook は、現在でも DDE を利用可能。

2019/08/08(木)SCP のダウンロード先をデスクトップに


SCP のダウンロード先をデスクトップに

https://osdn.net/projects/ttssh2/forums/5841/41014/#forum-message-83348

これに口をはさんだ後で「マクロで作るならどうやるだろう?」と思ってしまったので作ったマクロ。

inputbox でダウンロードするデータを指定しておいて、デスクトップに送ってみる。

; ダウンロードするファイルの指定
inputbox 'Download file' 'input'
SrcFileName = inputstr

; ダウンロード先
expandenv BaseDir '%HOMEDRIVE%%HOMEPATH%'
sprintf2 DestFileName "%s\Desktop\%s" BaseDir SrcFileName

messagebox DestFileName 'DestFileName'

; コマンド scprecv <remote file name> [<local file name>]
;scprecv SrcFileName DestFileName


ここまで書いて、私は思いました。

「……あ、これ .ttl ファイルをダブルクリックしただけじゃだめじゃん。」

そう、メニューから「コントロール」→「マクロ」で呼び出さないといけません。
うーん、デスクトップ指定が面倒だと言っているのに、あんまり面倒さが変わらないw


というか、だ。
自分が Tera Term の SCP 機能を使うときは、ダウンロード先を開いたうえで、ソースとデストのパスをそれぞれテキストエディタにコピペしてた。
ソースは Tera Term の画面で echo $(pwd)/xxx とかでフルパス出力させればコピペも楽だったし。

他の人……というか同僚が WinSCP を使う中、自分だけそんなやり方をしてたのを思い出す。


うーん、サンプルマクロの記事としては微妙なので、技術メモとして。

何か応用効くかなぁ……

一応、上記サンプルマクロのバージョン情報を。
利用マクロのバージョン情報
種別:通信Ver機能の簡易説明
scprecv4.57以降SCPプロトコルでファイルを受信する。
種別:文字列操作Ver機能の簡易説明
expandenv4.71以降環境変数文字列を展開する。
sprintf24.62以降フォーマットされた出力を返す。
種別:その他Ver機能の簡易説明
inputbox文字列を入力するためのダイアログボックスを開く。
4.53以降デフォルト入力文字を設定するオプションの追加。
4.54以降特殊文字の解釈を制御するオプションの追加。
messageboxダイアログボックスを開き、ユーザーにメッセージを知らせる。
4.54以降特殊文字の解釈を制御するオプションの追加。
4.60以降キャンセル時にマクロ停止を確認する機能の追加。

Tera Term 本体が、環境変数をデフォルトで解釈してくれるならすごくうれしい。

2019/08/01(木)正規表現 Oniguruma の利用バージョン

正規表現 Oniguruma の利用バージョン

Tera Term で利用されている鬼車 (正規表現エンジン) のバージョンを、更新履歴からリストアップしてみました。
何に役立つのか分からない情報なため、とりあえずメモとして。

Tera Term に利用雄されている鬼車のバージョン一覧
Tera Term バージョン鬼車バージョン
2023.12.19 (Ver 5.1)Oniguruma 6.9.9へ差し替えた。
2023.10.15 (Ver 5.0)Oniguruma 6.9.8へ差し替えた。
2021.06.05 (Ver 4.106)Oniguruma 6.9.7.1へ差し替えた。
2019.08.31 (Ver 4.104)Oniguruma 6.9.3へ差し替えた。
2019.06.15 (Ver 4.103)Oniguruma 6.9.2へ差し替えた。
2019.02.28 (Ver 4.102)Oniguruma 6.9.1へ差し替えた。
2018.11.30 (Ver 4.101)Oniguruma 6.9.0へ差し替えた。
2018.05.31 (Ver 4.99)Oniguruma 6.8.2へ差し替えた。
2018.02.28 (Ver 4.98)Oniguruma 6.7.1へ差し替えた。
2017.11.30 (Ver 4.97)Oniguruma 6.6.1へ差し替えた。
2017.08.31 (Ver 4.96)Oniguruma 6.6.0へ差し替えた。
2017.05.31 (Ver 4.95)Oniguruma 6.2.0へ差し替えた。
2017.02.28 (Ver 4.94)Oniguruma 6.1.3へ差し替えた
2016.11.30 (Ver 4.93)Oniguruma 6.1.2へ差し替えた
2015.02.28 (Ver 4.86)Oniguruma 5.9.6へ差し替えた
2013.11.30 (Ver 4.80)Oniguruma 5.9.5へ差し替えた
2013.05.31 (Ver 4.78)Oniguruma 5.9.4へ差し替えた
2012.12.02 (Ver 4.76)Oniguruma 5.9.3へ差し替えた
2010.2.20 (Ver 4.65)Oniguruma 5.9.2へ差し替えた
2008.1.15 (Ver 4.57)Oniguruma 5.9.1へ差し替えた
2007.8.8 (Ver 4.53)Oniguruma 5.9.0へ差し替えた
2007.5.7 (Ver 4.52)Oniguruma 5.7.0へ差し替えた
2007.3.10 (Ver 4.51)Oniguruma 5.5.3へ差し替えた
2007.1.22 (Ver 4.50)Oniguruma 5.5.2へ差し替えた
2006.11.20 (Ver 4.49)Oniguruma 4.5.1へ差し替えた
2006.11.1 (Ver 4.48)Oniguruma 4.4.6へ差し替えた
2006.10.28 (Ver 4.47)Oniguruma 4.4.5へ差し替えた
2006.10.9 (Ver 4.46)Oniguruma 4.4.4へ差し替えた
2006.9.16 (Ver 4.45)Oniguruma 4.4.1へ差し替えた
2006.7.24 (Ver 4.41)Oniguruma 4.2.0へ差し替えた
2006.2.24 (Ver 4.28)Oniguruma 4.0.1へ差し替えた
2006.1.21 (Ver 4.26)Oniguruma 3.9.1へ差し替えた
2005.10.7 (Ver 4.21)正規表現ライブラリ Oniguruma のバージョンをバージョン情報に追加した

2019/07/27(土)デバッグメモ

adiary on RaspPi

Raspberry Pi に adiary をインストールする手順を、メモ程度に公開します。

adiary on Raspberry Pi

前提条件

この手順は、以下の条件がすでに完了していることを前提としています。

・Raspberry Pi 3 Model B へ Raspbian をインストールおよびアップデート済み
・SSH でのアクセスが可能
・DNS にドメイン設定済み

想定する利用者

読み手は CUI での操作が可能で、TCP/IP の基礎知識をもち、ある程度 Linux に慣れていることを想定しています。
そのため、割と不親切*1です。

*1 : 前提条件の「DNS 設定済み」は、それなりにハードルが高いはずです。あとで読み返して「自分が分かれば良い」を目安にしています。

Raspberry Pi 環境

Raspbian をインストール直後で構築しようとしている想定で、この手順書を書いています。
そのため、まず adiary 以外の設定を確認したり、設定したりしています。

環境確認

Raspbian バージョン
今回の構築手順で検証に利用した Raspbian のバージョン情報です。
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$

raspi-config

最低限の設定変更をしておきます。
$ sudo raspi-config
1 Change User Password
2 Hostname
    ttm.jimba.ddo.jp
3 Boot Options
    B1 Desktop / CLI
4 Localisation Options
    I1 Change Locale
    I2 Change Timezone
    I4 Change Wi-fi Country
5 Interfacing Options
    P2 SSH
$
・pi ユーザパスワードを変更する。
・ホスト名を変更する。
・起動オプションで CLI に変更する。
・ロケールを日本にする*2
・SSH が有効であること確認する。

OS アップデート

前提条件にはあるけど、念のため。
$ sudo apt-get update
$ sudo apt-get upgrade

関連ソフトウェア設定

httpd (Apache2)
Apache2 をインストールしておきます。
$ sudo apt-get install apache2 apache2-doc
Apache2 インストールで Raspbian に登録される httpd ユーザを確認します。
$ grep www /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
$
ここで確認できた www-data ユーザで adiary を動かす権限を管理すると、運用が楽になります。


次は adiary が動くように CGI の動作設定をします。
$ cd /etc/apache2/mods-available
$ cp -p {,/tmp/}mime.conf
$ sudo vi mime.conf
$ diff {,/tmp/}mime.conf
219c219
<       AddHandler cgi-script .cgi
---
>       #AddHandler cgi-script .cgi
$
次の Module 有効化も cgi の動作設定です。
$ sudo apache2ctl -M | grep cgi
$ sudo a2enmod cgi
$ sudo apache2ctl -M | grep cgi
 cgid_module (shared)
adiary.cgi を消したいときに使うモジュール rewrite を読み込んでおきます。
$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2
$ sudo systemctl restart apache2
apache2 のバージョン情報を表示させないように秘匿する設定です。
$ grep -i includeoptional /etc/apache2/apache2.conf
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
$ cd /etc/apache2/conf-available
$ sudo cp -p security.conf{,_$(date +%Y%m%d)}
$ sudo vi security.conf
(書き換え)
$ sudo diff security.conf{,_$(date +%Y%m%d)}
25c25
< #ServerTokens OS
---
> ServerTokens OS
27d26
< ServerTokens Prod
36,37c35,36
< ServerSignature Off
< #ServerSignature On
---
> #ServerSignature Off
> ServerSignature On
$
$ sudo systemctl reload apache2
他の設定は、後で行います。
dhcpcd (Static IP address)
静的 IP アドレスの設定です。
$ sudo cp -p /etc/dhcpcd.conf{,_$(date +%Y%m%d)}
$ sudo vi /etc/dhcpcd.conf
--- 以下を追記 ---
interface eth0
static ip_address=192.168.0.2/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
static domain_name=jimba.jp
------------------
$ sudo diff /etc/dhcpcd.conf{,_$(date +%Y%m%d)}
$ sudo shutdown -r now
IPアドレス等は、構築時に読み替えます。
設定項目設定例意味
interfaceeth0eth0 の IP アドレスを指定します。
static ip_address192.168.0.2/24IPアドレスを静的に指定します。
/24 は、サブネットマスク 255.255.255.0 を示しています。
static routers192.168.0.1デフォルトゲートウェイを静的に指定します。
static domain_name_servers192.168.0.1DNS (Domain Name System) を静的に指定します。
static domain_namejimba.jpホストが属するドメイン名を静的に指定します。
Web で設定するドメイン (URL) とは別物です。
hcpcd の reload でも良さそうだけど、上記は ssh での操作なのでどちらにせよ IP アドレスが変更されて接続が切れるため、リブートしてます。
NTPd
ログの出力時刻を正しく読み取るため、NTP を ntp.nict.jp に設定します。

パッケージをインストールします。
$ sudo apt-get install ntp ntp-doc ntpdate dnsutils
設定するドメインが名前解決できるか確認します。
$ dig ntp.nict.jp +short
ntp でのやりとりができるか確認します。
$ ntpdate -q ntp.nict.jp
server 2001:df0:232:eea0::fff4, stratum 0, offset 0.000000, delay 0.00000
server 2001:df0:232:eea0::fff3, stratum 0, offset 0.000000, delay 0.00000
server 133.243.238.164, stratum 1, offset 0.000458, delay 0.03119
server 133.243.238.163, stratum 1, offset 0.000286, delay 0.03084
server 133.243.238.244, stratum 1, offset 0.000657, delay 0.03125
server 133.243.238.243, stratum 1, offset -0.000104, delay 0.03133
 8 Feb 16:40:43 ntpdate[18685]: adjust time server 133.243.238.163 offset 0.000286 sec
$
出力内容から stratum が 0 でなければ OK です。
0 がエラーです。
1 以上は、NTP サーバの階層を示します。

NTP 設定を行います。
$ sudo cp -p /etc/ntp.conf{,$(date +%Y%m%d)}
$ sudo diff /etc/ntp.conf{,$(date +%Y%m%d)}
$ sudo vi /etc/ntp.conf
---------------------------------------------------------
(pool をコメントアウトして、serverに ntp.nict.jp を指定する)
---------------------------------------------------------
$ sudo diff /etc/ntp.conf /etc/ntp.conf.$(date +%Y%m%d)
20,24c20,24
< #pool 0.debian.pool.ntp.org iburst
< #pool 1.debian.pool.ntp.org iburst
< #pool 2.debian.pool.ntp.org iburst
< #pool 3.debian.pool.ntp.org iburst
< server ntp.nict.jp iburst
---
> pool 0.debian.pool.ntp.org iburst
> pool 1.debian.pool.ntp.org iburst
> pool 2.debian.pool.ntp.org iburst
> pool 3.debian.pool.ntp.org iburst
>
$ sudo systemctl stop ntp
$ sudo ntpdate ntp.nict.jp
$ sudo systemctl start ntp
$ ntpq -p

関連コマンド

git
git でのファイルダウンロードは公式でのやり方なので、それに倣います。
$ type git > /dev/null 2>&1 || sudo apt install git
Image::Magick (PerlMagic)
adiary にあると便利な Image::Magick を先にインストールしておきます。
$ sudo apt-get install perlmagick
Net::SSLeay
adiary にあると便利な Net::SSLeay を先にインストールしておきます。
$ sudo apt-get install libnet-https-any-perl

ユーザ設定

運用ユーザの作成
運用で使うユーザを登録しておきます。
$ sudo useradd -d /home/example -m -g 1000 -s /bin/bash example
$ sudo passwd example
$ sudo vigr
-> pi と同じ場所に example を追記
$
$ sudo su -
# cd /etc/sudoers.d
# cp -p 010_{pi,example}-nopasswd
# vi 010_example-nopasswd
:%s/pi/example/
:x
# exit
$
ユーザ example は、環境に応じて読み替えてください。
運用ユーザでログインおよび sudo 可能なことを確認しておきます。
pi ユーザの不活性化
ユーザ pi を使えなくして、運用ユーザで作業するようにします。
$ sudo usermod -s /sbin/nologin pi

*2 : 特に Wi-Fi Country は、日本で認められていない周波数の電波(違法電波)を出さないようにする設定が楽。

adiary 環境構築

基本的には、公式サイトにある 自前サーバへのインストール を参照すれば足ります。
このページは adiary をインストールする Raspberry Pi の環境を整備する部分に価値があると思っています。

adiary インストール

adiary を git で /var/www/ にダウンロードします。
$ cd /var/www
$ sudo git clone https://github.com/nabe-abk/adiary
$
$ cd adiary
$ cp adiary.conf.cgi{.sample,}
$ cd ../
$
$ sudo chown -R 33:33 adiary
$ sudo chmod -R 750 adiary
$ sudo find adiary -name "*.png" -or -name "*.gif" -or -name "*.txt" -exec chmod 640 {} \;
$
adiary ディレクトリ全体が apache2 のユーザ権限 www-data (ユーザID 33) で動作するので、750 で良い。
画像やテキストファイルは実行権限不要なので 640 に一括変換しておく。

Apache2 設定

adiary のインストール後でなければ行えない Web 公開設定を行います。
設定ファイル作成のための事前調査
adiary が制限を入れたいディレクトリは .htaccess ファイルが置かれています。
自分の設定では .htaccess ファイルを無効にし、すべて apache の設定ファイルに記述するようにしているため、ファイルを探しておきます。
$ sudo find /var/www/adiary -name .htaccess
/var/www/adiary/skel/.htaccess
/var/www/adiary/data/.htaccess
/var/www/adiary/__tool/.htaccess
/var/www/adiary/plugin/.htaccess
/var/www/adiary/__cache/.htaccess
/var/www/adiary/info/.htaccess
/var/www/adiary/lib/.htaccess
/var/www/adiary/skel.local/.htaccess
設定ファイルの作成
上記の制限内容を踏まえて、設定ファイルを作成します。
$ cd /etc/apache2/sites-available
$ sudo vi 201-adiary.conf
(Config writing...)
$ sudo cat 201-adiary.conf
<VirtualHost *:80>
    ServerName  ttm.jimba.ddo.jp
    ServerAdmin xxx@jimba.ddo.jp
    DocumentRoot /var/www/adiary

    <Directory /var/www/adiary>
        Options ExecCGI
        AllowOverride None
    </Directory>

    <Directory /var/www/adiary/__cache>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/data>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/skel>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/__tool>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/plugin>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/info>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/lib>
        order allow,deny
        deny from all
    </Directory>

    <Directory /var/www/adiary/skel.local>
        order allow,deny
        deny from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/ttm.error.log
    CustomLog ${APACHE_LOG_DIR}/ttm.access.log combined
</VirtualHost>
【参考情報】/var/www/adiary/.htaccess に書きたい内容は、上記主設定ファイル (201-adiary.conf) の <Directory /var/www/adiary> ~ </Directory> の中に書きます。

根拠は、apache2 公式サイトより引用した以下の通りです。
普通は可能であれば .htaccess ファイルの使用は 避けてください。.htaccess ファイルに書こうと考えるようなすべての設定は、サーバの主設定ファイルの セクションで同じように行なうことができます。
Apache HTTP Server Tutorial: .htaccess files - Apache HTTP Server Version 2.4
設定ファイル有効化
設定ファイルを有効化します。
$ sudo a2ensite 201-adiary
Enabling site 201-adiary.
To activate the new configuration, you need to run:
  systemctl reload apache2
$
$ sudo systemctl reload apache2
不要ファイル削除
また、不要になった設定ファイルは、混乱のもとなので消しておきます。
$ sudo rm /var/www/adiary/skel/.htaccess
$ sudo rm /var/www/adiary/data/.htaccess
$ sudo rm /var/www/adiary/__tool/.htaccess
$ sudo rm /var/www/adiary/plugin/.htaccess
$ sudo rm /var/www/adiary/__cache/.htaccess
$ sudo rm /var/www/adiary/info/.htaccess
$ sudo rm /var/www/adiary/lib/.htaccess
$ sudo rm /var/www/adiary/skel.local/.htaccess
ひとつずつ消すのが面倒に思う人は、次のようなコマンドでも良いかもしれません。
$ sudo find /var/www/adiary -name ".htaccess" -exec rm {} \;

Web 上での設定

DNS へ登録した URL (本サイトならば http://ttm.jimba.ddo.jp/) へアクセスして、root アカウント登録や、個別アカウントの登録などを行います。
root アカウント登録
最初のログインに戸惑いますが、ユーザ名 a パスワード a 等、適当に入力してログインすると root でログインしたことになります。
個別アカウント登録
ブログを更新するユーザ等、個別にアカウントを作成します。

Web での設定後

初期画面からのリダイレクト設定
初期画面から、作成したブログ画面へ移動するための index.html 書き換えです。
$ cd /var/www/adiary
$ cp -p index.html{,_backup_$(date +'%Y%m%d')}
$ cat /dev/null > index.html
$ vi index.html
(書き換え)
$ cat index.html
<html>
  <head>
    <meta http-equiv="Refresh" content="0;URL=adiary.cgi">
  </head>
</html>
$ 
robots.txt
ボットに公開/非公開したい情報を教える設定です。

以下は Google bot 以外のクロウラを拒絶する例です

/var/www/adiary/robots.txt
User-agent: Googlebot
Disallow:

User-agent: *
Disallow: /

adiary アップデート

基本的には、公式サイトのコマンドでいけるはず。
$ sudo su -s /bin/bash www-data
$ cd ~/adiary
$ git fetch

その他

その他の設定に興味あるかたは、ツイッター等で質問いただくと反映することがあります。