できる ssh

この記事は 2013 年 3 月 27 日に「Syn の独り言」で書いた記事を移行したものです。

ssh って便利だ。でも、「リモートログインするためのコマンド」程度の認識しかない人も多いのでは?自分は、この小さい働き者が大好きだ。なので、今回はその紹介

長いので先にアジェンダを書くと、こんな感じ

  • rsa 鍵を使って認証する
  • ssh-agent で秘密鍵を登録しておく
  • 認証情報を踏み台ごしに使用する
  • リモート上のコマンドを直接実行する
  • リモートの GUI を使う
  • config ファイルにデフォルト設定を記載しておく
  • ファイルを効率よく転送する
  • ディレクトリごと効率よく転送する
  • Port Forward で簡易 トンネリング・VPN を貼る

rsa 鍵を使って認証する

鍵認証とは、秘密鍵と公開鍵を割り符のように使う認証だ。ssh サーバーは公開鍵を持っており、それに対応する秘密鍵を持っているユーザーの認証を通す。

百聞は一見にしかずと言う事で、とりあえず rsa 鍵を作ってみて欲しい。ssh クライアント (ssh コマンドを実行する側)で
$ ssh-keygen -t rsa
と実行すると、公開鍵と秘密鍵が作成される。作成中に鍵の保存場所とパスワードが聞かれるが、ここは適当に決めて欲しい。

ただ、(ssh に限らず)鍵を使うアプリケーションのほとんどはデフォルトでこのパスを見に行くので特に理由がなければ変更しない事をおすすめする。

パスワードは認証に使うものではなく秘密鍵を暗号化するための物だ。秘密鍵を盗まれた時の時間稼ぎにしかなっていない事に注意しよう。

また、ssh 鍵を作成する際の -t rsa というオプションは rsa2 アルゴリズムを使用すると言う事だ。歴史的経緯により rsa1, dsa なども併記してあるサイトがあるが、2013 年 3月現在では rsa2 の方がデファクトスタンダードだ。悪い事は言わない、rsa2 を使っとけ。

さて、デフォルトのパスで作成すると、~/.ssh/id_rsa と ~/.ssh/id_rsa.pub というファイルが出来る。~/.ssh/id_rsa が秘密鍵で ~/.ssh/id_rsa.pub が公開鍵だ。

この ~/.ssh/id_rsa.pub を ssh サーバー (接続される方) の ~/.ssh/authorized_keys に記載すると、この鍵を用いて ssh の認証ができるようになる。

クライアントの id_rsa.pub をなんとかしてサーバーに転送したら、
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

とすればよい。cat の部分は id_rsa.pub の中身を authorized_keys へ追記しているだけなので、エディタで authorized_keys を開いてコピペでも OK だ。

.ssh や authorized_keys のパーミッションは、Linux では本来どうでも良いはず(と、記憶している)が、Redhat 等の一部の OS ではこうしないとセキュリティーチェックにより動作しないので念のため。

または、最初からパスワード認証を用いて ssh クライアントからログイン出来る場合は、ssh クライアントで
$ ssh-copy-id [user@]hostname
を実行しても良い。

これ以降、ログインする際は必ず鍵認証を使うのであれば、認証用のパスワードは不要になる。サーバーで
$ sudo passwd -d user
とするのも良いだろう。こうするとユーザーのパスワードは空になり、秘密鍵が無いとログイン出来なくなる。通常の ssh サーバーは空パスワードのログインを禁止しているためだ。
(/etc/ssh/sshd_config に “PermitEmptyPasswords yes” と書かれていなければ大丈夫)

「パスワードが存在しない」というのは、パスワードクラックに対する最強の防御策だ。ただし、コンソールからは空パスワードでログインできるので注意しよう。

複数のユーザーやクライアントからサーバーにログインしたい場合は、それぞれのクライアントで鍵を生成して両方の id_rsa.pub をサーバーの authorized_keys に登録すれば良い。手順を見てもらえるとわかるが、id_rsa.pub は authorized_keys へ追記する形となっているので同一の authorized_keys へ複数の id_rsa.pub を登録できる。

また、同じ鍵で複数のサーバーやサイトにログインできるようにする事も問題ない。同じ id_rsa.pub を複数サーバーの authorized_keys や GitHub などに登録できる。

普通は、作業マシンでは秘密鍵(と、ペアの公開鍵)が 1個、それ以外のサーバーでは authorized_keys に公開鍵が複数登録されている状態になると思う。
(authorized_keys に 1個しか登録されていないと、その作業マシンが壊れた際に少し危険)

ただし、決して1個の秘密鍵を2人のユーザーや2台のマシンで共有してはいけない。
(公開鍵はやってもいいよ。)
転送した際にどんなミスがあるか分からない。盗聴されるかもしれない。

