2017年7月30日日曜日

RPi_0027 exFATマウントdump

USBメモリに区画を作り、dumpバックアップについての説明する。

(1) exfatとdumpのインストール

WindowでもMacでも書き込めるexFATが使えるようにして、Raspbianのフルバックアップ用にdumpをインストールする。 FATについては、『FAT32、FAT16、NTFS、exFATとは何ですか。』 http://faq.buffalo.jp/app/answers/detail/a_id/1079 を参照。
# apt-get install exfat-fuse
( apt-get install exfat-utils ) #exfat-fuseで同時にインストールされる
# apt-get install dump  #restoreコマンドもインストールされる

(2) USBメモリの区画作成

USBメモリなら何でもよいと思われるが、ここではSanDisk SDDD2-016Gをラズパイに挿す。
% lsusb | head -1
Bus 001 Device 004: ID 0781:5590 SanDisk Corp. #USBメモリ認識

# 区画の状態を調べる
# コマンドとしては fdisk,cfdisk,sfdisk,parted,gpartedなどがある
# fdisk -l /dev/sda
Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1          32 30031249 30031218 14.3G  c W95 FAT32 (LBA)
Idはcなので、W95 FAT32 (LBA) のフォーマットであるが、これを、
Idが7の、HPFS/NTFS/exFAT の フォーマットに切り直す。さらに
領域の半分は、Type Id 83 の Linuxフォーマットにする。
セクタ数30031218の半分は、
echo "(30031250-2048) / 2" | bc
の15014601 である。
# フォーマットの切り直し
# fdisk /dev/sda
Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1          32 30031249 30031218 14.3G  c W95 FAT32 (LBA)

Command (m for help): d 1
Selected partition 1
Partition 1 has been deleted.  # 区画1が削除された

Command (m for help): n  # 1つ目の新しい区画を作る
Partition type
Select (default p): p  #区画の種類はprimary
Partition number (1-4, default 1): 1
First sector (2048-30031249, default 2048):ENTERで2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-30031249, default 30031249): +15014601
Created a new partition 1 of type 'Linux' and of size 7.2 GiB.
Command (m for help): n  # 2つ目の新しい区画を作る
Partition type
Select (default p): p  #区画の種類はprimary
Partition number (2-4, default 2):ENTERで2
First sector (15015936-30031249, default 15015936):ENTERで15015936
Last sector, +sectors or +size{K,M,G,T,P} (15015936-30031249, default 30031249):
ENTERで30031249になりお尻は (0-30031249)0オリジン開始。
Created a new partition 2 of type 'Linux' and of size 7.2 GiB.

Command (m for help): p  #できた区画をみる
Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048 15015935 15013888  7.2G 83 Linux
/dev/sda2       15015936 30031249 15015314  7.2G 83 Linux
#セクター数はheads/cylindersで丸められるので、ドンピシャな同じ区画サイズにならない
#セクター数15015314-15013888=1426のサイズ差となった

Command (m for help): t  #フォーマットタイプを変更
Partition number (1,2, default 2): 1  #対象の区画は1番目
Hex code (type L to list all codes): L  #Id番号のリスト

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 Ext’d (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1 80  Old Minix
Hex code (type L to list all codes): 7  #7  HPFS/NTFS/exFAT を選択
Changed type of partition 'Linux' to 'HPFS/NTFS/exFAT'.
#あるいは、
Hex code (type L to list all codes): c  #c  W95 FAT32 (LBA) を選択
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help): p  #変更した区画をみる
Disk /dev/sda: 14.3 GiB, 15376000000 bytes, 30031250 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048 15015935 15013888  7.2G  7 HPFS/NTFS/exFAT
/dev/sda2       15015936 30031249 15015314  7.2G 83 Linux

Command (m for help): w  #変更を書き込む
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

# リブートで反映されるとあるので
# reboot するか、USBメモリを抜いて、別なUSBポートに指し直す。
# partprobe がエラーにならなければOKだろう
# partprobe -s
/dev/sda: msdos partitions 1 2
/dev/mmcblk0: msdos partitions 1 2
区画ができたならば、つぎにフォーマットする
# mkfs.exfat -n exFAT_7G /dev/sda1
mkexfatfs 1.1.0
Creating... done.
Flushing... done.
File system created successfully.

