Skip to content

macOS で TFTP サーバを起動する

ネットワーク機器に触れていると OS や設定ファイルの退避先として TFTP サーバを利用したくなることが、しばしばあります。Snow Leopard のクライアント版では、デフォルトで TFTP サーバが無効になっていますので、有効にしてみます。

Snow Leopard には標準で TFTP サーバがインストールされています。パラメータファイルは /System/Library/LaunchDaemons/tftp.plist になります。]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ 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 サーバを起動します。

1
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist 

TFTP サーバは UDP/69 を Listen しますので、正常に起動しているか、否かは、lsof コマンドで 69 番ポートを Listen しているプロセスを確認することで分かります。

1
2
3
4
$ 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> プロンプトが返ってきます。

1
2
$ tftp 127.0.0.1
tftp>

ASCII / BINARY モードを切り替える

FTP 同様、TFTP でもファイルをダウンロードする前に対象ファイルがテキストなのか、それともバイナリなのかを、モードとして指定します。

  • ASCII モード
    • テキストファイルを扱う場合に ascii コマンドで指定する。
  • BINARY モード
    • バイナリファイルを扱う場合に binary コマンドで指定する。

現在のモードは status コマンドで確認出来ます。以下は ASCII モードに切り替えた例です(デフォルトでは ASCII モードです)。

1
2
3
4
5
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 モードに切り替えた例です。

1
2
3
4
5
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 コマンドで対象ファイル名を指定し、ダウンロードします。

1
2
tftp> get tmp.txt
Received 235 bytes in 0.0 seconds

アップロードする

put コマンドで対象ファイル名を指定し、アップロードします。ただし、TFTP でファイルをアップロードする場合、アップロードしようとしているファイルが存在している必要があります(上書きしか出来ません)。TFTP サーバとして公開しているディレクトリに tmp.txt というファイルが無い状態で、tmp.txt をアップロードしようとすると、以下のエラーとなってしまいます。

1
2
tftp> put tmp.txt
Error code 512: Access violation

エラーを避け、意図した通りにファイルをアップロードするには事前にファイルを作成しておき、更に書き込み権限を与えておきます。ここでは touch でファイルを新規作成し、更に chmod で書き込み権限を付与しています。

1
2
3
4
5
$ 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 サーバから切断出来ます。

1
2
tftp> quit
$

TFTP サーバを停止する

起動時同様、launchctl で TFTP サーバを停止します。

1
sudo launchctl unload /System/Library/LaunchDaemons/tftp.plist 

TFTP サーバを正常に停止出来ていれば、lsof で UDP/69 を確認しても、Listen しているプロセスが無いことが確認出来ます。

1
2
$ sudo lsof -i:69
$