欲を言えば、移動やコピー、標準出力への出力も可能な限り控えたい所だ。cat で内容を出力するだけでもだめだ。どこかに画面出力のログが残っているかもしれないし、画面を後ろから見ている人がいるかもしれない。移動やコピーについても、アクセス権を間違えて誰かに見られる状態になるかもしれない。また、別パーティションにコピーされて別ハードディスクに保存されればハードディスク盗難のリスクが増える。

「大げさな」と思うかもしれないが、鍵を盗まれるのはそれだけ重大なことだ。バグの無いプログラムが無いように、ミスの無い人間もいない。こういう些細な気遣いが、重大な事件を起こすかどうかの境目だと思う。

ちなみに、aws (Amazon Web Service) ではサーバーログインのための秘密鍵をダウンロードするが、上記の理由から一時的な物と考えた方が良いだろう。最初のログイン時に初期パスワードを変更するサービスのように、初回ログイン時に鍵を変更したい。

ssh-agent で秘密鍵を登録しておく

ssh する度に秘密鍵のパスワードを入力するのは面倒だ。そんな時は、ssh-agent を用いれば良い。

client 上で
$ ssh-agent
$ ssh-add [path_to_secret_key]

とすると、秘密鍵のパスワードを聞かれるので入力しよう。すると、次からパスワードを入力する手間が省ける。

詳細にいうと、ssh-agent は /tmp にディレクトリを作成し、そこに UDS (Unix Domain Socket) を作成する。daemon としてバックグラウンドで動作する ssh-agent はそのソケットを通じて ssh が鍵の情報をやり取りするのだ。

UDS のパスや ssh-agent の PID は shell 変数に保存される。なので、同じ shell 変数が使用される限り異なる端末でも使用可能だ。screen や tmux などの仮想端末を使用する際は、仮想端末を立ち上げる前にこの作業を行うと全ての window で ssh-agent を使用できる。

なお、この作業は後述の agent forward にも通じている。秘密鍵にパスワードを設定していなかったとしても、agent forward を使用する場合は必要だ。

認証情報を踏み台ごしに使用する

例えば以下のように、目的のサーバーまで ssh でアクセスする際に間に踏み台(Step)を挟む場合。
(ネットワークの都合などで直接 ssh 出来ない事は良くある。)

踏み台で鍵を作っても良いが、管理が面倒になる。秘密鍵はローカルサーバーだけ、踏み台と目的のサーバーの authorized_keys にはローカルサーバーの公開鍵を登録する方法。

手順はこんな感じになる。

  1. ローカルサーバーの公開鍵を踏み台、サーバー両方の authorized_keys に登録する
  2. ローカルサーバーで ssh-agent と ssh-add を実行する
  3. ローカルサーバーから踏み台へ ssh ログインする際に -A オプションを付与する
    $ ssh -A step_server

こんな感じに

  • 踏み台サーバーから目的のサーバーへログインする
    $ ssh server_name

(踏み台で ssh-agent や ssh-add を実行してはダメ)すると、2回目のログインでもローカルの鍵情報が使える。

これは1回目の ssh が踏み台でも UDS を作成し、ローカルの認証情報を踏み台からでも使えるようにするからだ。鍵そのものを転送するわけではないのでセキュリティー的にはそこまで心配する必要は無い。

ssh の度に -A オプションをつければ Agent Forward は下記のような多段構成でも出来る。そのため、Agent Forward を使用すれば秘密鍵はローカルマシンでのみ作成すればよくその他のサーバーにはローカルで作成した共有鍵を登録すれば良い事になる。

ただし、セキュリティーが完全に担保されるわけではない事は覚えておいた方が良い。最も大きいリスクは、踏み台の UDS を悪用される事だろう。この UDS は ssh でログインしたユーザーしか使用できないようにパーミッションが設定されているが root ユーザーからはアクセス権を無視して使用出来る。

root を信頼できないサーバーを踏み台にする際は控えた方が良いだろう。

リモート上のコマンドを直接実行する

話は少し変わって、ssh だけでコマンドまで実行する方法。
ssh [user@]hostname command [arg1 [arg2 [...]]]と実行すると、hostname 上でコマンドを実行してくれる。

例えば、自分の環境でやってみるとこんな感じ
$ ssh sagittarius.chaos.com ls -a /usr
.
..
bin
games
include
lib
local
sbin
share
src

念のため言っておくと、sagittarius.chaos.com というのは自分で管理している VM だ。

リモート上でコマンドを実行する時は、通常のログイン時と同じ環境変数(ホームディレクトリなど)が設定されている。そのため、
$ ssh wbcchsyn@sagittarius.chaos.com ls
と実行すると、wbcchsyn のホームディレクトリのファイル一覧を表示する。