もしくは、
# mkfs.vfat -v -F 32 -n FAT32_7G /dev/sda1
/dev/sda1 has 64 heads and 32 sectors per track,
(略)
Volume ID is 980b59c3, volume label FAT32_7G   .
必要ならオプション追加 -c:不良ブロックの検査を行う

# mkfs.ext4 -j -L ext4_7G /dev/sda2
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 1876914 4k blocks and 469568 inodes
Filesystem UUID: fb6e48ef-b51c-44d1-b817-71677adac421
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
フォーマットのあとマウントする
# mkdir -p /dsk/sda1; mkdir /dsk/sda2  #マウントポイント
# mount -v /dev/sda1 /dsk/sda1
FUSE exfat 1.1.0
# mount -v /dev/sda2 /dsk/sda2
mount: /dev/sda2 mounted on /dsk/sda2.

Raspbianがデスクトップ版の場合は、オートマウントされるようだ。
/dev/sda1        7506944    3872   7503072   1% /media/pi/exFAT_7G
/dev/sda2        7324192   33004   6899424   1% /media/pi/ext4_7G
マウントポイントはラベル名が使用される。

# mount|grep dsk   #マウントの状態
/dev/sda2 on /dsk/sda2 type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /dsk/sda1 type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096)

# df -H|egrep 'Used|dsk'   #マウントの使用状況
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       7.5G   34M  7.1G   1% /dsk/sda2
/dev/sda1       7.7G  1.3M  7.7G   1% /dsk/sda1

# 取り外す前にはアンマウントする
# umount /dsk/sda1
# umount /dsk/sda2

(3) ext4区画のバックアップ

Raspbianのroot区画をフルバックアップする方法を示す。
以下の b_mmcblk0_local.sh スクリプトを/usr/local/bin/に置く。
</usr/local/bin/b_mmcblk0_local.sh>
#! /bin/bash
# $Id: b_mmcblk0_local.sh,v 1.1 2017-08-01 10:19:56+09 tsubota $
#
SEND_ADDR="MY_GMAIL@gmail.com"
FROM_ADDR="MY_GMAIL@gmail.com"

LogMailSend() {
    MDHM=`date '+%Y/%m/%d(%a) %H:%M:%S'`
    SUBJECT=$1
    MESS=$2
    logline=`echo $MDHM; echo $MESS`
    (echo "Mime-Version: 1.0"; echo "Content-Type: Text/Plain; charset=iso-2022-jp"; echo "Content-Transfer-Encoding: 7bit"; echo "Subject: $SUBJECT"; echo "To: ${SEND_ADDR}"; echo "From: ${FROM_ADDR}"; echo ""; echo "$DT" ; echo "from `hostname`"; echo "${MYCMD} Running LOG."; echo ${logline}|nkf -j) | /usr/sbin/exim4 -f ${FROM_ADDR} ${SEND_ADDR}
}
ExecMailSend() {
    MDHM=`date '+%Y/%m/%d(%a) %H:%M:%S'`
    SUBJECT=$1
    LISTFILE=$2
    LOGFILE="`pwd`/$LISTFILE"
    (echo "Mime-Version: 1.0"; echo "Content-Type: Text/Plain; charset=iso-2022-jp"; echo "Content-Transfer-Encoding: 7bit"; echo "Subject: $SUBJECT"; echo "To: ${SEND_ADDR}"; echo "From: ${FROM_ADDR}"; echo ""; echo "$DT" ; echo "from `hostname`"; echo "${MYCMD} Running LOG."; echo "LISTFILE=$LOGFILE"; nkf -j $LISTFILE) | /usr/sbin/exim4 -f ${FROM_ADDR} ${SEND_ADDR}
}

HDEV=mmcblk0p2
if [ `whoami` != "root" ]; then
    ERRMSG="User not root."
    echo $ERRMSG
    logger $ERRMSG
    exit 1
fi
MYCMD=$0
MYNM=`basename $0`
BODY=${MYNM%.sh}

