rsyncでpermission denied (publickey) となった時の対処法

rsyncでローカル環境とリモートサーバーのディレクトリを同期したい!

ということありますよね。そう思い、rsyncを使ってみたらつまずいた時の対処法です。

エラーの内容と原因

ローカル環境の現在のディレクトリと、リモートサーバーの/home/wwwを同期しよう思い、実行したのが以下のコマンド。

$ rsync --delete -avzc ./* www@11.22.33.444:/home/www
 Permission denied (publickey).
 rsync: connection unexpectedly closed (0 bytes received so far) [sender]
 rsync error: unexplained error (code 255)

見事にPermission deniedされてますね。

もちろん、~/.ssh/configには以下のように設定を追記済みで、ssh remoteで接続できることも確認済です。

Host remote
  HostName 11.22.33.444
  User www
  Port 22
  IdentityFile ~/.ssh/id_rsa

rsyncのエラー解決策

rsyncは、裏側でsshをデフォルトでは使っているそうです。そこで、rsyncのeオプションを使い秘密鍵を指定してssh接続をしてみたいと思います。

eオプションを使いダブルクオーテーションで囲むことでsshのiオプションを使うことができます。

-e "ssh -i /Users/sample_user/.ssh/id_rsa"

コマンド全体としては↓のような感じになります。

$rsync --delete -avzc -e "ssh -i /Users/sample_user/.ssh/id_rsa"  ./* www@11.22.33.444:/home/www

これで実行したところ…できた!

秘密鍵がちゃんと指定できなかったことが問題だったようです。rsyncはあまり使ったことがないので、割りと雑な対処ですがこれでなんとか同期ができました。

Crondの(CRON) bad commandエラーの対処法

cronを設定したはずなのに、動かない時の対処方法です。ログを確認する前にcronの状態とファイルパーミッションを確認します。

$ service crond status

crondがrunning状態であることを確認。

$ ls -la

また実行ファイル(シェルスクリプト)のパーミッションを確認して、ファイルの実行権限が正しく設定されているか確認します。

ここまで問題なければ、cronのログファイル(/var/log/cron)を確認します。

$ tail /var/log/cron

確認すると以下のようなbad commandエラーが出ていました。

crond[1668]: (CRON) bad command (/etc/cron.d/sample)

cronの実行エラーの原因・対処法

原因は、/etc/cron.d/sampleのファイル末尾に空行がなかったせいでした。

以下のようにファイル末尾には空の行を1つ入れないとbad commandとなってしまうようです。

0 3 * * * /backup/bin/mysql_dump.sh

これはcrontab -e コマンドを使わずに、以下のように直接ファイルを作成したことによるものでした。

$ echo "0 3 * * * /backup/bin/sample.sh" > /etc/cron.d/sample

対処法は簡単で作成したファイルの末尾に行を追加すれば良いだけです。

MySQLが「Fatal error: cannot allocate memory for the buffer pool」となり起動しない問題

開発環境のWordPressがいきなり「データベース接続確立エラー」となり、mysqlが起動しなくなってしまった時の対処法です。

原因:buffer poolのメモリ割当が少なかったせい

mysqlを起動すると以下のようにエラーに。

$ service mysqld start
MySQL Daemon failed to start.
Starting mysqld:                                           [FAILED]

まずは、/var/log/mysqld.logを確認。すると以下のようなエラーがでていました。

151117  9:55:58 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
151117  9:55:58 InnoDB: Completed initialization of buffer pool
151117  9:55:58 InnoDB: Fatal error: cannot allocate memory for the buffer pool
151117  9:55:58 [ERROR] Plugin 'InnoDB' init function returned error.
151117  9:55:58 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
151117  9:55:58 [ERROR] Unknown/unsupported storage engine: InnoDB
151117  9:55:58 [ERROR] Aborting

原因となりそうなのはこの部分。

151117  9:55:58 InnoDB: Fatal error: cannot allocate memory for the buffer pool

対処法:my.cnfのinnodb_buffer_pool_sizeを増やす

メモリの割当ができなかったようなので、/etc/my.cnfを編集してメモリの割当を増やします。とりあえず、512Mにすることに。

innodb_buffer_pool_size = 512M

そこで、MySQLを再起動。

$ service mysqld start
Starting mysqld:   [  OK  ]

これでMySQLが再起動しました。

*注意* innodb_log_file_sizeは変更しない

ちなみにinnodb_log_file_sizeを合わせて変更しようとすると、MySQL 5.6未満だとエラーとなるようです。

特に理由がなければ、innodb_buffer_pool_sizeのメモリを増やすだけで良いかなと思います。

[MySQL] innodb_log_file_sizeを変更した時のエラー対処

[MySQL] innodb_log_file_sizeを変更した時のエラー対処

/tmp/my.cnfのinnodb_log_file_sizeを変更すると、エラーになりmysqlが起動できないという現象に。

mysqld.logを見てみると以下のようなエラーに。

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 134217728 bytes!

my.cnfで指定したメモリのサイズとib_logfile0のサイズが違うとのこと。ib_logfile0はInnoDB ログファイルです。

どうやら、MySQL 5.6 未満でmy.cnfのinnodb_log_file_sizeを変更すると発生するようです。

いきなり消すのは怖いので、/tmpに一旦退避させます。

$ mv /var/lib/mysql/ib_logfile0 /tmp
$ mv /var/lib/mysql/ib_logfile1 /tmp

そして、またmysqlを再起動すると以下のようなエラーに。

151118  7:04:09  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile0 size to 128 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100
151118  7:04:09  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
InnoDB: Setting log file ./ib_logfile1 size to 128 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Progress in MB: 100
151118  7:04:09 InnoDB: Cannot initialize created log files because
151118  7:04:09 InnoDB: data files are corrupt, or new data files were
151118  7:04:09 InnoDB: created when the database was started previous
151118  7:04:09 InnoDB: time but the database was not shut down
151118  7:04:09 InnoDB: normally after that.

調べてみると、ib_logfile0などを消すのはあまり良くない対処のよう。

公式の、nnoDB ログファイルの数またはサイズの変更、および InnoDB テーブルスペースのサイズの変更を参考に対処しました。

とりあえず動かすとこまでの「Ansible入門」:nginx, php-fpm, mysql編

Chefよりも手軽に使えるということでAnsibleを試してみました。

今回は、nginx、php-fpm、mysqlを入れて、さらにmysqlでデータベースとユーザーを作成するところまでをやってみます。とりあえずの使用感を知りたかったので、Ansibleの環境はlocalhostです。

Ansibleを使うには

CentOS6でAnsibleを使うには、yumでansibleをインストールするだけでOKです。インストールしたらサーバー構築の手順書であるPlaybookを書いて、実行すればOKです。

簡単な流れは以下の通り。

・Ansibleをyumでインストール
・Playbookでサーバー構築の設定を書く
・Playbookを実行

1. Ansibleのインストール

$ yum clean all
$ yum -y update
$ yum -y install ansible
$ cd /etc/ansible/

構成は以下のようになってます。

$ ls 
	ansible.cfg  hosts  roles

ansible.cfgはansibleの設定ファイル。hostsはansibleの対象となるサーバーや、グループなどを設定できます。

今回はlocalhostのみが対象でさくっとお試しなので、特に設定することはありません。

2. Playbookを作成

rolesディレクトリや好きなディレクトリに移動してplaybookを作ります。

使えるコマンド(モジュール)は、公式のModule Indexに記載があります。

$ cd roles
- hosts: 127.0.0.1
  connection: local
  sudo: yes
  tasks:
    - name: add nginx repository
      yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present

    - name: add remi repository
      yum: name=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm state=present

    - name: add epel repository
      yum: name=http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm state=present

    - name: install nginx
      yum: name=nginx state=present
 
    - name: install php packages
      yum: name={{ item }} state=present enablerepo=remi
      with_items:
        - php
        - php-cli
        - php-devel
        - php-mbstring
        - php-gd
        - php-pear
        - php-xml
        - php-fpm

    - name: install mysql packages
      yum: name={{ item }} state=present enablerepo=remi
      with_items:
        - mysql.x86_64
        - mysql-server.x86_64
        - php-mysql

    - name: be sure php-fpm is running and enabled
      service: name=php-fpm state=running enabled=yes

    - name: be sure mysqld is running and enabled
      service: name=mysqld state=running enabled=yes

    - name: be sure nginx is running and enabled
      service: name=nginx state=running enabled=yes

    - name: install MySQL-python
      yum: name=MySQL-python state=present

    - name: add root user of mysqld
      mysql_user:
        name: root
        host: localhost
        password: samplepassword

    - name: create n edit ~/.my.cnf
      lineinfile:
        dest: ~/.my.cnf
        line: "[client]\nuser=root\npassword=samplepassword"
        create: yes

    - name: create new database
      mysql_db:
        name: wordpress
        state: present

    - name: add new user
      mysql_user:
        name: wordpress
        password: wordpress
        priv: "wordpress.*:ALL"
        host: localhost
        state: present

3. Ansibleを実行

Playbookの実行にはansible-playbookコマンドを使います。–syntax-checkなどをつけることで、構文チェックなどができます。

# 構文チェック
$ ansible-playbook playbook.yml --syntax-check
# タスクを確認
$ ansible-playbook playbook.yml --list-tasks
# 仮実行
$ ansible-playbook playbook.yml --check
# 実行
$ ansible-playbook playbook.yml

使ってみた感想としては、手軽に使えてYAMLで記述できるので見通しもよく扱いやすい印象。

その反面、ほかの人も指摘していますが複雑な処理は苦手そうといったイメージ。

初心者がvimをカスタマイズしてプラグインを導入するまで

vimをアップデート

vimのバージョンが古くて一部のプラグインが使えなかったので、新しいバージョンのvimをインストールします。
ついでにneocompleteなどで使うので、Luaも有効化しておきます。

$ yum -y install mercurial
$ yum -y install ncurses-devel
$ cd /usr/local/src
$ hg clone https://vim.googlecode.com/hg/ vim
$ cd /usr/local/src/vim
$ ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=dynamic --enable-rubyinterp --enable-fail-if-missing --with-lua-prefix=/usr
$ make
$ make install

そのあとに、シンボリックリンクを貼るか.bashrcにaliasを設定します。

$ vi ~/.bashrc

以下のaliasを追記。vimまたはviで新しくインストールしたvimが起動します。

alias vi='/usr/local/bin/vim'
alias vim='/usr/local/bin/vim'
alias vimrc='vi /usr/local/share/vim/vimrc'

.bashrcに追記した内容を反映させます。

$ bash

ミニマムの設定をvimrcに追加

設定ファイルvimrcの場所を確認します。

$ vim --version

すると、vimのバージョンなどと一緒に設定ファイルの場所が以下のように表示されます。

システム vimrc: "/$VIM/vimrc"
ユーザ vimrc: "$HOME/.vimrc"

$VIMなどはvim上で:echo $VIMで確認できます。

とりあえず、下記を調べた設定ファイルvimrcに追加します。

set number
set title
set ambiwidth=double
set tabstop=4
set expandtab
set shiftwidth=4
set smartindent
set list
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
set nrformats-=octal
set hidden
set history=50
set virtualedit=block
set whichwrap=b,s,[,],<,>
set backspace=indent,eol,start
set wildmenu
syntax on

カラースキームを設定

次にカラースキームを設定します。今回は人気のmolokaiを設定します。
*colorsディレクトリの場所は環境に合わせて確認してください

$ cd /usr/local/share/vim/vim74/colors
$ git clone https://github.com/tomasr/molokai

colorschemeをvimrcに追加。

colorscheme molokai

NeoBundleを追加

次にvimプラグインを追加します。プラグインの管理にはNeoBundleを使います。

$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
$ git clone https://github.com/Shougo/vimproc ~/.vim/bundle/vimproc
$ vi /etc/vimrc

vimrcに以下を追加

if has('vim_starting')
   set runtimepath+=~/.vim/bundle/neobundle.vim
   call neobundle#begin(expand('~/.vim/bundle/'))
       NeoBundleFetch 'Shougo/neobundle.vim'
       NeoBundle 'Shougo/vimproc'
       NeoBundle 'VimClojure'
       NeoBundle 'Shougo/vimshell'
       NeoBundle 'Shougo/unite.vim'
       NeoBundle 'Shougo/neocomplcache'
       NeoBundle 'Shougo/neosnippet'
       NeoBundle 'jpalardy/vim-slime'
       NeoBundle 'scrooloose/syntastic'
       NeoBundle 'scrooloose/nerdtree'
       call neobundle#end()
endif
NeoBundleCheck

filetype off
filetype plugin indent on
filetype indent on

vimrcを保存してからvimを再起動。NeoBundleCheckを設定しているので、起動時にインストールしていないプラグインをインストールか聞かれます。

NeoBundleCheckを設定しない場合は、vimのコマンドラインで:NeoBundleInstallとすることで指定したプラグインをインストールできます。

NeoBundleコマンド

:NeoBundleInstall プラグインのインストール
:NeoBundleList プラグインのリスト
:NeoBundleClean プラグインを削除
:NeoBundleUpdate プラグインのアップデート

そのほか、キーバインドに関してなどはまたの機会に。

[rsub] リモートサーバーのファイルをSublime Textで開く方法

タイトルのままリモートサーバーのファイルをSublime Textで開く方法です。

sftpやsshfsを使ってリモートサーバーとローカルを同期させる方法もあるようですが、

・ファイル同期を待ちたくない
・ローカルにファイルがいっぱいになるのが嫌だ

ということでよりお手軽なrsubを選んでみました。

1.Sublime Text2の側の設定

以下の手順でrsubのパッケージを追加します。

  1. SublimeTextを開く
  2. Command Palettを開く(CMD + Shift + P)
  3. 「Package Control: Install Package」を選択
  4. 「rsub」を選択してインストール

2.リモートサーバー側の設定

リモートサーバーにログインしたら、rsubをインストールします。

$ sudo wget -O /usr/local/bin/rsub https://raw.github.com/aurora/rmate/master/rmate
$ sudo chmod +x /usr/local/bin/rsub

3.ローカルでsshのconfigを設定

ここで一旦、ローカルに戻りsshのconfigを設定します。

$ vi ~/.ssh/config

以下の2行をconfigに追加して保存。

Host example.com
  RemoteForward 52698 localhost:52698

これで上手くいくはず(?)だったのですが、リモートサーバーでrsubしてもエラーがでてしまいました。

$rsub sample.txt
  /usr/local/bin/rsub: connect: 接続を拒否されました
  /usr/local/bin/rsub: line 321: /dev/tcp/localhost/52698: 接続を拒否されました
  Unable to connect to TextMate on localhost:52698

なので、configを以下のように変更します。

Host example.com
  User example_user
  HostName 123.45.67.890
  Port 22
  RemoteForward 52698 localhost:52698

保存してローカルからリモートサーバーにssh接続をします。

$ ssh example.com

リモートサーバーからrsubでファイルを開いてみます。

$ rsub sample.txt

これで無事にSublime Textでファイルを開くことができました。
開いたファイルはSublime Text上で保存すればリモートサーバーでも反映されます。

さくらのVPS(CentOS)にnginxリバースプロキシを入れて高速化する方法

さくらのVPSの初期設定から、nginxを入れてリバースプロキシの設定をするまでの手順を(自分用に)まとめました。

今回最も参考になったのは以下の本です。nginx以外の高速化の手法も豊富でおすすめです。

さくらのVPSの初期設定

さくらのVPSを契約したら、まずはコントロールパネルからサーバーを起動します。

起動したらrootユーザーでssh接続します。パスワードはメールで送付されているはずです。

$ ssh root@160.17.60.189

ここでたまにエラーになるのですが、そんな時はコントロールパネルからサーバーを再起動すれば接続できることが多いです。

次に、ユーザーを追加します。ここでは「username」というユーザーを新しく追加することとします。

$ passwd
$ useradd username

passwordコマンドでパスワードを設定します。

$ passwd username

次に追加したユーザーにsudo権限を与えます。

今回は「wheel」グループにsudo権限を持たせ、追加したユーザーを「wheel」に所属させます。

$ usermod -G wheel username
$ visudo

visudoコマンドで設定ファイルが開くので、#(コメントアウト)を消します。

# %wheel ALL=(ALL) ALL

ついでに最低限のファイアーウォールの設定をiptablesでします。

$ iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
$ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$ iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
$ iptables -A INPUT -i lo -j ACCEPT 
$ iptables -A INPUT -p icmp -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$ iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ iptables -P INPUT DROP 
$ iptables -P OUTPUT ACCEPT
$ service iptables save

この辺りの最初の設定は、さくらインターネットのサーバの初期設定ガイドに載っています。

yumの準備

アップデートをして、remiやepelなどのレポジトリを追加します。

$ yum update

yum updateで「更新と設定されたパッケージがありません。」などと出てこけたら以下のコマンドを実行したらから再度アップデートしてみてください。

$ yum clean all
$ yum check
$ yum update

remiとepelを追加します。失敗したらURLを最新のものに差し替えてみてください。

$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

nginxのインストール

次にnginxをインストールします。

yumでインストールできるnginxのバージョンを確認。

$ yum info nginx

ちょっと古かったのでnginxのレポジトリを追加してから、インストールします。

$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ yum install -y nginx

インストールできたらnginxを立ち上げてから、サーバー起動時に自動でnginxが立ち上がるように設定します。

$ service nginx start
$ sudo /sbin/chkconfig nginx on

phpのインストール

PHPをインストールしてphp.iniを編集します。

$ yum --enablerepo=remi -y install php php-cli php-devel php-mbstring php-gd php-pear php-xml
$ vi /etc/php.ini

php.iniは、とりあえず以下のように変更します。

expose_php = Off
date.timezone = "Asia/Tokyo"

nginxでPHPを動かす時に使うphp-fpmを入れて設定ファイルwww.confを編集します。

$ yum --enablerepo=remi -y install php-fpm
$ vi /etc/php-fpm.d/www.conf

細かいチューニングは後から行うとして、まずは以下のように設定します。

user = nginx
group = nginx
pm = static

php-fpmを立ち上げ、これもchkconfig onします。

$ service php-fpm start
$ sudo /sbin/chkconfig php-fpm on

mysqlのインストール

MySQLをインストールします。

$ yum --enablerepo=remi -y install mysql.x86_64 mysql-server.x86_64 php-mysql

ここでは、起動してからrootを「samplepassword」に設定します。

$ service mysqld start
$ sudo /sbin/chkconfig mysqld on
$ mysqladmin -u root password 'samplepassword'
$ mysql -u root -p

wordpressというデータベースを作成します。

create database wordpress default character set utf8 collate utf8_general_ci;

次にwordpressというユーザーを作成し、パスワードを「samplepassword」とします。

grant all privileges on wordpress.* to wordpress@localhost identified by 'samplepassword';

リバースプロキシの設定(nginx.confの編集)

リバースプロキシを設定するために、nginx.confとdefault.confを編集します。

設定ファイルはGistを参照してください。

*さくらのVPS:CentOS64、nginx 1.6.3、PHP 5.4.39で動作確認。
*その他の環境での動作は保証しかねます。

/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf

設定ファイルを編集し、nginxを再起動します。

$ service nginx restart

バックアップデータの移行

WordPressを使用していてサーバー移転する時のメモです。

htmlディレクトリ以下をすべて圧縮し、データベースはdumpしてバックアップを保存。

$ tar zcvf html.tar.gz html
$ mysqldump -u root -p wordpress > dump.sql

転送先のサーバーにsftpコマンドで接続して、dump.sqlとhtml.tar.gzを転送します。

$sftp root@123.45.67.89
  put dump.sql
  put html.tar.gz

転移先のサーバーにssh接続して、html.tar.gzを解凍&dumpファイルをインポートします。

$ tar zxvf html.tar.gz
$ mysql -u root -p wordpress < dump.sql

これで、CentOS+nginx(リバースプロキシ)+ php-fpmの環境構築は完了です(多分)。

あとはサーバーの環境に合わせてチューニングすればよいかと。

AWSにscpでファイル転送したらPermission deniedされてググった

AWSにWordpressをインストールできたので今回はEC2サーバーにファイル転送をするところまで。

少しつまずいたので、その解決策も含めてご紹介します。

EC2にssh接続をしてみる

まずはダウンロードしたpemファイルを任意のディレクトリにコピー。

$ cp blog_sample.pem ~/.ssh/blog_sample.pem

ssh接続をしてみます。

「ssh -i {.pemファイル} ec2-user@{Public DNS}」で接続できます。

Public DNSはAWSのコンソールの以下の赤枠のところで確認できます。

$ ssh -i ~/.ssh/blog_sample.pem ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com

The authenticity of host 'ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com (54.199.188.193)' can't be established.
RSA key fingerprint is 1b:10:ae:e5:9e:60:ad:01:83:32:ca:ef:97:0a:68:93.
Are you sure you want to continue connecting (yes/no)?

このような画面が出るので、yesと入力してEnterします。
すると以下の様なエラーが出てしまいました。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/yuichi.iwayama/.ssh/blog_sample.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /Users/yuichi.iwayama/.ssh/blog_sample.pem
Permission denied (publickey).

pemファイル(Private Key Files)のアクセス権限がオープンすぎると怒られてしまいました。

なので、chmodでアクセス権限を変更して再度ssh接続します。

$ chmod 400 ~/.ssh/blog_sample.pem
$ ssh -i ~/.ssh/blog_sample.pem ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/

↑のような表示が出てssh接続ができました。

ssh接続できることが確認できたので、一旦接続を切ります。

$ exit

sshのconfigに設定を追加
毎回長いコマンドを打つのは面倒なので、設定をします。

sudo vi ~/.ssh/config

viで以下のように追記します。

Host blog_sample
  User ec2-user
  HostName ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com
  Port 22
  IdentityFile ~/.ssh/blog_sample.pem

これで上書き保存すると、

ssh blog_sample

とするだけでssh接続ができるようになります。

問題:EC2にscpでファイル転送するとpermission deniedとなる

ここまでできたところで、ファイル転送をしてみます。
Macの場合は、ターミナルからscpコマンドでファイル転送をすることができます。

AWSの公式マニュアルどおりにターミナルからscpでファイル転送をしてみます。
インストールしたWordPressのthemes以下に新しいテーマ(sampleディレクトリ)を転送してみましょう。

$ sudo scp -i ~/.ssh/blog_sample.pem -r sample ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com:/var/www/vhosts/i-fefef5f8/wp-content/themes

scp: /var/www/vhosts/i-fefef5f8/wp-content/themes/sample: Permission denied

* i-fefef5f8はインスタンスID

Permission deniedととなり転送ができない。

解決策:chmodで権限を変更する

ただの権限のエラーだったので、chmodコマンドですべてのユーザーがアクセスできるように権限を変更してexit。

$ ssh blog_sample
$ cd /var/www/vhosts/
$ sudo chmod -R 777 i-fefef5f8
$ exit

これでもう一度ファイル転送をしてみると。

$ sudo scp -i ~/.ssh/blog_sample.pem -r sample ec2-user@ec2-54-199-188-193.ap-northeast-1.compute.amazonaws.com:/var/www/vhosts/i-fefef5f8/wp-content/themes
sample.txt   100%   0   0.0KB/s   00:00 

転送できた!

さくらのレンタルサーバーにSSH接続とファイル転送してみる

実は、「さくらのレンタルサーバー」にはSSH接続ができるんです。ファイル転送するのもいいですが、ターミナルを使いたい場合もありますよね。

「さくらのVPS」にSSH接続するのとは、少し違うの注意が必要です。

さくらのレンタルサーバーにSSH接続してみる

FTPサーバ名     : sample-account.sakura.ne.jp
FTPアカウント   : sample-account
FTP初期フォルダ : www
サーバパスワード: samplepassword

契約時にメールで送られてきたサーバ名、アカウント(FTPアカウントと同一)とサーバパスワードを使ってSSH接続してみます。

別に難しいことはなく、「ssh アカウント@サーバ名」で接続できます。

ただし、レンタルサーバーなのでroot接続ができないという点には注意です。

$ssh sample-account@sample-account.sakura.ne.jp
	The authenticity of host 'sample-account.sakura.ne.jp (11.222.33.44)' can't be established.
	RSA key fingerprint is dd:86:2e:b3:ee:0e:79:b1:7f:ae:86:85:b6:f9:5b:04.

	Are you sure you want to continue connecting (yes/no)? yes
	Warning: Permanently added 'sample-account.sakura.ne.jp' (RSA) to the list of known hosts.

	sample-account@sample-account.sakura.ne.jp's password: 
	
	Last login: Fri Apr 25 16:37:17 2014 from kd124213.ppp-bb.dion.ne.jp
	FreeBSD 9.1-RELEASE-p9 (SAKURA16) #0: Wed Jan  8 21:05:11 JST 2014

	Welcome to FreeBSD!
$ exit

秘密鍵と公開鍵をローカルで作成

次に公開鍵と秘密鍵を作り、レンタルサーバーに転送します。

これをすることで、ssh接続時にパスワードを入力しなくて済むようになります。

$ cd ~/.ssh
$ ssh-keygen
// id_rsaとid_rsa.pubができていることを確認
$ ls
  id_rsa id_rsa.pub
// レンタルサーバーに転送する
// この時、id_rsa.pubを/home/sample-account/.sshにauthorized_keys2とリネームして転送
$ scp id_rsa.pub sample-account@sample-account.sakura.ne.jp:/home/sample-account/.ssh/authorized_keys2
// ssh接続してみる
ssh sample-account@sample-account.sakura.ne.jp

sshのconfigファイルを編集

次にsshのconfigファイルを編集して、さらに楽にssh接続できるようにします。

vi ~/.ssh/config

以下の内容を書き加えます。Hostの部分は任意の文字なので、sampleとしてもOKです。

Host sample-acount
  User sample-acount
  HostName sample-acount.sakura.ne.jp
  Port 22
  IdentityFile ~/.ssh/id_rsa

上書き保存したら「ssh [設定したHOST名]」で接続できます。

ssh sample-account

今回はこれで接続できれば完了です。

さくらのレンタルサーバーにファイル転送する

さっき使ったscpコマンドを使って、ファイル転送をします。ひとつずつファイル転送するのは面倒なので、ディレクトリごと回帰的に転送してしまいましょう。

sudo scp -i ~/ssh/id_rsa -r [転送元] [アカウント名]@[ホスト名]:[転送先]

というコマンドになります。

今回は、WordPressのwpex-prontoというテーマを転送することにします。

$ sudo scp -i ~/.ssh/id_rsa -r ~/vagrant/wordpress/wordpress/wp-content/themes/wpex-pronto sample-account@sample-account.sakura.ne.jp:/home/sample-account/www/wp/wp-content/themes

これで転送が完了です。

あとは、bashrcなどにエイリアスや関数を設定すればさらに便利になります。