- 1. 最初に
- 2. 予備知識
- 3. CVSサーバの設定(OpenSSH編)
- 4. CVSクライアントの設定(OpenSSH編)
- 4.1 公開鍵と秘密鍵の作成
- 4.2 公開鍵の登録と接続テスト
- 4.3 環境変数の設定
- 4.4 Terminal から CVSを使う
- 4.5 'Project Builder' や Xcode から CVSを使う
- 5. CVSサーバの設定(pserver編)
- 6. CVSクライアントの設定(pserver編)
本編は「CVSの使い方 - MacOSXで事始め -」の続編です。
「ローカルマシン上に CVSリポジトリを作成して、個人で CVS を利用するための覚え書き」というコンセプトは基本的に変っていません。 今回は、前編で CVSリポジトリを作成したコンピュータ[G4Cube]を CVSサーバに仕立てて、他のコンピュータ[PowerBookG4]からネットワーク越しにアクセスします。
これ以降、以下の条件で作業するものとして話を進めます。
ネットワーク越しに CVSリポジトリにアクセスする様になると、頻繁にリポジトリ(CVSサーバ)を切り替える必要が出てくることがあります。 この様な場合、リポジトリの切り替え手段としては、次のような二通りの方法があるかと思います。
方法 i. は、前編でも紹介しました。
方法 ii. も、リポジトリの指定が必要になるコマンドの利用頻度を考慮すれば、それほど悪くない手です。
前編で紹介したコマンドを例に挙げてみると、コマンドラインでリポジトリを指定する必要があるのは init, checkout, release, history ぐらいで、比較的利用頻度の多い add, remove, update, commit, tag, diff ではリポジトリを指定する必要はありません。
私個人としては、リポジトリを指定するための -d オプション が別の用途にも割り当てられているため、紛らわしくて扱い難いという理由から、方法 i. がお勧めだと思っています。
どちらの方法を選択したとしても問題となるのは、リポジトリを表現する文字列が長いということです。
# リポジトリを表現する文字列(例)の比較
方法 i. を使う場合は、シェルの補完機能を比較的素直に使うことができます。
# .tcshrc の設定例1:方法 i. を前提にしたコマンド書式
complete cvs 'p/1/(add admin commit checkout ..(中略).. update)/'
complete setenv 'p/1/e/' \ # 次の行に続く(まとめて1行に記述することも可)
'n;CVSROOT;(/Users/terra/cvsroot :ext:terra@g4cube:/Users/terra/cvsroot);'
方法 ii. を使う場合は、CVSコマンドの -d オプションの多様性が仇になり、シェルの補完機能を巧く設定することができません。 中途半端な補完機能で我慢するとか、下記のように専用コマンドを作成するとか、打開策を思い付かない訳ではありませんが、あまりお勧めできる方法とは言えません。
# .tcshrc の設定例2:alias で専用コマンド "cvs-d" を作成する.
alias cvs-d 'cvs -d'
complete cvs 'p/1/(add commit ..(中略).. update)/'
complete cvs-d 'p/2/(admin checkout ..(中略).. rtag)/' \ # 次の行に続く
'p;1;(/Users/terra/cvsroot :ext:terra@g4cube:/Users/terra/cvsroot);'
前編の2.3節、2.4節では、CVSROOT/cvsignore や CVSROOT/cvswrappers といったリポジトリの設定ファイルを直接、追加・更新するという方法を紹介しました。 ここで登場した CVSROOT というディレクトリについてですが、これは、設定ファイルの格納場所であると同時に、"CVSROOT" というモジュール(プロジェクト)の格納場所にもなっています。
[G4Cube:~] terra% ls -l ${CVSROOT} ¶ # リポジトリ内を表示する
drwxrwxr-x 41 terra staff 1394 Feb 6 00:24 CVSROOT
drwxrwxr-x 8 terra staff 272 Aug 2 22:26 projectA
drwxrwxr-x 21 terra staff 714 Aug 2 23:00 projectB
# このように表示してみると、なんとなく納得したような気になりませんか・・?
つまり、これらの設定ファイルを追加・更新する方法として、(いかにも CVS らしい)以下のような方法も使えるということです。
# ↓ "CVSROOT" モジュールのコピーを取り出す。(前節 4.1節で説明) [G4Cube:~] terra% cvs export -d CVSR2 CVSROOT ¶ [G4Cube:~] terra% cd CVSR2 ¶ [G4Cube:~/CVSR2] terra% #### cvsignore ファイルを追加する。(前編 2.3節と同等の作業) [G4Cube:~/CVSR2] terra% cp -i /Developer/Tools/cvswrappers . ¶ overwrite /Users/terra/cvsroot/CVSROOT/cvswrappers? y ¶ [G4Cube:~/CVSR2] terra% cvs add cvsignore ¶ cvs add: scheduling file `cvsignore' for addition cvs add: use 'cvs commit' to add this file permanently #### cvswrappers ファイルを修正する。(前編 2.4節と同等の作業) ・・・ # ↓ コミットする。(前節 5.3節で説明) [G4Cube:~/CVSR2] terra% cvs commit -m "OK" ¶ # ↓ 作業用ディレクトリを破棄する。(前節 4.2節で説明) [G4Cube:~/CVSR2] terra% cd .. ¶ [G4Cube:~] terra% cvs release -d CVSR2 ¶ You have [0] altered files in this repository. Are you sure you want to release (and delete) directory `CVSR2': y ¶
コミットが完了すると、当然の如く "CVSROOT" モジュールの構成ファイル(CVSROOT/*,v) が更新されます。 それと同時に、リポジトリの設定ファイル(CVSROOT/cvsignore, CVSROOT/cvswrappers 等)も自動的に追加・更新されます(この辺りが、他の一般的なモジュールと動作が異なります)。
RSA認証というのは SSH(OpenSSH)で使われている認証方式の一つで、パスワードの代りに公開鍵と秘密鍵を使います。 SSHを使ってリポジトリにリモートアクセスする場合は、RSA認証にしておくことをお勧めします。 もし、デフォルトのパスワード認証のまま cvsコマンドを実行したとすると、CVSサーバと接続するために毎回パスワードを入力することになります。 パスワードを毎回入力するのは実用的ではありませんし、何より 'Project Builder' から(cvs コマンドを使い)リポジトリにアクセスする時が問題です。 端末画面(/dev/ttyp*)の割り当てが無いため、cvs から起動された sshコマンドがパスワードをユーザに尋ねることもできないからです。
同様の問題は、秘密鍵のファイルを暗号化している(パスワードの代りにパスフレーズを入力する)場合にも発生します。 この場合は、パスフレーズの入力を一回で済ませるために ssh-agentを使うことで問題を解決できます。
ネットワーク接続されている他のコンピュータから、CVSサーバのリポジトリにアクセスする方法には幾つか方法がありますが、 MacOSX の標準機能である SSH(OpenSSH)を利用した方法を最初に紹介します。
[システム環境設定]を起動した後、[共有]-[サービス]のダイアログ画面で、[リモートログイン]をチェックします。 ファイアウォールを有効にしている場合は、これに連動して自動的に 22番ポートが許可されます。
CVS(SSH)クライアントとなるコンピュータ上で作成した公開鍵を、CVS(SSH)サーバ上の ${HOME}/.ssh/authorized_keys というファイルに登録(追加)します。 ${HOME} は、リポジトリを格納しているユーザ用ディレクトリです。
この辺の作業は、CVSの話というよりは OpenSSHの話になるので、本編では詳細な説明はしませんが、おおまかな作業は次のようになります。
# CVSクライアント上で作成した公開鍵を、別名をつけてCVSサーバにコピーしておく. [PowerBookG4:~] terra% scp -p ~/.ssh/id_rsa.pub terra@g4cube:PBG4-terra.pub ¶ terra@g4cube's password: PASSWORD_ON_G4Cube ¶ id_rsa.pub 100% |*********************************| 229 00:00
# CVSサーバ上のリポジトリを格納しているアカウントで作業する. ## ~/.ssh ディレクトリが存在しない場合は、以下のようにして作成する. [G4Cube:~] terra% mkdir ~/.ssh ¶ [G4Cube:~] terra% chmod go-rwx ~/.ssh ¶ ## ~/.ssh ディレクトリができたら、以下のようにして公開鍵を登録(追加)する. [G4Cube:~] terra% cat PBG4-terra.pub >> ~/.ssh/authorized_keys ¶ [G4Cube:~] terra% rm PBG4-terra.pub ¶ # 不要になった公開鍵ファイルを削除
この章でも、OpenSSHに関する話が数多く出てきますが、本編では詳細な説明はしません。 OpenSSHについてのより詳細な情報が必要な方は、他の資料を参考にしてください。
公開鍵と秘密鍵を作成する作業は必ず、SSHクライアントとなるコンピュータにログインしている状態で行ってください。 鍵の作成時には「パスフレーズ」というパスワードのような単語の入力を求められますが、ここではパスフレーズを使わない方法について説明します。
[PowerBookG4:~] terra% ssh-keygen -t rsa ¶ Generating public/private rsa key pair. Enter file in which to save the key (/Users/terra/.ssh/id_rsa): Enter passphrase (empty for no passphrase): ¶ # [enter]キーを押す(パスフレーズなし) Enter same passphrase again: ¶ # [enter]キーをもう一度押す Your identification has been saved in /Users/terra/.ssh/id_rsa. Your public key has been saved in /Users/terra/.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx terra@ PowerBookG4.local. [PowerBookG4:~] terra% ls -l ~/.ssh ¶ # 公開鍵が作成されているか確認する total 16 -rw------- 1 terra staff 887 Aug 2 16:27 id_rsa # 秘密鍵ファイル -rw-r--r-- 1 terra staff 229 Aug 2 16:27 id_rsa.pub # 公開鍵ファイル ・・・
[PowerBookG4:~] terra% ssh terra@g4cube ls ¶
CVSサーバへの接続が初めてであれば、以下のようなメッセージが表示されます。 CVSサーバに本当に接続して良いか訪ねてきますので、yes と入力して次のステップに進んでください。 以前に接続したことがあれば、この様なメッセージは表示されず、自動的に次のステップに進みます。
# CVSサーバに初めて接続する場合 The authenticity of host 'g4cube (192.168.xx.xx)' can't be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx. Are you sure you want to continue connecting (yes/no)? yes ¶ Warning: Permanently added 'localhost' (RSA) to the list of known hosts.次のステップに進んだところで、CVSサーバのディレクトリが表示されれば成功です。
もし、以下のようなメッセージが表示された場合には、(本編で言及していないことも含めて)何らかの問題があります。
# CASE1:パスフレーズを要求されている:失敗(本章の説明範囲外) Enter passphrase for key '/Users/terra/.ssh/id_rsa':
# CASE2:パスワード認証のまま:失敗 terra@g4cube's password:
環境変数 CVSROOT と CVS_RSH の値を以下のように設定します。
setenv CVS_RSH ssh
setenv CVSROOT :ext:terra@g4cube:/Users/terra/cvsroot
# (1) (2) (3)
# (1): サーバ上でのユーザ名.リポジトリにアクセス可能なアカウント.
# (2): サーバのホスト名(またはIPアドレス).
# (3): サーバ上でのリポジトリの格納場所.絶対パスのみ記述可.
cvs コマンドの実行は、必ず、4.3節〜4.4節の作業を実施した仮想端末のウィンドウで行います。 他のウィンドウでは CVSサーバ上のリポジトリにはアクセスできません。 使い方は、ローカルマシン上のリポジトリの場合と同じです。 コマンド等の使い方については、前編を参照してください。
CVS自体の使い方ではありませんが、リポジトリに格納されているモジュールを確認するには以下のようにすれば可能です。
[PowerBookG4:~] terra% ssh terra@g4cube ls -l /Users/terra/cvsroot ¶ drwxrwxr-x 41 terra staff 1394 Feb 6 00:24 CVSROOT drwxrwxr-x 8 terra staff 272 Aug 2 22:26 projectA drwxrwxr-x 21 terra staff 714 Aug 2 23:00 projectB
SSHによるリモートアクセスの場合、Dock や Finder から 'Project Builder' や Xcode を起動しただけでは、CVSサーバ上のリポジトリにリモートアクセスすることができません。 ~/.MacOSX/environment.plist という環境変数設定用ファイルを使い、GUIアプリケーション用の環境変数を設定しておきます。
# ~/.MacOSX/environment.plist の設定
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/...
・・・
<key>CVS_RSH</key>
<string>ssh</string>
・・・
なお、環境変数CVSROOT の設定が含まれていないのは、'Project Builder' や Xcode には CVSROOTを参照する操作が無い(不可能だ)からです。 起動後の使い方は、前編の6章と同様です。
MacOSX でも、当然 pserverによるリモートアクセスが使えます。 ただし、pserverによる方法は多数のユーザを相手にするのでなければ、(MacOSX に限らず)あまりお勧めできる方法では無いと思います。 最初に紹介した SSH によるリモートアクセスと異なり、セキュリティ的な問題もありますが、管理者レベルでの作業が多いというのがその理由です。
pserver についても、本編では個人で使うことを前提にした方法を紹介します。 多数のユーザからのアクセスを許可する場合は、リポジトリ格納専用のアカウントを作成するとか、OS上でのログインとは別のパスワードを設けるなど、セキュリティに配慮した設定が必要になります。
OS上でログインする時のパスワードをそのまま使うことにします。 リポジトリの設定ファイルである ${CVSROOT}/CVSROOT/config ファイルに下記のような記述をしておきます。
SystemAuth=yes
CVSクライアントからリモートアクセスされた時に、xinetd が cvs コマンドを起動するように設定します。
管理者権限にて、新規に cvspserver というファイルを作成し、/etc/xinetd.d ディレクトリに格納してください。
cvspserver ファイルの記述例を以下に示します。
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = terra # MacOSXでのユーザ名
server = /usr/bin/cvs
server_args = -f --allow-root=/Users/terra/cvsroot # リポジトリの格納場所
groups = yes
flags = REUSE
}
MacOSX の /etc/xinetd.conf ファイルは、/etc/xinetd.d ディレクトリに格納されているファイルを取り込むように設定されており、同ディレクトリには各サービスの設定ファイルが格納されています。
[G4Cube:/etc] terra% cd /etc/xinetd.d ¶ [G4Cube:/etc/xinetd.d] terra% ls -l ¶ total 152 -rw-r--r-- 1 root wheel 168 Jul 14 2002 auth -rw-r--r-- 1 root wheel 145 Jul 14 2002 bootps -rw-r--r-- 1 root wheel 155 Jul 14 2002 chargen -rw-r--r-- 1 root wheel 158 Jul 14 2002 chargen-udp -rw-r--r-- 1 root wheel 145 Jul 14 2002 comsat -rw-r--r-- 1 root wheel 201 Feb 8 2003 cvspserver # ←追加したファイル -rw-r--r-- 1 root wheel 155 Jul 14 2002 daytime ・・・
設定内容を有効化するには、OSを再起動するか、もしくは以下のようなコマンドを実行します。
[G4Cube:/etc] terra% sudo kill -HUP `cat /var/run/xinetd.pid` ¶ Password: # 管理者のパスワードを入力
/etc/services ファイルの内容を表示し、ポート番号が2401であることと、サービス名やファイル名が一致していることの二点を確認します。
[G4Cube:~] terra% cd /etc ¶ [G4Cube:/etc] terra% grep "2401" services ¶ cvspserver 2401/tcp #CVS network server cvspserver 2401/udp #CVS network server
間違いが無ければ、ファイアウォールの設定で、ポート番号 2401を許可します。
MacOSXでは、「システム環境設定」を起動して[共有]-[ファイアウォール]の画面で(新規)ボタンをクリックすれば、設定画面が表示されます。

環境変数 CVSROOT の値を以下のように設定します。
setenv CVSROOT :pserver:terra@g4cube:/Users/terra/cvsroot
# (1) (2) (3)
# (1): サーバ上でのユーザ名.リポジトリにアクセス可能なアカウント.
# (2): サーバのホスト名(またはIPアドレス).
# (3): サーバ上でのリポジトリの格納場所.絶対パスのみ記述可.
pserver では `cvs login` というコマンドを使いCVSサーバにログインします。 このコマンドを実行すると、CVSクライアント側に .cvspass というファイルが作成され、認証済みであることが記録されます。 .cvspass ファイルが存在する限り、リモートアクセス時のパスワードの入力は不要になります。
[PowerBookG4:~] terra% cvs login ¶ (Logging in to terra@g4cube) CVS password: # terra のパスワードを入力 [PowerBookG4:~] terra% ls -la ~/.cvspass ¶ -rw------- 1 terra staff 54 Feb 9 21:05 .cvspass
リモートアクセスの必要が無くなったら、`cvs logout` コマンドを使い、.cvspass ファイルの内容を消去します。
[PowerBookG4:~] terra% cvs logout ¶ [PowerBookG4:~] terra% ls -la ~/.cvspass ¶ -rw------- 1 terra staff 0 Feb 9 21:38 .cvspass # サイズが 0(内容の消去)
`cvs login` は、サーバ側のリポジトリには何も影響を与えないようです。 `cvs logout` をしていない状態で、クライアント側で .cvspass ファイルを削除してしまっても、クライアントマシンをシャットダウンしても大丈夫です。
使い方は、ローカルマシン上のリポジトリの場合と同じです。
なお、pserver による方法では、リポジトリに格納されているモジュールを確認する手段がありません。
リポジトリに格納されているモジュール名の一覧を表示するには、ssh コマンドを利用してください(4.4節)。
使い方は、ローカルマシン上のリポジトリの場合と同じです。 SSH と違い、そのまま Dock や Finder から 'Project Builder' や Xcode を起動してもCVSサーバ上のリポジトリにリモートアクセス可能です。