Tech Horse Club

技術ブログ×競馬予測

【SFTP】macOS 10.13 High SierraでCLIからFTPコマンドが使えないので、SFTPを使う

先日、macOSをHigh Sierraにアップデートした所、さくらVPSからmysqldumpを取得するbashスクリプトが動かなくなりました。。 原因は何かなと思って調べてみた所、どうやら「ftpコマンドがないよ!」と怒られているようでしたので、「じゃあftpクライアントいれたろ!」と思って色々やりましたが、うまくインストール出来ません。そもそもなんでftpクライアントがないんや、と思って調べてみた所、どうやらmacOS HighSierraからは、/usr/bin配下のftpクライアントが廃止されてしまったみたいです。

macOS 10.13 High SierraではTelnetやFTPコマンドが廃止される

FTPプロトコルはインターネット初期から存在する大変レガシーなプロトコルです。当然セキュアなプロトコルとして設計されておらず、昨今のセキュリティ事情Googlehttpsページを優先的に検索結果に表示するようアルゴリズムを変更している)からみても、セキュアでないプロトコルは淘汰されていく傾向にあるようです。

というわけで、良い機会だと前向きに捉えて、セキュアなファイル転送プロトコルであるSFTPを使用するよう、スクリプトに改修を加えます。SFTPは、sshの仕組みを利用したファイル転送プロトコルなので、ssh接続を許可しているサーバとファイルのやり取りをする事ができます。(OpenSSHのサブコマンドとして実装されています。)

スクリプトの改修

下記が、スクリプトの中でftpコマンドを発行している箇所です。変数名にサーバの情報やgetするファイルを定義し、ローカルに取得しています。ここを、sftpを用いて取得するように書き換えます。

ftp -n <<END
open ${SERVER}
user ${USER} ${PASSWORD}
cd ${FTP_DIR}
binary
prompt
get ${FILE_NAME}
END

このコードをsftpを用いて書き換えると、わずか一行です。-bオプションは、バッチファイルに記述したコマンドを使ってファイルを転送するオプションです。引数の[sakura]は、sshの接続先ホスト名です。公開鍵認証での接続設定を、「~/.ssh/config」で定義しています。

sftp -b ./mysqldump_sftp.bat sakura

バッチファイルの中身はこんな感じ。

$ cat mysqldump_sftp.bat
cd /tmp
get hoge.dump

これで、コードの量も減らせて、セキュアにファイルのやり取りが出来るようになりました。稼働確認した所、無事に動いたようで、一安心です。