Hatena::ブログ(Diary)

えこ日記

2009-10-28

TFTP サーバを起動する

| 08:47

ネットワーク機器に触れていると 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
$