/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

sftpをワンライナーで使う

全開の記事でSCPとSFTPの違いを調べて、SFTPは対話形式になるという説明をしたのですが、実はSFTPでもワンライナーで実行できます。

今日はそんなお話。

 

SFTPもワンライナーで実行できる

SCPとSFTPの実際にコマンドを比較してみましょう。

前提条件

コマンドライン比較表

転送方向 SCP SFTP (バッチモード)
ローカル → リモート
(アップロード)
scp /path/to/local/file.txt user@remotehost:/path/to/remote/ echo "put /path/to/local/file.txt /path/to/remote/" | sftp user@remotehost
リモート → ローカル
(ダウンロード)
scp user@remotehost:/path/to/remote/file.txt /path/to/local/ echo "get /path/to/remote/file.txt /path/to/local/" | sftp user@remotehost

それぞれの仕組みと特徴

SCPの場合

SCPは本当にシンプルですね。Linuxcpコマンドの延長みたいな感覚で使えます。

# 基本構文
scp [オプション] <コピー元> <コピー先>

# リモートの指定方法
ユーザー名@ホスト名:パス

cpコマンドと同じような感じで使えるのが非常にとっつきやすくて手軽なところですね。出来ないこととして、「ファイル転送の中断・再開ができない」「転送以外の操作(ディレクトリ作成、ファイル削除など)はできない」というのがあります。

また、最近、セキュリティ面での懸念が指摘されているようです。(前回記事参照)

 

SFTPバッチモードの場合

SFTPをワンライナーで使う場合、標準入力からコマンドを渡す方法が一般的です。

# 基本構文
echo "SFTPコマンド" | sftp [オプション] ユーザー名@ホスト名

# 複数コマンドの実行
echo "cd /path/to/remote/; put file.txt; ls -la" | sftp user@remotehost

SCPとの違いとしては

  • 転送の中断・再開が可能(クライアントによる)
  • rm(削除)やls(一覧表示)など、転送以外のコマンドも実行可能
  • よりセキュアなプロトコル
  • 複数の操作を一度に実行できる

などがあります。パイプを併用して使うので、SCPに比べるとLinux知識が多少関連してくるものですね。

 

実務でのユースケース

実際の業務で、どんな場面でこれらのコマンドを使うか整理してみました。

踏み台サーバー経由でのファイル転送

これは実務でよくあるパターンですね。

# 踏み台サーバー経由でのSFTP転送例
echo "put /local/config.txt /remote/app/" | sftp user@192.168.1.100

ログファイルの定期収集

cronと組み合わせて、定期的にログを収集するような使い方もできます。

# 毎日のログファイル収集
echo "get /var/log/app/$(date +%Y%m%d).log /backup/logs/" | sftp user@192.168.1.100

デプロイ時の設定ファイル配布

複数のサーバーにファイルをコピー(例えば、設定ファイルを配布するなど)もシェルと組み合わせて出来ます。

# 複数サーバーへの設定ファイル配布
for server in web1 web2 web3; do
    echo "put config.yaml /etc/app/" | sftp deploy@${server}
done

バックアップファイルの転送

データベースダンプやファイルバックアップの転送などにも使えますね。下のコマンドラインはバックアップファイルなどが置いてあるサーバから実行するイメージです。

# バックアップファイルの安全な転送
echo "put backup_$(date +%Y%m%d).tar.gz /backup/daily/" | sftp user@192.168.1.100

 

まとめ

単純なファイルコピーなら、確かにSCPの方が手軽です。でも、スクリプト化や自動化を考えると、SFTPのバッチモードの方が圧倒的に柔軟だなと感じます。

特に以下の場合は、SFTPバッチモードを選択することをおすすめします:

  • スクリプトでの自動化を想定している
  • ファイル転送以外の操作も必要
  • セキュリティ要件が厳しい環境
  • 将来的な機能拡張を考慮したい

昨今の風潮からだともしファイル転送がある場合はSFTPがいいのだろうなと思います。

それではー!