ネットワーク機器に触れていると OS や設定ファイルの退避先として TFTP サーバを利用したくなることが、しばしばあります。Snow Leopard のクライアント版では、デフォルトで TFTP サーバが無効になっていますので、有効にしてみます。
TFTP サーバを起動する
Snow Leopard には標準で TFTP サーバがインストールされています。パラメータファイルは /System/Library/LaunchDaemons/tftp.plist になります。
$ cat /System/Library/LaunchDaemons/tftp.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>com.apple.tftpd</string>
<key>ProgramArguments</key>
<array>
<string>/usr/libexec/tftpd</string>
<string>-s</string>
<string>/private/tftpboot</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<true/>
</dict>
<key>InitGroups</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>SockServiceName</key>
<string>tftp</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>
ProgramArguments の部分を読むと「/usr/libexec/tftpd -s /private/tftpboot」を起動するようになっているようです。-s オプションは TFTP サーバで公開するディレクトリを指定します。詳細は man ページに詳しく書かれています。TFTP サーバを起動したいだけであれば、tftp.plist はデフォルトのままで構わないので、以下のように launchctl から TFTP サーバを起動します。
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
TFTP サーバは UDP/69 を Listen しますので、正常に起動しているか、否かは、lsof コマンドで 69 番ポートを Listen しているプロセスを確認することで分かります。
$ sudo lsof -i:69
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 21u IPv6 0x0806bef0 0t0 UDP *:tftp
launchd 1 root 22u IPv4 0x0806be14 0t0 UDP *:tftp
TFTP サーバを利用する
接続する
tftp コマンドで対象サーバへ接続します。ここではローカルコンピュータで起動している TFTP サーバ(127.0.0.1)へ接続してみます。正常に接続出来れば、tftp> プロンプトが返ってきます。
$ tftp 127.0.0.1
tftp>
ASCII / BINARY モードを切り替える
FTP 同様、TFTP でもファイルをダウンロードする前に対象ファイルがテキストなのか、それともバイナリなのかを、モードとして指定します。
- ASCII モード
- テキストファイルを扱う場合に ascii コマンドで指定する。
- BINARY モード
- バイナリファイルを扱う場合に binary コマンドで指定する。
現在のモードは status コマンドで確認出来ます。以下は ASCII モードに切り替えた例です(デフォルトでは ASCII モードです)。
tftp> ascii
tftp> status
Connected to 127.0.0.1.
Mode: netascii Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
以下は BINARY モードに切り替えた例です。
tftp> binary
tftp> status
Connected to 127.0.0.1.
Mode: octet Verbose: off Tracing: off
Rexmt-interval: 5 seconds, Max-timeout: 25 seconds
ダウンロードする
get コマンドで対象ファイル名を指定し、ダウンロードします。
tftp> get tmp.txt
Received 235 bytes in 0.0 seconds
アップロードする
put コマンドで対象ファイル名を指定し、アップロードします。ただし、TFTP でファイルをアップロードする場合、アップロードしようとしているファイルが存在している必要があります(上書きしか出来ません)。TFTP サーバとして公開しているディレクトリに tmp.txt というファイルが無い状態で、tmp.txt をアップロードしようとすると、以下のエラーとなってしまいます。
tftp> put tmp.txt
Error code 512: Access violation
エラーを避け、意図した通りにファイルをアップロードするには事前にファイルを作成しておき、更に書き込み権限を与えておきます。ここでは touch でファイルを新規作成し、更に chmod で書き込み権限を付与しています。
$ sudo touch /private/tftpboot/tmp.txt
$ sudo chmod 666 /private/tftpboot/tmp.txt
$ tftp 127.0.0.1
tftp> put tmp.txt
Sent 235 bytes in 0.0 seconds
切断する
quit コマンドで TFTP サーバから切断出来ます。
tftp> quit
$
TFTP サーバを停止する
起動時同様、launchctl で TFTP サーバを停止します。
sudo launchctl unload /System/Library/LaunchDaemons/tftp.plist
TFTP サーバを正常に停止出来ていれば、lsof で UDP/69 を確認しても、Listen しているプロセスが無いことが確認出来ます。
$ sudo lsof -i:69
$
コメント