セキュリティの問題から,サーバマシンには必要最低限の ソフトウェア以外はインストールしないことが多い。Webサーバに 置くWebコンテンツも,一般的にはWebサーバ上で編集するのではなく, 編集環境の整った別ホストで作成したものを,「安全な方法」で Webサーバにコピーする。安全な方法とはSSHのように暗号化通信路が 確保されるものを言う。Mercurialではリモートホストへのデータ転送に SSHを利用できるので,非常に安全なデータコピーが可能である。
手元のMercurialリポジトリを,リモートマシンにクローン化して置き, 手元の修正を送り込んで編集を進める方法を示す。
編集環境のあるローカルマシン(pan)でWebコンテンツ作成を行ない, Webサーバ(qm2xx)に同一内容をコピーし,同期を取って行く流れとする。
+-------------+ +-------------+ | local | | remote | | | | server | | | hg push | | | [webdir/] | ---------------→ | [webdir/] | | mercurial | | | | repository | | | +-------------+ +-------------+
以下,ローカルマシン操作は「」のプロンプトで, リモートマシン操作は「」で表す。
作業は以下のような流れで進める。
これでローカルの作業ディレクトリをリモートに反映させる手段が 確保できるのでまずこの作業を行なう。ただし,この手順では
の面倒があるので続く設定作業でこれを解決する。
まず,サーバ側で Mercurial を使う準備をする。サーバにログイン後,
ホームディレクトリに .hgrc
ファイルを以下のような内容で
作成する。
[ui] username = KOEKI Taro <c123456@e.koeki-u.ac.jp>
実際には自分のローマ字氏名とメイルアドレスを入れる。
これができたらリモートサーバ側でWebコンテンツディレクトリを Mercurial
リポジトリ化する。ここでは,サーバ側のコンテンツディレクトリを
~/webspace/
と仮定し,あらかじめその中に
index.html
を始めとしたいくつかのファイルが入っているものとする。
cd webspace hg init; hg ci -A -m init
リポジトリを作成したら,そのクローンをローカル側に作成する。
hg clone ssh://qm2xx.is.koeki-u.ac.jp/webspace ls (webspace/ を確認)
手元でWebコンテンツを開いて編集してみる。ローカル側の
webspace/index.html
を開いて編集し,修正点をコミットする。
C-x C-f ファイルを開く C-x v v コミット(ログ入力で C-c C-c)
この修正をサーバ側に送り込む。これには,
の2つの手順を取る。
まずローカル側,リポジトリ内にcdしてから以下のように行なう。
cd webspace # 必要なら hg push
次にリモート側,同じくリポジトリ内にcdしてから以下のようにする。
cd webspace # 必要なら hg up
以後,ローカルでコンテンツ作成作業を行ない,更新点を全て コミットしたものを hg push でサーバ側に送り込めば,手元のディレクトリと サーバのディレクトリの同期が保たれる。
公開鍵認証を用いたログインでは,パスフレーズをエージェントに 記憶させておいて自動的に秘密鍵を送らせることができる。
ssh-agentプログラムは,起動するとメモリ上に常駐し,
秘密鍵を覚えておいて認証で必要になったときに認証要求側に送り込んでくれる。
ssh-agentプログラムとの通信は環境変数 SSH_AUTH_SOCK
に登録されたソケットファイル経由で行なわれる。そのため,ssh-agent
プログラム起動時に設定された環境変数 SSH_AUTH_SOCK
は
以下のいずれかでその後のプロセスに引き継がせる必要がある。
eval `ssh-agent`
と起動してそのシェルから
その後のプロセスを起動する。使用後は必ず
ssh-agent -k
してエージェントを終了させる。ssh-agent コマンド
と起動してその後のプロセスは「コマンド」で
生成された環境から起動する。「コマンド」の
実行が終わるとエージェントも自動的に終了する。前者の場合はたとえば,~/.xinitrc
の先頭と末尾に
以下の記述を行ない,X環境利用時の全てのプログラムでssh-agentと
通信できるようにする。
eval `ssh-agent` ……元々のファイルの内容…… ssh-agent -k
後者の場合はたとえば,screenを起動するときに
ssh-agent screen
などとすると起動した screen 内のシェルは全てssh-agentと通信できる 状態で起動する。
今回の作業ではX環境で動くEmacsからエージェントを使いたいので
前者の方法,つまり ~/.xinitrc
の先頭・末尾に追加する。
追加が間違いなく終わったら一度ログアウトして入り直す(pan)。
以上いずれかの方法で ssh-agent を起動したら ssh-add コマンドを用いて秘密鍵を記憶させる。
ssh-add
Enter passphrase for /home/irhome/c110/ta01002/.ssh/id_rsa:
このように聞いて来るので,秘密鍵のパスフレーズを入力する。 正しく記憶させられた場合は ssh -l で登録情報が出る。
ssh-add -l
ssh-add -L とすると,公開鍵が出力されるのでこれを
リモート側の ~/.ssh/authorized_keys
に保存する。
ssh -A qm2xx.is.koeki-u.ac.jp ssh-add -L # 確認 mkdir -m 700 ~/.ssh # ディレクトリ作成 ssh-add -L >> ~/.ssh/authorized_keys
これで次回のリモートホストへのログインでのパスフレーズ入力が 省略できる(実際にはエージェントが送っている)。
exit # いったん抜ける ssh qmxx.is.koeki-u.ac.jp
パスフレーズ入力なしでログインできることが分かったら,
Emacsで更新を送り込む実験をする。まず,ローカル側のリポジトリ内の
.hg/hgrc
ファイルを開き下線部の行を追加する。
[paths]
default = ssh://qm220.is.koeki-u.ac.jp/webspace
default-push = ssh://qm220.is.koeki-u.ac.jp/webspace
これは,元々ある default の行を default-push に置き換えたものである。 これができたら以下のように作業を進める。
ktermから | 「hg push」とコマンド起動 |
Emacsから | C-c h > |
pushに成功すると以下のようなメッセージが出力される。
pushing to ssh://qm220.is.koeki-u.ac.jp/webspace searching for changes remote: adding changesets remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files
(メッセージが日本語の場合もある)
Webコンテンツのように最新版への移行を気軽に行なえるものは, ローカルで hg push したときにリモート側のリポジトリで自動的に hg up するようなフックを仕掛けておくと作業が効率化される。
Mercurial リポジトリ内の .hg/hgrc
ファイルには
様々なリポジトリ設定が記述できる。ここでは,リポジトリに対する
なんらかのアクションをきっかけに自動的に起動する「フック」の設定を行なう。
リモート側にログインし,リポジトリとなるディレクトリに移動してから
.hg/hgrc
ファイルを開き以下の内容とする。
[hooks] changegroup.up = hg up >&2
ローカル側のEmacsに戻り,またWebコンテンツファイルを 編集・コミット・push してみる。
リモート側での更新が行なわれると,push成功時のメッセージに 以下のものが加わる。
0 files updated, 0 files merged, 0 files removed, 0 files unresolved