lftpでFTPSアップロード【シェルスクリプト】
- 最終更新:
- 公開日:
Linux環境で、シェルスクリプトのlftpコマンドを使い、FTPS(ssl)経由で、サーバーに手元のファイルをアップロードする方法についてのメモです。
個別にアップすることも、ミラーでまとめて処理することも可能です。
実践した環境は、LinuxのDebian9、lftp4.7.4です。
lftpならFTPS経由でサーバーを使える
最近では、単なるFTP接続ではサーバー間との通信をのぞき見される可能性があるため、暗号化する通信方法を使う必要性があります。
SSHを使えるサーバーであれば、SFTP(SSH File Transfer Protocol)を使ってアクセスすることで、自分のデスクトップと大体同じような感じでコマンドを使えます。
アップロードについてもrsyncのコマンドでミラー処理すれば便利です。
しかし、格安レンタルサーバーの下位プランだと、SSHが使えない場合が多いため、FTPS(File Transfer Protocol over SSL/TLS)の方を使う必要があります。
そのためのコマンドとして、lftpを利用することが考えられます。
lftpでサーバーに接続する基本形
lftpでワンラインでサーバーにログインするなら、オプションの「-u」をつけて、ユーザー名とカンマをはさんでパスワード、そしてFTPアドレスです。
この方法でサーバーに接続すれば、サーバー上で任意の処理ができます。
ただし、コマンドに履歴を残さないように、スクリプトに書いて実行した方が良いです。
ヒアドキュメントで処理をまとめて書くなら、lftpでログイン後に「open」コマンドでサーバーに接続し、記載した内容を処理して、lftpを閉じることになります。
#lftpでサーバーにアクセス
$ lftp -u user,pass ftp-adress
#ヒアドキュメントでまとめて処理
$ lftp <<EOF
set ftp:list-options -a
open -u user,pass ftp-adress
ls
quit
EOF
「set」は設定変更のコマンド(このset例の内容は下の方で)、「ls」はファイル等一覧のコマンド、「quit」でlftpを終了します。
他にlftpでどんな操作をできるのかについては、マニュアルを参照して下さい。
lftpの基本操作・ヘルプ・マニュアルについて【シェルスクリプト】
「Certificate verification: Not trusted」の警告が出たら?
サーバに接続して「ls」などの操作をすると、サーバーによっては、「Certificate verification: Not trusted」のような表示が出て処理ができないことがあります。
これはサーバーのSSL証明書が認証されていないという意味です。
サーバー側の設定等によっては、安全であってもこれが出る場合があるようです。
そのため、接続先が安全なサーバーだと分かっているのであれば、lftpでこのチェックをしないように設定を変える手があります。
この場合は「set ssl:verify-certificate no」を使います。
#SSL証明書をチェックしないように設定変更
lftp:~> set ssl:verify-certificate no
#SSL証明書のチェックを省略する接続例
$ lftp -e 'set ssl:verify-certificate no' -u user,pass ftp-adress
「set」コマンドの使い方については、色々と方法がありますので、別のページを参照して下さい。
lftpでサーバーにファイルをアップする
手元にHTMLファイルを用意して、サーバーにアップすることで自分のサイトを運営するなどといった用途にも、lftpを使うことができます。
個別ファイルでもupできますし、まとめてミラー処理をすることもできます。
ちなみに、アップロードする際には、事前にパーミッションを設定しておいた方が無難です。
#ディレクトリは705、ファイルは604にする場合の例
$ find 対象のパス -type d | xargs chmod -R 705
$ find 対象のパス -type f | xargs chmod -R 604
また、htaccessファイルを利用する場合は、隠しファイルも対象にするよう設定を変更する必要があります(サーバーにもよるのかもしれませんが)。
この場合も「-e」オプションを使うなどして、「set ftp:list-options -a」を適用します。
#隠しファイルを表示させるよう設定変更
lftp:~> set ftp:list-options -a
#隠しファイルを表示させる接続例
$ lftp -e 'set ftp:list-options -a' -u user,pass ftp-adress
setコマンドについては、上のSSL証明チェックと同様に別ページを参照して下さい。
「put」で個別ファイルをアップロード
lftpでサーバーに接続後に、「put」コマンドを利用すれば、手元の個別のファイルをサーバーにアップロードすることができます。
「-o」の後に、アップロード先のパス(ファイル名まで)を記載します。
アップ先のパスは、接続したFTPアドレスをルートとした書き方になります。
#個別ファイルのupload(接続後)
lftp:~> put ローカルfileパス -o アップ先fileパス
#lftp上のputコマンドのヘルプ
lftp:~> help put
lftp上で使えるコマンドとしても「mkdir」はありますが、指定した先にディレクトリがない場合には、生成してくれるようです。
ちなみに、サーバーからの個別ファイルのダウンロードは「get」です。
「mirror」でまとめて同期処理
lftpでディレクトリごとまとめて同期させることも可能です。
lftp上の「mirror」コマンドで、サーバーへのアップロードといいますか、接続先をローカルに同期させるには、「-R」をつけることを忘れないで下さい。
lftpでサーバーに接続した状態でmirrorコマンドを利用します。
必要なオプションを指定した後に、ローカルフォルダのパス、サーバー側フォルダのパスの順で指定する形になります。
#サーバーをローカルに同期させる例(接続後)
lftp:~> mirror -R --delete --parallel=4 --only-newer --log=log-path localパス serverパス
オプションはとても多いので、いくつか紹介しておきます。ここでの説明は「-R」をつけた場合を前提にしています。
- 「--delete」 ローカルにないファイルは削除する。
- 「--parallel=数字」 数字の数だけ平行処理する。
- 「--only-newer」 ファイルサイズの比較をせずに、新しいファイルだけアップロードする。
- 「--ignore-time」 ファイルのタイムで対象を決めない。
- 「--log=ファイルパス」 ログをファイルに保存する。
mirrorのオプションについては、コマンドのマニュアル「man lftp」のmirrorコマンドの欄に記載されています。
マニュアルは英文で、「-R」をつけない、サーバーからのダウンロードといいますか、サーバー側にローカルを同期させる処理を基準とした書き方になっているのでご注意下さい。