ちなみに、ssh に -t オプションをつけると、コマンド実行前にリモートサーバーで仮想端末 (tty) を作成してくれる。何が嬉しいかと言うと、パスワード入力や yes,no の確認等を促す、tty にのみ表示される文字列も ssh ごしに表示される。対話的なコマンドを実行する際に便利だ。
$ ssh sagittarius.chaos.com touch /tmp/hoge
$ ssh sagittarius.chaos.com rm -i /tmp/hoge
rm: remove regular empty file `/tmp/hoge'?

もちろん、ここで y と入力すると削除されるし、n と入力すると削除はキャンセルされる。

こういう tty にのみ表示される文字列については、以前ここにかいたので、良かったら見て下さい。

リモートの GUI を使う

Linux の GUI は、Client-Server システムになっている。例えば firefox の場合、firefox が X-Client となり「このような内容の表示をして欲しい」と X-Server に伝える。firefox のリクエストを受け付ければ X-Server はディスプレイに firefox の GUI を表示する。

X-Client と X-Server は同じサーバーで動く事が多いが、異なるサーバーで動かす事も可能だ。X-Server は Windows でも cygwin を使えばインストール出来る。

GUI を表示させたいマシンで X-Server を立ち上げたら、X-Client を動かしたいサーバーへ-X オプションをつけて ssh 接続し、コマンドを実行する。この時、ssh でログインしてからコマンドを実行しても良いが、先ほどの方法で直接実行しても良い。
$ ssh -X sagittarius.chaos.com firefox
みたいに。

ちなみに、これをやると firefox が終わるまで terminal のプロンプトが戻ってこない。それが嫌な場合は最後に & をつけてバックグラウンドで実行するとかして頑張って下さい。

自分はよく Windows から ubuntu の emacs を使うが、その際は cygwin の xterm から
$ run ssh -X sagittarius.chaos.com emacs&
とやるとうまくいく。

まあ、ここいらのテクニックは OS や cygwin のバージョンによっても異なるので適当に試して下さい。

あと、当然 OS-X 以降の mac からでも出来ます。(それ以前は知らない)

config ファイルにデフォルト設定を記載しておく

ssh の度に -A とか -X を入力したり、長い FQDN を記載するのは面倒だ。そんな時は、~/.ssh/config にその設定を記載すれば良い。

書式としては下記のような感じだ。
Host *
StrictHostKeyChecking no
Host sagittarius
HostName sagittarius.chaos.com
User wbcchsyn
ForwardAgent yes
ForwardX11 yes
Host aries
HostName aries.chaos.com
...

Host の次が、ssh コマンドで実際に入力するホスト名。ここで * と入力すると下記のオプションは全てのホストに対して適用される。

StrictHostKeyChecking を yes にすると、初めて ssh ログインする時はに聞かれる ssh-server の fingerprint 確認にデフォルトで yes と答えてくれる。HostName は本当のホスト名(又は IP)。ssh が名前解決に使う。User はそのホストにログインする時のユーザー名、ForwardAgent を yes にすると、-A オプションをデフォルトでつける。ForwardX11 を yes にすると、-X オプションをデフォルトでつける。
(-X オプションをつけていても、違いは X-Client のコマンドを実行した時だけでそれ以外は普通の ssh コマンドとして使える。)

上記の場合、$ ssh sagittariusと入力するとssh -AX wbcchsyn@sagittarius.chaos.comを実行した事になる。初めてログインするサーバーでも FingerPrint の確認は出てこない。

その他にも色々とオプションがあるので、興味のある人は man ssh_config を見て下さい。

ファイルを効率よく転送する

リモートで実行した結果がローカルの端末に表示されたりローカルで入力した y や n の文字列がリモートで実行されるのは、ローカルの標準入出力とリモートの入出力がパイプでつながっているからだ。

これを利用すると、ファイルの転送を行ったり出来る。たとえば、mysqldump で MySQL をバックアップした物を gzip 圧縮してバックアップサーバーに保存したい場合。バックアップサーバーから
$ ssh sagittarius.chaos.com mysqldump -uroot -pMyPassword --all-databases | gzip -c > path_to_backup
のように実行すると、1行で見事リモートバックアップが実行される。

解説すると、mysqldump は mysql のデータをダンプして標準出力に渡す。

これをローカル(バックアップサーバー)がパイプで受け取り、gzip 圧縮をする。gzip の -c オプションは結果を標準出力に出すというコマンドだ。gzip は通常、ファイルを受け取ってそのファイル名に “.gz” 拡張子をつけた名前で保存するが、今回はファイルでは無く標準入力から受け取っているので、一回標準出力に出す。

最後に、gzip の結果をパイプでファイルに落としている。

このスクリプトの良い所は mysqldump と gzip が並列に動いている事だ。mysqldump した物をファイルに落としてから gzip 圧縮するより圧倒的に速い。次に、転送、gzip、ファイルへの書き込みまで全てのコマンドの確認が戻り値だけで分かることだ。この 1行スクリプトの直後に$ echo $?とかやって、0 が表示されたらバックアップはほぼ成功したと見なしてよいだろう。これは、ssl のプロトコル自体に転送時のエラーチェックのような物が含まれているためだ。

ただし、このスクリプトには 1点だけ改良の余地がある。mysqldump の結果を転送してから、ローカルで圧縮している点だ。圧縮してから転送した方が、帯域を節約できる。

帯域を節約したい場合は、以下のようにすればよい。
$ ssh sagittarius.choas.com mysqldump -uroot -pMyPassword --all-databases '|' gzip -c > path_to_backup
gzip の前のパイプ ( | ) を quotation ( ‘ ) でくくっているので、ローカルではこの | はパイプではなく文字列と見なされる。つまり、ローカルの shell が ‘|’ を文字列 | とみなし、リモートに転送する。リモートでは | は quotation でくくられていないので、通常のパイプとみなされる。よって、mysqldump の結果が gzip で圧縮されてからローカルに転送される。

以上をふまえて、cron で mysqldump を用いた日時バックアップをするスクリプトは以下で充分だ。
#/bin/sh
tmp=`mktemp` && \
ssh sagittarius.choas.com mysqldump -uroot -pMyPassword --all-databases '|' gzip -c > "$tmp" &&\
mv $tmp /var/backup/dump_`date +'%Y%m%d'.gz`

一応言っておくと、mktemp は一時ファイルを安全に作成してくれる。その一時ファイルに mysqldump の結果を保存し、成功したら /var/backup/dump_YYYYMMDD.gz にリネームする。

途中で失敗した場合、このコマンドは最後まで行かないので /var/backup 以下には正しいバックアップしか残らない。

また、これらの shell コマンドは失敗したらその場で stderr にエラーメッセージが出る。
(特別な場合は例外があるかもしれないが。)
メール送信の設定さえしておけば、cron は stdout や stderr に表示された文字列があるとその内容をメール送信する。なので、失敗したらメール通知してくれる仕組みまでバッチリだ。

なお、おまけだが quotation ( ‘ ) でくくるとリモートで解釈されるのはパイプ ( | ) だけではない。&&、;、||、* なども同じだ。また、変数 ($HOME など)もそのままではローカルの値が、quotation ( ‘ ) でくくるとリモートの値が使用される。

ディレクトリごと効率よく転送する

先ほどの例では gzip を使ったファイル転送の例を上げたが、tar を使えばディレクトリごと転送出来る。たとえば、Apache で公開するための静的コンテンツを ~/git/html というディレクトリで git 管理しているとする。これを、sagittairus.chaos.com の /var/www/html に転送するには、以下のようにすればよい。
$ tar czf - -C ~/git html | ssh wbcchsyn@sagittarius.chaos.com sudo tar xzf - -C /var/www
ただし、このコマンドを実行するには sudo 周りの権限や設定をする必要がある。例えば、こんな感じ。
$ sudo sh - c "echo 'wbcchsyn ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/wbcchsyn"
$ sudo chown root:root /etc/sudoers.d/wbcchsyn
$ sudo chmod 0440 /etc/sudoers.d/wbcchsyn
$ sudo sed -i 's/^Defaults[ \t]*requiretty/#Defaults requiretty/' /etc/sudoers

ユーザー wbcchsyn にパスワード無しで全コマンドを sudo 実行出来る権限を付与し、sudo 一般の設定として、tty が無くとも実行出来るようにしている。(一部のディストリビューションでは tty が無いと sudo を実行出来ないように設定してある。)

tar は通常、tar czf file_name directory1 [directory2 [...]]という書き方で directory1, directory2, … を圧縮、アーカイブし、file_name というファイルに出力する。しかし、ファイル名を – とすると出力を標準出力へ出す。gzip の時と同様に、出力をパイプでリモートへ渡すためだ。

-C オプションは、「このディレクトリにチェンジディレクトリしたつもりになって」という意味。

例えば、
$ cd ~
$ tar czf html.tar.gz git/html

とした場合、html.tar.gz を解凍すると最初に git というディレクトリができて、その下に html ディレクトリが展開される。
しかし、
$ cd ~/git
$ tar czf html.tar.gz html

とすると、html.tar.gz を解凍した際に html ディレクトリが作業ディレクトリ直下に直接展開される。

-C をつけた$ tar czf - -C ~/git html は ~/git/html を、解凍した時に html ディレクトリが直接出来る形でアーカイブし、標準出力に渡す。

tar が作成したアーカイブの標準出力はパイプに渡され、sagittarius.chaos.com でやはり tar を用いて解凍される。圧縮時と同様、ファイル名の – は標準入力を、-C オプションは「このディレクトリに cd したつもりになって」という意味だ。

この1行で、 ローカルの ~/git/html が sagittarius.chaos.com の /var/www/html へ転送される。

ただ、この作業も改善の余地が多いにある。

まず、最初にこの作業では .git ディレクトリも転送されてしまう。.git ディレクトリは git でレポジトリを管理するための物であり、開発中には必要だが本番では必要ない。なので、tar でアーカイブを作成する際にこのディレクトリは除くように –exclude ‘.git’ オプションを付与する。

また、tar はデフォルトではファイルのオーナーやパーミッションも保存してしまう。しかし、おそらくローカルではオーナーは作業用ユーザーであり、リモートでは apache をオーナーにしたいだろう。そのような場合、圧縮時に –owner=’apache’ オプションを付与する。

まとめると、~/git/html を sagittarius.chaos.com の /var/www/html に転送する手順は以下のようになる。
$ tar czf - -C ~/git --excoude '.git' --owner='apache' | ssh wbcchsyn@sagittarius.chaos.com sudo tar xzf - -C /var/www

Port Forward で簡易 トンネリング・VPN を貼る

例えば、学校や会社の FW の中で動いている http サーバーに外からアクセスしたいような場合。Port Forward (ポートフォワード) を用いれば FW をすり抜ける事が出来る。

上記のように、FW 内の aries で動いてる http サーバーに FW 外部の taurus からアクセスしたい場合。同じく FW 内にある sagittarius から例えば以下のように taurus に予めポートフォワードの ssh を接続しておけばよい。
$ ssh -R 8000:aries:80 taurus
この状態で taurus から localhost の 8000番ポートにアクセスすると、aries の 80 番ポート(http の内容)が表示される。
(ssh の接続を切るとポートフォワードも切れてしまうので気をつけよう。)

ちなみに、taurus と sagittarius 間の通信は ssh により暗号化されているので FW の外部における盗聴の可能性は限りなく低い。

しかし、この状態では taurus の 8000番ポートには taurus 自身からしかアクセス出来ない。taurus 以外のマシンからでも taurus の 8000番ポート経由で aries の 80番ポートにアクセスするためにはtaurus の ssh デーモンを GatewayPorts オプションを有効にした上で
$ ssh -R 0.0.0.0:8000:aries:80 taurus
と実行する。
(もちろん、ネットワーク的に taurus の 8000 番へアクセス出来る事は必要。)

ssh デーモンの GatewayPorts を有効にするには、/etc/ssh/sshd_config に GatewayPorts yesと書き込んで ssh デーモンを再起動すればよい。

このように、目的のサーバーと同じ FW 内から外部に ssh アクセスする事でポートフォワードする場合の一般的なオプションは以下になる。
$ ssh -R [bind_address]:port:host:hostport [user@]hostname

なお、ssh 接続の向きは上記と逆にする事も可能だ。


上記のように、taurus から sagitarius に ssh コネクションを張れる場合は、taurus 上で
$ ssh -L 8000:aries:80 sagittarius
とすると tausus から localhost の 8000番経由で aries の 80番ポートにアクセス出来る。

-R の時と同様、このままでは taurus 以外のマシンからは taurus の 8000番ポートへアクセス出来ない。他のマシンからでも taurus の 8000番ポート経由で aries の 80番ポートへアクセスしたい場合は
$ ssh -L 0.0.0.0:8000:aries:80 sagittarius
と実行する。-L の場合は -R と違って ssh デーモンの GatewayPorts の設定が必要ない事は少し嬉しい。

-L と -R は ssh の向きが違うだけで動作はほとんど同じだ。-L を使うと ssh client 上でポートを開き、目的のサーバーへポートフォワードする。-R を使うと ssh server でポートを開き、目的のサーバーへポートフォワードする。

-L と -R は client を左側、server を右側に書いた時、ポートを開く場所が left, right という事らしい。ただ自分は「client は L の文字が含まれ、server は R の文字が含まれる」と覚えている。

今回の例では、-R を使うと、taurus から aries を閲覧中に万一 ssh コネクションが切れると、sagittarius から再度 ssh を張り直さなくては行けない。実用にのせるためには sagittairus で ssh コネクションを監視するか、taurus からも sagittarius にログイン出来る仕組みを作る必要がある。

そのため、今回の例に限って言えば個人的には -L を使う方が良いと思う。-L を使う場合は、taurus から sagittairus へ ssh アクセスできれば全て解決だ。

どちらの場合も言える事だが、ポートフォワードは実質的に FW に穴をあける事に等しい。そもそも、FW 的にアクセス出来ないのはそれだけの理由があるかもしれない。多くの場合、ネットワーク管理者がユーザーのポートフォワードを禁止する事は難しいのが現状だが、だからと言って乱用は避けた方が良いだろう。

以上、駆け足でしたが ssh の紹介でした。

Author: wbcchsyn

未来のスーパーエンジニア とりあえず、新しい物が大好き

109 thoughts on “できる ssh”

  1. You actually make it seem so easy with your presentation but I find this
    matter to be really something that I think I would never
    understand. It seems too complicated and very
    broad for me. I am looking forward for your next post, I’ll try to get the
    hang of it!

  2. I just want to say I’m beginner to blogs and definitely loved you’re blog. Almost certainly I’m want to bookmark your website . You absolutely come with excellent posts. Many thanks for revealing your blog.

  3. Unquestionably believe that which you stated. Your favorite justification seemed to be on the web the simplest thing to be aware of. I say to you, I certainly get irked while people consider worries that they just don’t know about. You managed to hit the nail upon the top and defined out the whole thing without having side effect , people can take a signal. Will probably be back to get more. Thanks

  4. Hey, you used to write fantastic, but the last few posts have been kinda boring… I miss your great writings. Past several posts are just a little bit out of track! come on!

  5. May I simply just say what a comfort to discover someone that really understands what they are discussing on the net. You certainly understand how to bring an issue to light and make it important. More and more people should look at this and understand this side of your story. I was surprised that you aren’t more popular given that you surely have the gift.

  6. I’ve been surfing online more than three hours today, yet I never found any interesting article like yours. It’s pretty worth enough for me. In my view, if all web owners and bloggers made good content as you did, the web will be much more useful than ever before.

  7. I have been exploring for a little bit for any high quality articles or blog posts on this sort of area . Exploring in Yahoo I at last stumbled upon this site. Studying this info So i¡¦m satisfied to exhibit that I have an incredibly excellent uncanny feeling I discovered exactly what I needed. I so much for sure will make certain to don¡¦t omit this website and give it a glance regularly.

  8. Thank you a lot for providing individuals with a very brilliant chance to read in detail from this blog. It is usually very beneficial and as well , jam-packed with a great time for me and my office peers to search your website at the very least three times a week to learn the latest stuff you have got. And lastly, I am certainly amazed with all the sensational inspiring ideas you give. Selected 3 facts in this post are honestly the best we’ve ever had.

  9. You really make it seem so easy with your presentation but I find this matter to be really something which I think I would never understand. It seems too complex and extremely broad for me. I’m looking forward for your next post, I will try to get the hang of it!

  10. Wow, incredible blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your site is magnificent, as well as the content!

  11. Good blog! I truly love how it is easy on my eyes and the data are well written. I’m wondering how I could be notified whenever a new post has been made. I have subscribed to your feed which must do the trick! Have a great day!

  12. This is very interesting, You’re a very skilled blogger. I’ve joined your rss feed and look forward to seeking more of your great post. Also, I have shared your website in my social networks!

  13. This is really interesting, You are a very skilled blogger. I’ve joined your feed and look forward to seeking more of your magnificent post. Also, I have shared your web site in my social networks!

  14. magnificent issues altogether, you just received a emblem new reader. What may you recommend in regards to your publish that you made some days in the past? Any positive?

  15. Only wanna comment on few general things, The website style is perfect, the subject matter is real superb. “If a man does his best, what else is there” by George Smith Patton, Jr..

  16. I intended to compose you this little observation just to give many thanks as before on the gorgeous methods you’ve featured in this article. It has been simply generous with people like you to convey unhampered all that a number of us would have marketed for an e book to help make some dough for their own end, precisely seeing that you might have tried it in case you considered necessary. The inspiring ideas as well acted like a easy way to be aware that other people have the same passion the same as my own to figure out a good deal more on the subject of this issue. I am sure there are a lot more pleasurable periods in the future for individuals that discover your site.

  17. I truly enjoy looking at on this site, it contains good articles . “When a man’s willing and eager, the gods join in.” by Aeschylus.

  18. Generally I do not read article on blogs, but I wish to say that this write-up very pressured me to check out and do it! Your writing style has been surprised me. Thanks, very nice article.

  19. Wow! This could be one particular of the most beneficial blogs We have ever arrive across on this subject. Basically Great. I am also a specialist in this topic so I can understand your effort.

  20. I’ve learn several good stuff here. Certainly price bookmarking for revisiting. I wonder how so much effort you put to make this sort of wonderful informative web site.

  21. Hi, Neat post. There is a problem with your site in internet explorer, would test this… IE nonetheless is the market leader and a big part of folks will miss your fantastic writing due to this problem.

  22. I’ve been absent for some time, but now I remember why I used to love this website. Thank you, I’ll try and check back more often. How frequently you update your website?

  23. I have learn several good stuff here. Definitely price bookmarking for revisiting. I wonder how so much effort you put to create this sort of great informative web site.

  24. I do agree with all the ideas you’ve introduced to your post. They are really convincing and will certainly work. Nonetheless, the posts are very quick for newbies. Could you please extend them a bit from next time? Thank you for the post.

  25. I like what you guys are up also. Such clever work and reporting! Keep up the superb works guys I’ve incorporated you guys to my blogroll. I think it will improve the value of my site :).

  26. I’ve been browsing on-line greater than 3 hours lately, but I never found any attention-grabbing article like yours. It is lovely worth enough for me. In my opinion, if all website owners and bloggers made just right content material as you probably did, the internet might be much more helpful than ever before. “Oh, that way madness lies let me shun that.” by William Shakespeare.

  27. You could definitely see your enthusiasm in the work you write. The sector hopes for even more passionate writers such as you who are not afraid to mention how they believe. All the time go after your heart. “Man is the measure of all things.” by Protagoras.

  28. Wow! This can be one particular of the most helpful blogs We have ever arrive across on this subject. Basically Great. I’m also a specialist in this topic therefore I can understand your effort.

  29. I have not checked in here for some time because I thought it was getting boring, but the last few posts are good quality so I guess I’ll add you back to my everyday bloglist. You deserve it my friend 🙂

  30. Simply desire to say your article is as amazing. The clearness in your post is simply cool and i can assume you are an expert on this subject. Well with your permission allow me to grab your RSS feed to keep up to date with forthcoming post. Thanks a million and please carry on the enjoyable work.

  31. I got what you mean , appreciate it for posting .Woh I am happy to find this website through google. “I would rather be a coward than brave because people hurt you when you are brave.” by E. M. Forster.

  32. Wow! This could be one particular of the most helpful blogs We have ever arrive across on this subject. Basically Fantastic. I’m also a specialist in this topic therefore I can understand your hard work.

  33. My wife and i felt fulfilled when Chris could conclude his basic research out of the ideas he was given when using the blog. It’s not at all simplistic just to happen to be giving for free tips and tricks which often some other people have been making money from. And we remember we have got the writer to thank for this. Most of the explanations you made, the simple blog navigation, the friendships you will give support to instill – it is most amazing, and it is facilitating our son in addition to the family reason why this content is fun, which is certainly really essential. Many thanks for the whole lot!

  34. Normally I do not learn article on blogs, but I wish to say that this write-up very compelled me to try and do so! Your writing style has been surprised me. Thanks, quite nice post.

  35. I truly enjoy looking through on this web site , it contains wonderful posts . “Do what you fear, and the death of fear is certain.” by Anthony Robbins.

  36. Hi my family member! I wish to say that this article is amazing, nice written and include almost all important infos. I would like to look more posts like this.

  37. hello!,I really like your writing so much! percentage we be in contact more about your article on AOL? I require an expert in this house to solve my problem. Maybe that is you! Having a look ahead to look you.

  38. you are in point of fact a excellent webmaster. The site loading pace is amazing. It kind of feels that you are doing any unique trick. Furthermore, The contents are masterwork. you have performed a wonderful task on this subject!

  39. Keep up the excellent piece of work, I read few articles on this internet site and I conceive that your weblog is rattling interesting and contains sets of wonderful info .

  40. Great write-up, I am regular visitor of one’s blog, maintain up the nice operate, and It is going to be a regular visitor for a long time.

  41. Excellent goods from you, man. I’ve understand your stuff previous to and you’re just too magnificent. I actually like what you’ve acquired here, really like what you’re stating and the way in which you say it. You make it enjoyable and you still take care of to keep it sensible. I can not wait to read far more from you. This is actually a wonderful web site.

  42. Thanks , I have recently been searching for info approximately this subject for a while and yours is the best I have discovered till now. However, what about the conclusion? Are you positive concerning the source?

  43. I simply couldn’t leave your site prior to suggesting that I actually loved the standard information a person provide to your visitors? Is gonna be back regularly to check out new posts.

  44. you’re in reality a just right webmaster. The website loading speed is amazing. It kind of feels that you are doing any unique trick. In addition, The contents are masterpiece. you’ve done a magnificent job in this matter!

  45. Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something. I think that you can do with a few pics to drive the message home a little bit, but other than that, this is magnificent blog. A great read. I will definitely be back.

  46. I wanted to draft you one very little observation in order to say thanks as before for your personal exceptional solutions you have featured here. It has been certainly wonderfully open-handed of you to make without restraint exactly what numerous people would have marketed as an e book to help make some profit on their own, mostly considering the fact that you might have done it if you ever decided. Those things in addition served to provide a great way to fully grasp that other people online have the same interest much like my personal own to see great deal more when considering this issue. I’m certain there are millions of more fun occasions in the future for individuals who read through your site.

  47. I’ve been browsing online more than 3 hours today, yet I never found any interesting article like yours. It is pretty worth enough for me. In my opinion, if all website owners and bloggers made good content as you did, the net will be much more useful than ever before.

  48. of course like your web-site however you need to take a look at the spelling on several of your posts. A number of them are rife with spelling problems and I in finding it very troublesome to tell the truth however I’ll definitely come again again.

  49. I am also writing to let you understand what a nice encounter my daughter experienced browsing the blog. She realized numerous details, which included how it is like to possess a great helping style to let many people without hassle understand specific tortuous subject areas. You truly exceeded visitors’ expected results. Thanks for providing those helpful, healthy, explanatory and cool thoughts on your topic to Jane.

  50. I’ve been absent for some time, but now I remember why I used to love this web site. Thank you, I’ll try and check back more frequently. How frequently you update your site?

  51. I really enjoy looking at on this site, it contains excellent articles . “Words are, of course, the most powerful drug used by mankind.” by Rudyard Kipling.

  52. Very interesting topic , thanks for posting . “All human beings should try to learn before they die what they are running from, and to, and why.” by James Thurber.

  53. Thanks for the sensible critique. Me and my neighbor were just preparing to do a little research on this. We got a grab a book from our local library but I think I learned more from this post. I’m very glad to see such wonderful information being shared freely out there.

  54. I am only writing to let you understand what a superb experience my friend’s girl developed reading your web site. She came to understand a lot of pieces, which included what it’s like to have a marvelous helping mindset to have many people really easily learn about several impossible subject matter. You truly surpassed our expectations. Many thanks for offering these warm and helpful, trustworthy, explanatory not to mention unique tips on the topic to Ethel.

  55. Wow, marvelous blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is great, as well as the content!

  56. Thanks a bunch for sharing this with all of us you really know what you’re talking approximately! Bookmarked. Please also consult with my web site =). We will have a hyperlink change agreement among us!

  57. I have recently started a website, the info you provide on this website has helped me greatly. Thank you for all of your time & work. “The only winner in the War of 1812 was Tchaikovsky” by Solomon Short.

  58. We are a group of volunteers and starting a new scheme in our community. Your website offered us with valuable information to work on. You have done a formidable job and our entire community will be thankful to you.

  59. Hello1Bing1Bing1BinHello
    Hello1Bing1Bing1BinHelloSORYMEPLS
    We’re a group of volunteers and opening a new scheme in our community. Your web site provided us with valuable info to work on. You’ve done an impressive job and our entire community will be thankful to you.

  60. Some genuinely wonderful info , Sword lily I noticed this. “It’s not only the most difficult thing to know one’s self, but the most inconvenient.” by Josh Billings.

  61. I as well as my pals ended up reading the nice key points on the website while all of a sudden got a horrible suspicion I had not expressed respect to you for those strategies. Those women were as a result excited to read through them and have honestly been having fun with those things. Appreciation for genuinely indeed helpful and also for settling on these kinds of outstanding issues most people are really desperate to understand about. My very own honest regret for not expressing appreciation to you sooner.

  62. We stumbled over here from a different page and thought I might as well check things out. I like what I see so now i’m following you. Look forward to checking out your web page for a second time.

  63. My brother suggested I might like this website. He was totally right. This post truly made my day. You cann’t imagine simply how much time I had spent for this information! Thanks!

  64. I am just writing to make you know what a perfect discovery my cousin’s girl had checking your web page. She realized numerous pieces, which include how it is like to have a marvelous coaching spirit to have most people with no trouble grasp a variety of extremely tough matters. You actually did more than readers’ expected results. Many thanks for offering these good, trustworthy, informative as well as fun tips about the topic to Lizeth.

  65. I simply could not depart your website before suggesting that I really enjoyed the usual information an individual supply on your visitors? Is gonna be back frequently in order to check out new posts.

  66. Thanks for sharing superb informations. Your web site is so cool. I’m impressed by the details that you’ve on this website. It reveals how nicely you understand this subject. Bookmarked this website page, will come back for more articles. You, my friend, ROCK! I found simply the information I already searched all over the place and just couldn’t come across. What a perfect web site.

  67. Nice read, I just passed this onto a colleague who was doing some research on that. And he just bought me lunch since I found it for him smile Thus let me rephrase that: Thanks for lunch! “By nature, men are nearly alike by practice, they get to be wide apart.” by Confucius.

  68. Thank you so much for providing individuals with remarkably superb chance to read in detail from here. It is usually very good and as well , jam-packed with a good time for me personally and my office peers to search your website minimum 3 times weekly to find out the fresh guidance you will have. And lastly, we are always fascinated concerning the tremendous creative ideas you give. Certain 1 tips in this post are undeniably the most effective I have ever had.

  69. I have to express my affection for your kind-heartedness for those individuals that absolutely need help with this topic. Your real commitment to passing the solution all around had become exceptionally interesting and have surely encouraged girls like me to attain their dreams. Your new valuable guideline entails this much to me and somewhat more to my mates. Many thanks; from all of us.

Leave a Reply

リンクの無いコメントは即時反映されます