RDIR=/dsk/sda2/Backup/rapi4/RootBz
if [ ! -d ${RDIR} ]; then
    ERRMSG="Not Mounted $RDIR."
    echo $ERRMSG
    LogMailSend "$MYNM FAIL1" "$ERRMSG"
    logger $ERRMSG
    exit 1
fi
cd $RDIR
if [ $? != 0 ]; then
    ERRMSG="CANNOT cd $RDIR."
    echo $ERRMSG
    logger $ERRMSG
    LogMailSend "$MYNM FAIL2" "$ERRMSG"
    exit 1
fi

YMD=`date "+%Y_%m%d"`
BDIR=${BODY}_${YMD}
if [ ! -d ${BDIR} ]; then
    mkdir -p ${BDIR}
    if [ $? != 0 ]; then
        ERRMSG="Cannot mkdir $BDIR."
 echo $ERRMSG
 logger $ERRMSG
        exit 1
    fi
fi

CLOG="${BDIR}/${HDEV}_${YMD}.log"
echo "START=`date`" | tee $CLOG
echo "----------------------------------------" | tee -a $CLOG
echo "% /sbin/fdisk -l /dev/mmcblk0" | tee -a $CLOG
/sbin/fdisk -l /dev/mmcblk0 | sed -n -e "/^Disk/,//p" | tee -a $CLOG
echo "----------------------------------------" | tee -a $CLOG
echo "% df" | tee -a $CLOG
df | tee -a $CLOG
echo "" | tee -a $CLOG
echo "" | tee -a $CLOG
echo "****************************************" | tee -a $CLOG
date | tee -a $CLOG
pwd | tee -a $CLOG
set -x
(/sbin/dump 0usf 99999 - /dev/${HDEV} | \
  bzip2 -c > ${BDIR}/${HDEV}_${YMD}.dump.bz2 ) 2>&1 | tee -a $CLOG
date | tee -a $CLOG
ls -l ${BDIR} | tee -a $CLOG
ls -lh ${BDIR} | tee -a $CLOG
md5sum ${BDIR}/${HDEV}_${YMD}.dump.bz2  | tee -a $CLOG
set +x
echo "****************************************" | tee -a $CLOG
echo "END=`date`" | tee -a $CLOG
ExecMailSend "$MYNM FINISH." "$CLOG"
exit 0

# end of b_mmcblk0_local.sh
b_mmcblk0_local.shに実行許可を与える。
たとえば、月初めに実行したいのならば、crontabに設定するとよい。
# chmod 755 /usr/local/bin/b_mmcblk0_local.sh
# vi /etc/crontab
4 2 1 * * root /usr/local/bin/b_mmcblk0_local.sh
ついたちの2時4分に起動する例。
rootで実行するよりは、/etc/groupの"disk:x:6:"の行にユーザを加えて、 ユーザモードでバックアップするのが、よりよいだろう。
復元は、
展開するディレクトリにcdしたあと、
# bzip2 -dc ABC.bz2 | restore rf - #フルリストア
# bzip2 -dc ABC.bz2 | restore ivf - #会話部分リストア
でできるだろう。

《2017.8.25追記》
restoreで、なんどやってもillegal hardware instruction restore rvf -
になってしまう。未解決。dumpファイルから復元できない。
《2017.9.6追記》
mkfs.ext4 のオプションで -L のラベルを付けなければ illegal hardware instruction にならず正常にrestoreできている。

代替えというか別な方法として、raspbianデスクトップ画面から
Raspiアイコン>Accessories>SD Card Copier
を使うことにする。
/dev/mmcblk0のp1とp2の区画をまるごと外部メディアに
バックアップしてくれる。
出力側は、自動で区画切りをしてくれて、cp -axコマンドでコピーする。
出力をUSBメモリでなく、microSDにすると起動メディアにもなる。
SD Card Copierは便利で、コピーも速い。

デスクトップSD Card Copierがないときは、
https://github.com/billw2/rpi-clone
A shell script to clone a running Raspberry Pi SD card to a USB mounted SD card.

# ./rpi-clone -h

