■refs
scpとsftpの違い。軽快なscpか高機能なsftp,sshに向いているのは?

■ssh,scpでファイル転送
sshを使用したファイル転送scpコマンドについて。テスト台としてawsのec2にsshのポートだけ空けておく。また、鍵を~/.ssh/DefaultAWSKey.pemにおいておく。

ローカルのhoge.txtファイルを99.199.○○.○○のec2-userの$HOMEに転送する。鍵はhogeKey.pem
$ scp -i ~/.ssh/hogeKey.pem hoge.txt ec2-user@99.199.○○.○○:

ローカルのhogedirディレクトリを99.199.○○.○○のec2-userの$HOME/testdir/に転送する。
$ scp -i ~/.ssh/hogeKey.pem -rp hogedir/ ec2-user@99.199.○○.○○:testdir/

ただ、間違ったコマンドを実行したときにプロンプトにエラーメッセージも何も表示しなかった・・・

一方、リモートからローカルにファイルを取得する場合。

リモート99.199.○○.○○の$HOME/iii.txtファイルを取得(見づらいけど最後に. ドットがある)
scp -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○:~/iii.txt .

リモート99.199.○○.○○の$HOME/testdirディレクトリを、ローカルの$HOME/tmpディレクトリ下に取得
scp -i ~/.ssh/hogeKey.pem -rp ec2-user@99.199.○○.○○1:~/testdir ~/tmp/

■sshでリモート端末でコマンド実行

リモートのファイル一覧表示
$ scp -i ~/.ssh/hogeKey.pem -rp ec2-user@99.199.○○.○○ ls -l


リモートにファイル作成

$ ssh -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ touch hoge.txt

リモートにある$HOME/work/test_shシェルを実行する

$ ssh -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ ./work/test_sh


シェルスクリプトファイルをscp,sftpなどで転送し、そのスクリプトを実行する事も出来る。シェウスクリプと内でsudoでroot権限で実行する場合、-tオプションが必要。
$ ssh -t -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ ./work/test_sh

■sftpでファイル転送
いんたらくてぃぶに頻繁にファイルをやりとりするなら、sshよりsftpの方が楽。ec2とのやりとりを下に書く(鍵はconfigに設定してある。ホスト名はdefault-ec2にしてある)

・セッション開始
$ sftp ec2-user@default-ec2
Connected to default-ec2.
sftp>

ファイル一覧
sftp> ls -l
移動
sftp> cd hogedir
ファイル取得
sftp> get hoge.tx
ローカルファイル一覧
sftp> lls
ローカルファイルのアップロード
sftp> put aiueo.txt

sftpの他の内部コマンド
ヘルプ
sftp>?
ローカル移動、lcd
ファイル名変更、rename ord new
ファイル削除、rm
パーミッション変更、chmod
めんどくせぇ
lpwd,pwd,mkdir,rmdir

sftpの大きな弱点はディレクトリごと転送できない。大量のファイルを一度に転送する場合、sryncを使う

■rsyncでファイル転送
rsyncは転送元と転送先のファイルを比較し差分を送信する事で、ネットワーク転送料を最小に抑える。従量課金のaws向き
rsync+sshの組み合わせがでふぉ。古いバージョンのrsyncでOpenSSHを使った転送するためには、クライアント側の環境変数RSYNC_RSHをsshにする。具体的には2.6.6以降のバージョンならデフォでsshを使うようになっているから、環境変数を指定する必要はない。
#bash
export RSYNC_RSH=ssh

前提として鍵は設定済み。configでリモートホスト名はdefault-ec2してある。

リモートの$HOME/work/remote.txtを取得
$ rsync ec2-user@default-ec2:work/remote.txt .
リモートの$HOME/work/remote.txtを取得して、ローカルのtodirに保存
$ rsync ec2-user@default-ec2:work/remote.txt todir/
リモートの$HOME/work/test_remote_dirディレクトリを取得して、ローカルのtodirディレクトリに保存する。-rはリカーシブル、-aはアーカイブモード
$ rsync -a -r ec2-user@default-ec2:work/test_remote_dir todir/

リモートの$HOME/workディレクトリをローカルのworkディレクトリと同期させる。
$ rsync -a ec2-user@default-ec2:work/ work/
-aはディレクトリの再帰的な転送を可能にするもので、同時にパーミッションや更新日時、シンボリックリンクも正しく複製する。これがアーカイブモード?

ちなみに、-uは更新モード。より新しいファイルが転送先にある場合、そのファイルを転送しない。-bはバックアップモード。転送先のファイルを上書きする場合、古いファイルのバックアップを作成する。

今度はローカル環境からの転送。

ローカル環境のlocal.txtをリモートのworkディレクトリ下に転送
$ rsync local.txt ec2-user@default-ec2:work
ローカル環境のtestdirディレクトリをリモートのworkディレクトリ下に転送
$ rsync -a testdir ec2-user@default-ec2:work

-vは冗長モード、-zは圧縮をしよう、-e "コマンド"は、sshの代わりに実行するコマンドを指定する