usage: rpi-clone sdN {-v|--verbose} {-f|--force-initialize} {-s|--src-disk sdS} {-c|--cross-filesystems} {-x}
-v - list all files as they are copied.
-f - force initialize the destination partitions
-s sdS - specify sdS is the booted source disk to clone from.
Use this if the boot source auto detect from /etc/mtab fails.
Use with caution, be sure sdS is really the booted disk.
-c - cross filesystem boundaries (include mounted drives)
-x - use set -x for very verbose bash shell script debugging
...
Version 1.7.1
にて、コマンドラインから同様にバックアップできそう。


2017年7月27日木曜日

RPi_0026 TeraTerm自動ログイン

TeraTermのマクロ機能でttlマクロのアイコンをクリックすることで、一気にラズパイにsshログインする方法を示す。

(1) avahi-daemonのインストール

Avahi(アバヒ) は hostname.local という名前を使ってローカルでホスト名を解決する機能でありこれををラズパイ側にインストールする。
# apt-get install avahi-daemon
# apt-get install avahi-utils  #おまけ avahi-resolve使いたいとき
avahiが起動していることの確認
# ps ax|grep avahi|grep -v grep
  368 ?        Ss     2:01 avahi-daemon: running [rapiz.local]
  380 ?        S      0:00 avahi-daemon: chroot helper

(2) Bonjourのインストール

Bonjour印刷サービスをWindows10側にインストールする。
ダウンロード - Bonjour Print Services (Windows) - Apple Support
https://support.apple.com/kb/DL999?viewlocale=ja_JP
からダウンロードして、
Downloads/BonjourPSSetup.exe をクリックして、
「ようこそ Bonjour印刷サービス」の画面に従ってインストールを完了させる。
但しAppleのiTunesをすでにインストールしている場合やWindows10であれば、Bonjour機能はインストールされている可能性があり、先にpingしてみよう。
C:\Users>ping rapiz.local
ping 要求ではホスト rapiz.local が見つかりませんでした。ホスト名を確認してもう一度実行してください。
### pingが通らないか、
C:\Users>ping rapiz.local
rapiz.local [192.168.1.80]に ping を送信しています 32 バイトのデータ:
192.168.1.80 からの応答: バイト数 =32 時間 =12ms TTL=64
192.168.1.80 からの応答: バイト数 =32 時間 =11ms TTL=64
192.168.1.80 からの応答: バイト数 =32 時間 =10ms TTL=64
### pingが通ればBonjourはインストールされているだろう。

(3) ttlマクロファイルの編集

ttlマクロファイルの雛形が、
c:/Program Files (x86)/teraterm/ssh2login.ttlにあるので、これをデスクトップにコピーして、例えばssh2rapiz.ttl にリネームする。
c:/Users/Default/Desktop/ssh2rapiz.ttl を以下のように変更修正する。
*** c:/Program Files (x86)/teraterm/ssh2login.ttl
--- c:/Users/Default/Desktop/ssh2rapiz.ttl
@@ -6,19 +6,19 @@
 ; Update: 2004/12/4
 ; Author: Yutaka Hirata
 
-username = 'nike'
-hostname = '192.168.1.3'
+username = 'pi'
+hostname = 'rapiz.local'
+passwdfile = 'c:¥Program Files (x86)¥teraterm¥passwd_pi.dat'
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-msg = 'Enter password for user '
-strconcat msg username
-passwordbox msg 'Get password'
+getpassword passwdfile username userpasswd
 
 msg = hostname
 strconcat msg ':22 /ssh /auth=password /user='
 strconcat msg username
 strconcat msg ' /passwd='
+strconcat msg userpasswd
 strconcat msg inputstr
 
 connect msg
もし、ssh2rapiz.ttl が以下のような[M]マークアイコンになっていなければ、

teraterm-4.95.exeを再インストールして、

チェック項目の.ttlファイルをttermpro.exeに関連付ける

piユーザのパスワードは passwdfile = 'c:¥Program Files (x86)¥teraterm¥passwd_pi.dat' に保存される。このファイルが無ければパスワード入力されファイル作成され、ファイルがあればパスワードが読み出してデコードされて自動ログインのパスワードとして使用される。
bash-4.1$ cat "/cygdrive/c/Program Files (x86)/teraterm/passwd_pi.dat"
[Password]
pi=XXXXYYYYZZZZAAAABB  #エンコードされた文字列
たぶんHackingすればデコードできるんだろう。平文よりはヨシとする。

(4) ttlマクロの実行

ssh2rapiz.ttlのクリックで、TeraTerm自動ログインできる。
ログイン後の画面で、rapiz.localでの、IPアドレスの正引きと逆引きをしているようす。
pi@rapiz:~ $ ifconfig wlan0|grep "inet addr:"
          inet addr:192.168.1.80  Bcast:192.168.1.255  Mask:255.255.255.0
pi@rapiz:~ $
pi@rapiz:~ $ ping -c 2 rapiz.local|head -3
PING rapiz.local (192.168.1.80) 56(84) bytes of data.
64 bytes from rapiz.gjs.or.jp (192.168.1.80): icmp_seq=1 ttl=64 time=0.178 ms
64 bytes from rapiz.gjs.or.jp (192.168.1.80): icmp_seq=2 ttl=64 time=0.178 ms
pi@rapiz:~ $
pi@rapiz:~ $  avahi-resolve -n rapiz.local
rapiz.local     192.168.1.80
pi@rapiz:~ $
pi@rapiz:~ $ avahi-resolve -a 192.168.1.80
192.168.1.80    rapiz.local
pi@rapiz:~ $
これで、ネットワークの場所を移動するたびに、FingでラズパイのIPアドレスを調べて、TeraTerm起動しIPアドレスや、ユーザパスワードを入力していた手間が省ける。アイコンのクリック一発でログインできて、とても便利になるはずだ。

<20180127_補足追加:TeraTermのsshログイン時にログを記録版>
; $Id: sshLOG_rapi4.ttl,v 1.00 2018/01/23 13:19:50 RDH_team $
; sample macro of Tera Term
;
; File: ssh2login.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2004/12/4
; Author: Yutaka Hirata
;
; (参照したURL)
; 1.マクロサンプル - 自動ログイン(SSH版)Add Star (2012.12.30)
;   http://d.hatena.ne.jp/KuroNeko666/20121230/1356931071
; 2.TeraTermマクロ-MACROで設定する自動ログ取得 (2011/04/25)
;   http://www.j-oosk.com/teraterm/logging/254/

hostnam1 = 'rapi4'
hostnam2 = '.local'
hostname = hostnam1
strconcat hostname hostnam2
username = 'myname'
basedir = 'c:\Usr\TT_LOG\'
passwdfile = basedir
strconcat passwdfile 'passwd_rapi4_myname.dat'
;; ログ保存先指定 
LOGSPATH = basedir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
getpassword passwdfile username userpasswd

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg userpasswd
strconcat msg inputstr

;; ⑤ログファイル名の設定
getdate LOG_NAME '_%Y%m%d_%H%M.txt'
FULLPATH = LOGSPATH 
strconcat FULLPATH hostnam1
strconcat FULLPATH LOG_NAME

;; ⑥接続 
connect msg

;; ⑦接続判定1(接続出来ない場合はメッセージを表示しマクロ終了) 
if result <> 2 then
  ERR_MESS = 'Cannot HOST '
  strconcat ERR_MESS hostname
  messagebox ERR_MESS 'Connection Error' 
  end 
endif

;; ⑧接続判定2(接続して3秒以内にプロンプトが表示されない場合もマクロ終了) 
timeout = 3 
wait '$ ' '% ' '# '
if result = 0 then 
  ERR_MESS = 'NoResponse HOST '
  strconcat ERR_MESS hostname
  messagebox ERR_MESS 'Connection Error' 
  end 
endif

;; ⑨ログ取得開始
logopen FULLPATH 0 1
if result then
  messagebox FULLPATH 'logopen Error' 
  end 
endif
logwrite 'Log start '
logwrite FULLPATH
logwrite #13#10
logwrite '*****************************************************'#13#10
;logclose
;; ⑩ホスト名表示 
;sendln 'hostname' 
;wait '$' '#'

;; ⑪マクロ終了 
;end