OpenSSH - Connecting from/to MacOSX -

Last described 08-Feb-2004

1. 最初に
2. とりあえず接続してみる
2.1 SSHサーバの準備
2.2 SSHクライアントからの接続
2.3 rsh, rcp の代理コマンド
3. パスワードの入力回数を減らす
3.1 認証方式の変更
3.2 公開鍵と秘密鍵を作成する
3.3 公開鍵をログイン先に登録する
3.4 RSA認証の動作を確認する
3.5 ssh-agent(認証代理機能)を使ってみる
4. ssh-agent の使い方
4.1 ログイン・シェルで認証代理機能を使う
4.2 認証代理機能が使える理由
4.3 ssh-agent の実験的な使い方 (...閑話休題)
4.4 複数の仮想端末で認証代理機能を共有する(1) - screen
4.5 複数の仮想端末で認証代理機能を共有する(2) - ssh-Terminal
4.6 複数の仮想端末で認証代理機能を共有する(3) - ~/.MacOSX/environ.plist
4.7 パスフレーズの取り除き方  - ssh-agent を使わない方法(!?)
5. 他のソフトウェアとの組み合せ方
5.1 X11(X-Window) との組み合せ方
5.2 CVS との組み合せ方
5.3 rsync との組み合せ方
Appendix
A.1 ~/.MacOSX/environ.plist の作成・編集方法
A.2 Aqua でログインした時に、ssh-agent を自動起動する方法


1. 最初に

本編は、OpenSSH(SSH) の使い方について記載したものです。 SSH の特徴とも言うべき暗号化だのセキュリティだのといった話は、出てきませんので御承知おき願います。 コンピュータ環境については、MacOSX の使用を前提にした内容になっていますが、OpenSSH のコマンドそのものに関する情報は、他の OS でもそのまま役に立つと思います。


私見を述べさせて頂くと、SSH は rsh, rlogin, rcp といった旧来の方式と比べて、意外と楽です。 現状では、まだ面倒な点も多く残されていますが、それでも X11 や CVS の認証方式やファイアウォールの設定を集約できることや、ユーザ権限による設定だけで済む場合が多いことも、大きく影響していると感じています。


2. とりあえず接続してみる

ネットワーク(TCP/IP)接続されている二台のコンピュータを用意します。 どちらのコンピュータにも、自分が使えるアカウントを用意して下さい。 本編では、どのコンピュータでもユーザ名が同じになるように統一していますが、ユーザ名やパスワードは一致していなくても大丈夫です。

2.1   SSHサーバの準備

[システム環境設定]を起動した後、[共有]-[サービス]のダイアログ画面で、[リモートログイン]をチェックします。 ファイアウォールを有効にしている場合は、これに連動して自動的に 22番ポートが許可されます。


上記の操作により、sshd プロセス(デーモン/サービス)が起動します(もしくは、起動することを許可します)。 確認する場合は、Terminal から以下のようにコマンドを打ち込みます。

# MacOSX 10.2 の場合 (sshd の常駐)
[G4Cube:~] terra# ps -ax | grep sshd ¶
  492  ??  Ss     0:06.92 /usr/sbin/sshd    # sshd プロセスが起動している
  499 std  UV+    0:00.00 grep sshd
# MacOSX 10.3 の場合 (接続要求時に xinetd から起動)
[G4Cube:~] terra# head -4 /etc/xinetd.d/ssh ¶
service ssh
{
        disable = no                        # sshd の起動を許可している
        socket_type     = stream


2.2   SSHクライアントからの接続

rlogin や telnet コマンドの代りに、OpenSSHのコマンドを使い SSHサーバに接続します。 SSHクライアントとなるコンピュータの Terminal から以下のようにコマンドを打ち込んでください。

[LetsNote:~] terra% ssh terra@g4cube
    #                    (1)   (2)
    # (1): サーバ上でのユーザ名.クライアントとサーバで同じユーザ名なら省略可.
    # (2): サーバのホスト名(またはIPアドレス).

指定したサーバと初めて接続する場合は、以下のような操作になります。

# 一回目の接続
[LetsNote:~] terra% ssh terra@g4cube ¶
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.
terra@g4cube's password: PASSWORD_ON_G4Cube    # SSHサーバ上でのパスワードを入力
ちなみに、一回接続に成功すると ~/.ssh/known_hosts というファイルにSSHサーバが記録されるので、二回目以降ではパスワードの入力だけになります。
# 二回目以降の接続
[LetsNote:~] terra% ssh terra@g4cube ¶
terra@g4cube's password: PASSWORD_ON_G4Cube

SSHサーバ側のアカウントにログインできることを確認したら、ここでの作業は終了です。

Welcome to Darwin!
[G4Cube:~] terra% exit ¶    # 終了&切断
logout
Connection to g4cube closed.
[LetsNote:~] terra% 

※本節の用法においては、ssh ではなく slogin と記述する方が解りやすいかもしれません。 ssh と slogin は名前が違うだけで、中身は同じコマンドです。

2.3   rsh, rcp の代理コマンド

rsh や rcp 等のコマンドも OpenSSH に含まれるコマンドに置き換えることが可能です。

# rsh の代り.SSHサーバ内の Documents ディレクトリを表示させる.
[LetsNote:~] terra% ssh terra@g4cube  ls -l ~/Documents ¶
terra@g4cube's password: PASSWORD_ON_G4Cube
total 16544
drwxr-xr-x     3 terra  staff      102 Dec  5  2002 Acrobat User Data
-rw-r--r--     1 terra  staff    13083 Apr 21  2001 AppleCare Tech Info Library -Ma
-rw-r--r--     1 terra  staff     5437 Apr 21  2001 AppleCare Tech Info.html
-rw-r--r--     1 terra  staff      229 Aug  2  2003 sample.txt
・・・
# rcp の代り.SSHサーバ内のファイルをSSHクライアントにコピーする.
[LetsNote:~] terra% scp -p  terra@g4cube:Documents/sample.txt  text/sample.txt ¶
terra@g4cube's password: PASSWORD_ON_G4Cube
sample.txt           100% |*********************************|   229       00:00    


3. パスワードの入力回数を減らす

OpenSSH のコマンドを何度も繰り返して使う場合、その度に同じパスワードを入力するのは手間です。 そこで、OpenSSH が備える認証代理機能(ssh-agent)を利用して、このような手間を(なるべく)省くことにします。

3.1   認証方式の変更

OpenSSH には4種類の認証方式がありますが、2章で紹介したのは「パスワード認証」と呼ばれる認証方式です。 まずは、この認証方式を「RSA認証」に切り替えることで、認証代理機能を利用するための条件を整えます。 認証方式の切り替え作業は次節以降のようになります。


3.2   公開鍵と秘密鍵を作成する

自分のアカウント専用の秘密鍵と公開鍵を作成します。 この作業は必ず、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): PASSPHRASE    # パスフレーズを入力
Enter same passphrase again: PASSPHRASE       # もう一度、同じパスフレーズを入力
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  951 Aug  2 16:27 id_rsa        # 作成された秘密鍵ファイル
-rw-r--r--  1 terra  staff  229 Aug  2 16:27 id_rsa.pub    # 作成された公開鍵ファイル
-rw-r--r--  1 terra  staff  226 Aug  2 15:41 known_hosts
[PowerBookG4:~] terra% cat ~/.ssh/id_rsa.pub ¶    # 公開鍵ファイルの中身を表示してみる
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAt6cDaq8zEF33BTEbDNmBjZRHbWiZe0DPcL2/I8KcY/UEx8/4
2Lp5mQF6OAAhvjCANF5TXoIaJSBgSIBpGhTXQ+kmiaJTz3fuIo38vVplHL9K7ghuSk/nLL8qguTbcVvzh+Hf
Ea+aG6YkjLNNdI2ftw+kbCkjau7s3nlyDYAynvE= terra@PowerBookG4.local.

※空のパスフレーズを入力するという選択肢もあります。 詳しくは4.7節で。

3.3   公開鍵をログイン先に登録する

SSHクライアントとなるコンピュータ上で作成した公開鍵ファイル(~/.ssh/id_rsa.pub)の内容を、SSHサーバとなるコンピュータ上の ~/.ssh/authorized_keys というファイルに追加します。

# 同名のファイルを上書きしないように別名をつけて、公開鍵をSSHサーバにコピーしておく.
[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    
# SSHサーバにログインして作業を継続する.
[PowerBookG4:~] terra% ssh terra@g4cube
terra@g4cube's password: PASSWORD_ON_G4Cube
Last login: Wed Aug  2 15:49:59 2003 from letsnote
Welcome to Darwin!
##  ~/.ssh ディレクトリが存在しない場合は、作成してから以下の作業を行う.
[G4Cube:~] terra% cat  PBG4-terra.pub  >>  ~/.ssh/authorized_keys ¶
[G4Cube:~] terra% rm PBG4-terra.pub    # 不要になった公開鍵ファイルを削除

ログイン先のアカウントで OpenSSHを利用したことが無い場合、~/.ssh ディレクトリは存在していません。 以下のようにしてディレクトリを作成してください。

# その1:OpenSSHのコマンドを利用して作成する
[G4Cube:~] terra% ssh localhost  echo OK    # echo でなくても適当なコマンドで可
The authenticity of host 'localhost (127.0.0.1)' 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.
terra@localhost's password: PASSWORD_ON_G4Cube
OK
# その2:手作業で作成する
[G4Cube:~] terra% mkdir ~/.ssh ¶
[G4Cube:~] terra% chmod go-rwx ~/.ssh ¶
[G4Cube:~] terra% ls -ld ~/.ssh ¶    # ~/.ssh ディレクトリのパーミッションを確認する
drwx------  6 terra  staff  204 Aug  2 16:33 /Users/terra/.ssh


3.4   RSA認証の動作を確認する

SSHサーバに公開鍵を登録したら、RSA認証方式が有効になっているか確認します。 SSHクライアントとなるコンピュータからログインを試みてください。 パスワードの代りにパスフレーズの入力を要求されれば正常です。

[PowerBookG4:~] terra% ssh terra@g4cube ¶
Enter passphrase for key '/Users/terra/.ssh/id_rsa': PASSPHRASE  # パスフレーズを入力

※3.2節で空のパスフレーズを入力した場合は、パスワードもパスレーズも要求されずにログインします。

3.5   ssh-agent(認証代理機能)を使ってみる

RSA認証方式が有効になっても、単にパスワードがパスフレーズに代るだけで、毎回何かを打ち込む手間は似たようなものです。 パスフレーズの入力を一回で済ませるには、以下のようにします。

[PowerBookG4:~] terra% ssh-agent tcsh    # もう一つシェルを起動する.tcsh 以外でも可.
[PowerBookG4:~] terra% ssh-add ¶            # RSA認証に使うIDを有効化(追加)する
Enter passphrase for /Users/terra/.ssh/id_rsa: PASSPHRASE
Identity added: /Users/terra/.ssh/id_rsa (/Users/terra/.ssh/id_rsa)
これ以降、ssh や scp 等のコマンドを実行してもパスワードやパスフレーズは要求されなくなります。

ssh-agentを終了させるには、ssh-agent から起動したシェル(プログラム)を終了させます。

[PowerBookG4:~] terra% exit ¶    # 呼び出し元のシェルに戻る
[PowerBookG4:~] terra% 

この方法で注意点することは、認証代理機能が有効な範囲は ssh-agent が起動した子プロセス(子孫プロセス)に限定されているということです。 つまり、別の仮想端末(Terminalのウィンドウ)を開いたら、そこでは依然パスフレーズの入力を要求されることになります。

※実は、子プロセスでなくても ssh-agent の認証代理機能を使うことは可能です。詳細は次章にて。

4. ssh-agent の使い方

3.5節で紹介した ssh-agent の使い方は、SSH を常用する人や、複数の仮想端末で作業をする人、GUIのアプリケーションから利用する人には、あまり適当な使い方とは言えません。 仮想端末ごとに 3.5節の操作を何度も行うのは不便ですし、GUIのアプリケーションの場合は起動の仕方から工夫しなければなりません。 本章では、このような問題を回避するための方法を紹介します。


※一部の Linuxディストリビューション(RedHat Linux9等)では、GUIでログインすれば ssh-agent が自動的に常駐し、どの仮想端末やGUIアプリケーションでも認証代理機能を共有できる様になっています。 このような場合は、ssh-agent の使い方をあれこれと悩む必要はありません。

4.1   ログイン・シェルで認証代理機能を使う

ssh-agent の子プロセス(子孫プロセス)とならないシェルに対して認証代理機能を有効にする場合は、 以下のようにして ssh-agent を起動します(常駐させます)。

[PowerBookG4:~] terra% eval `ssh-agent` ¶
Agent pid 1399
[PowerBookG4:~] terra% ssh-add ¶    # ここの手順は 3.5節と同じ
Enter passphrase for /Users/terra/.ssh/id_rsa: PASSPHRASE
Identity added: /Users/terra/.ssh/id_rsa (/Users/terra/.ssh/id_rsa)
ssh-agent を終了させる時は、以下のコマンドを打ち込みます。
[PowerBookG4:~] terra% eval `ssh-agent -k` ¶
Agent pid 1399 killed;

3.5節の方法と違い、この方法を使うとログイン・シェルを終了しても ssh-agent プロセスは残留してしまいます。 ログアウトする前には、必ず ssh-agent を終了させるコマンドを打ち込んでください。 とは言え、うっかり忘れてしまうのが人間の常ですから、この方法を使う時は ~/.logout ファイルに以下のような記述を加えておきます。

# csh, tcsh 用のスクリプト
if ($?SSH_AGENT_PID) then
    eval `ssh-agent -k`
endif


4.2   認証代理機能が使える理由

4.1節で説明した eval `ssh-agent` というコマンドで、ssh-agent がシェルにどのようなスクリプトを実行させたのか、確認してみます。

# 起動:`ssh-agent` によるスクリプトの実行/記録/表示
[PowerBookG4:~] terra% eval `ssh-agent | tee xxxx.csh`   # ファイル名は任意
Agent pid 1401
[PowerBookG4:~] terra% cat xxxx.csh                      # スクリプトを表示する
setenv SSH_AUTH_SOCK /tmp/ssh-6igaBIMu/agent.1401;
setenv SSH_AGENT_PID 1401;
echo Agent pid 1401;

このスクリプトでは、2つの環境変数 SSH_AUTH_SOCK と SSH_AGENT_PID に値を設定しています。 SSH_AUTH_SOCK の値は、起動した ssh-agent プロセスと通信するためのソケット・リンクを、 SSH_AGENT_PID の値は、起動した ssh-agent プロセスの PID を示しています。

[PowerBookG4:~] terra% ls -l ${SSH_AUTH_SOCK} ¶                      
srwxr-xr-x  1 terra  wheel  0 Aug  2 21:54 /tmp/ssh-6igaBIMu/agent.1401
[PowerBookG4:~] terra% ps  ${SSH_AGENT_PID} ¶
  PID  TT  STAT      TIME COMMAND
 1401  ??  Ss     0:00.00 ssh-agent

つまり、シェルから起動した子プロセス(ssh-add, ssh, slogin, scp等)は、環境変数 SSH_AUTH_SOCK が示すソケットを経由して ssh-agent プロセスと通信し、認証済み(パスフレーズが入力済み)であることを通知したり、逆に認証済みであることを確認したりしているという訳です。

ここまでくれば、`ssh-agent -k` が何をしているかは言わずもがなだと思います。(以降の説明は省略)


4.3   ssh-agent の実験的な使い方 (...閑話休題)

3.5節で、認証代理機能が子プロセス(子孫プロセス)に限定されていると説明しましたが、これは環境変数が親プロセスから子プロセスへ引き継がれるという OSの仕組みに起因しているからに他なりません。

つまり、環境変数さえ巧く設定してしまえば、親子関係にないプロセス同士でも、一つの ssh-agent を共用することが可能ということです。 実際に確認した時の様子を以下に示します。

# STEP1: 仮想端末1
[PowerBookG4:~] terra% ssh-agent > xxxx.csh   # ファイル名は任意
[PowerBookG4:~] terra% eval `cat xxxx.csh` ¶    # 環境変数 SSH_AUTH_SOCK 等を設定する
Agent pid 1401
# STEP2: 仮想端末2
[PowerBookG4:~] terra% eval `cat xxxx.csh` ¶    # 環境変数 SSH_AUTH_SOCK 等を設定する
Agent pid 1401
# STEP3: 仮想端末1
[PowerBookG4:~] terra% ssh-add ¶
Enter passphrase for /Users/terra/.ssh/id_rsa: PASSPHRASE
Identity added: /Users/terra/.ssh/id_rsa (/Users/terra/.ssh/id_rsa)
# STEP4: 仮想端末2
[PowerBookG4:~] terra% ssh terra@g4cube 'echo ${HOST}' ¶    # 認証代理機能の有効を確認
G4Cube.local.                # パスフレーズを要求されることなく、SSHサーバのホスト名を表示
# STEP5: 仮想端末1
[PowerBookG4:~] terra% eval `ssh-agent -k` ¶    # ssh-agent を終了させる
Agent pid 1401
# STEP6: 仮想端末2
[PowerBookG4:~] terra% ssh terra@g4cube  echo ${HOST} ¶    # 認証代理機能の無効を確認
Enter passphrase for key '/Users/terra/.ssh/id_rsa': PASSPHRASE
G4Cube.local.
[PowerBookG4:~] terra% ssh-add ¶            # ssh-agent プロセスは既に存在していない
Could not open a connection to your authentication agent.
閑話休題。実用的な話に戻ります。

4.4   複数の仮想端末で認証代理機能を共有する(1) - screen

screen というのは、仮想端末アプリケーションの1つのウィンドウを、複数の仮想端末にするためのプログラムです。 『複数』といっても、画面上は1つのウィンドウしか無いので、表示を切り替えながら使うことになりますし、 認証代理機能の有効範囲も1つのウィンドウ内に限定されるという条件付きです。

screen は MacOSX にもインストールされているので、興味のある方は実際に使ってみてください。

# その1:素の状態なら
[PowerBookG4:~] terra% ssh-agent screen ¶
# その2:4.1節等の手順で、認証代理機能を有効にした後なら
[PowerBookG4:~] terra% screen ¶

※仮想端末アプリケーション: MacOSX 標準の Terminal(ターミナル)、JTerminal、iTerm 等.

4.5   複数の仮想端末で認証代理機能を共有する(2) -  ssh-Terminal

ssh-Terminal というのは、ssh-agent の子プロセスとして Terminal を起動させるプログラムです。 私が勝手に作成・命名したプログラムですので、ご存じなくても恥じることはありません(笑)。

この方法で起動した Terminal では、全ての全仮想端末ウインドウが認証代理機能の有効範囲になります。 あるウィンドウの仮想端末で ssh-add コマンドを一回実行すれば、他のウィンドウの仮想端末でも認証代理機能が有効になります。 興味のある方は、ダウンロードして利用してみてください。

ssh-Terminal ("ssh-Terminal-1.0.tgz", 8KB)

ちなみに、この方法をアプリケーションの形態で紹介したのは、これまでのように Terminal から起動すると面倒な状態になるからです。 試しに、認証代理機能が効いていない素の Terminal から、以下のコマンドを実行してみてください。

nohup ssh-agent  /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal &
Terminal がもう一つ起動して、ドックにアイコンが二つ表示されたはずです。 最初の Terminal のアイコンやウィンドウと紛らわしくて操作を間違えそうです。 最初の Terminal は終了させてしまうというのも一つの解決策ですが、あまりスマートな方法とは思えません。


4.6   複数の仮想端末で認証代理機能を共有する(3) -  ~/.MacOSX/environ.plist

~/.MacOSX/environ.plist というのは、Finder や Dock から起動されるアプリケーションに環境変数を設定するための定義ファイルです。 このファイルを利用して、環境変数 SSH_AUTH_SOCK に予め適切なパスを設定しておけば、GUI(Aqua, X11)上で利用する全アプリケーションを認証代理機能の有効範囲にすることが可能です。 つまり、Terminal*1 で ssh-add コマンドを実行すれば、"Project Builder" 等でも SSHの認証代理機能が有効になります。

まず、~/.MacOSX/environ.plist の内容を以下のように設定します。

# ~/.MacOSX/environment.plist の設定
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/...
<plist version="1.0">
<dict>
        <key>SSH_AUTH_SOCK</key>
        <string>/Users/terra/.MacOSX/ssh_auth_sock</string>
</dict>         # 必ずフルパスで記述する.シェルを媒介しないので "~/" は使用不可.
</plist>
設定が完了したら再ログイン(もしくは再起動)します。 次に ssh-agent を起動しますが、この時、環境変数 SSH_AUTH_SOCK の値に合せてソケット・リンクを作成します。
[PowerBookG4:~] terra% eval `ssh-agent  -a ${SSH_AUTH_SOCK}` ¶
Agent pid 1399

これ以降の使い方は、4.1節と全く同じです。 仮想端末で ssh-add コマンドを一回実行すれば、全ての GUIアプリケーションで認証代理機能が有効になりますし、 eval `ssh-agent -k` コマンドを実行すれば認証代理機能を終了させることができます。


ssh-agent が常駐(起動)している間は、指定したパスにソケット・リンクが存在しています。 誤って削除しないように、隠しディレクトリ/ファイルにパスを設定しておくことをお奨めします。

[PowerBookG4:~] terra% ls -lF ~/.MacOSX ¶
total 48
-rw-r--r--  1 terra  staff  396 Aug 24 15:02 environment.plist
srwxr-xr-x  1 terra  staff   27 Aug 24 17:07 ssh_auth_sock=

*1:Terminal は GUIアプリケーションです。念のため。
※本節に関わる他の有益な情報については、Appendix を参照してください。

4.7   パスフレーズの取り除き方  - ssh-agent を使わない方法(!?)

ここまで読んで、ssh-agent は何て面倒な代物だろうという方や、そこまでしてデスクトップ(端末の操作)のセキュリティを確保する必要は無いという方は、空のパスフレーズを使うことも検討してみてください。 パスフレーズさえ無ければ、ssh-agent は無用の長物なのですから。 ただし、秘密鍵ファイルの内容は暗号化されていないので、悪意のある人にコピーされないように注意しなければなりません。

既に、パスフレーズ付きで秘密鍵/公開鍵のペアを作成している場合は、以下のようにすればパスフレーズを取り除く(秘密鍵ファイルの暗号化を解除する)ことができます。

[PowerBookG4:~] terra% ssh-keygen -p ¶
Enter file in which the key is (/Users/terra/.ssh/id_rsa):     # 秘密鍵のファイル名を確認
Enter old passphrase: OLD_PASSPHRASE            # これまでのパスフレーズを入力する
Key has comment '/Users/terra/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase):    # 空のパスフレーズを入力する
Enter same passphrase again:                       # 空のパスフレーズをもう一度入力する
Your identification has been saved with the new passphrase.

※パスフレーズの有無は、ネットワークによる通信自体のセキュリティには影響しません。 あくまでデスクトップ(端末の操作)に対してセキュリティを与えるための手段です。

5. 他のソフトウェアとの組み合せ方

5.1   X11(X-Window) との組み合せ方

OpenSSH は X11(X-Window) と組み合わせて使うことも可能です。 MacOSX での設定は、X11 が標準のウィンドウシステムでないため少々設定変更が必要になりますが、 それでも、ファイアウォールの設定変更や xhost 云々の手間を考えれば、SSH による接続の方が楽な気がします。

サーバ側とクライアント側の両方に X11 がインストールされていることが必要なので、 MacOSX(10.2.x以前)のコンピュータでは、X11のパッケージを別途に入手・インストールしておいてください。

【サーバの設定】

MacOSX で 外部の端末に対してX11を使う場合は、 /etc/sshd_config ファイル内の設定を書き換える必要があります。 ファイル内に下記のような記述があるので、

#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
以下のように書き換えます。(書き換えには管理者権限が必要です。)
X11Forwarding yes
X11DisplayOffset 10     # デフォルトと同じなので、コメントのままでもOK
X11UseLocalhost yes     # デフォルトと同じなので、コメントのままでもOK
/etc/sshd_config ファイルを書き換えたら、設定内容を有効にするために sshd を再起動します。 ただし、MacOSX 10.3のように xinetdが sshdを起動する方式の場合、この作業(sshd の再起動)は不要です。
[G4Cube:~] terra% ps -ax | grep sshd ¶
  329  ??  Ss     0:06.92 /usr/sbin/sshd
28988 std  UV+    0:00.00 grep sshd
[G4Cube:~] terra% sudo kill -HUP 329
Password:        # パスワードを入力する


【クライアントからの接続】

SSHサーバに接続する前には、必ず X11(Xサーバ)を起動しておき、かつ環境変数 DISPLAY に適切な値を設定しておく必要があります。 MacOSX の標準設定では、環境変数 DISPLAY を設定してくれないという問題があるので、~/.MacOSX/environment.plist ファイルに環境変数の設定を追加しておきます。

# ~/.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>DISPLAY</key>
        <string>localhost:0.0</string>
・・・

SSHサーバに接続するには、以下のようにコマンドを打ち込みます。

[LetsNote:~] terra% ssh -X terra@g4cube    # -X(大文字)オプションを付けて起動
Last login: Sun Aug 24 22:14:05 2003
Welcome to Darwin!
[G4Cube:~] terra% xeyes & ¶    # テスト.目玉が表現れたらOK.
[1] 454
※上記のコマンド打ち込み例は、認証代理機能が有効な状態です。


正常に表示できない場合は、リモートログインした状態で環境変数 DISPLAY の値を確認します。

[G4Cube:~] terra% env | grep DISPLAY¶
DISPLAY=localhost:10.0
前述の SSHサーバの設定例であれば、10.0 以上の番号が sshd により設定されているはずです。 0.0 の様な番号が設定されている場合は、SSHサーバ側の .login等のファイルで、環境変数 DISPLAY の値を上書きするようになっている可能性があります。 もしそうであれば、SSHサーバ側も(SSHクライアントと同様) ~/.MacOSX/environment.plist による設定方法に変更するか、 .login等のファイルを以下のように書き換えるなどの工夫をしてください。
if (! $?DISPLAY) then
    setenv DISPLAY localhost:0.0
endif


5.2   CVS との組み合せ方

OpenSSH の動作環境が整っていれば、SSHサーバとなるコンピュータでの追加作業は特にありません。 SSHクライアントとなるコンピュータでは、CVSコマンドを使うための環境変数の設定が必要になります。

setenv CVS_RSH ssh
setenv CVSROOT :ext:terra@g4cube:/Users/terra/cvsroot
    #                (1)   (2)     (3)
    # (1): サーバ上でのユーザ名.リポジトリにアクセス可能なアカウント.
    # (2): サーバのホスト名(またはIPアドレス).
    # (3): サーバ上でのリポジトリの格納場所.絶対パスのみ記述可.
CVSコマンドでリポジトリを指定する場合は、環境変数 CVSROOT の設定は必要はありません。 また、頻繁に使う環境変数(CVS_RSH等)は、.login ファイルで設定するようにしておくと楽です。


"Project Builder" から CVSサーバにアクセスする時は、4.6節で述べた方法で環境を整えます。 この時、~/.MacOSX/environment.plist に環境変数 CVS_RSH の設定を忘れずに追加しておきます。

# ~/.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>
・・・
        <key>SSH_AUTH_SOCK</key>
        <string>/Users/terra/.MacOSX/ssh_auth_sock</string>
・・・

環境変数を ~/.MacOSX/environment.plist で設定する方法は、Terminal 等も含めた全ての GUIアプリケーションに有効です。 ですから、リモートのコンピュータから SSHでログインして更にリモートの CVSサーバを使うとか、コンソールモードで MacOSX を使うのでなければ、先に述べた .login ファイルによる設定と併用する必要はありません。


5.3   rsync との組み合せ方

OpenSSH の動作環境が整っていれば、SSHサーバとなるコンピュータでの追加作業は特にありません。 SSHクライアントとなるコンピュータでは、rsync コマンドをの実行時に引数として -e オプションで ssh を指定するか、環境変数 RSYNC_RSH の値として ssh を設定しておいてから使います。

# rsync のコマンド使用例(-e オプションを指定する場合)
rsync -e ssh --exclude '.*' -avuz  REMOTE_SRC  LOCAL_DST
rsync -e ssh --exclude '.*' -Cavuz LOCAL_SRC  REMOTE_DST


[HOME] > [INDEX]
 
 

Appendix

A.1   ~/.MacOSX/environ.plist の作成・編集方法

編集ツールとして、"/Developer/Applications/Property List Editor" を使います。 保存形式として "XML Property List File" を選択すれば、簡単に雛形を作ることができます。

ただし、このツールは隠しディレクトリにファイルを新規作成することができないので、一旦別のディレクトリに保存しておき、後でシェルを使って ~/.MacOSX ディレクトリにファイルを移動させることになります。 既存のファイルを編集する時は、ファイルオープンのダイアログの [Go to:]欄に ~/.MacOSX と打ち込めば、隠しフォルダのファイルも一覧表示・選択できるので問題ありません。


A.2   Aqua でログインした時に、ssh-agent を自動起動する方法

本節の説明は、4.6節の方法をより便利に使うための方法です。 loginwindow のオプション機能を利用して、ログイン前後に処理を起動します。 関係するファイルが多いこともあり、この節は本当のメモ書き程度の記述になっています。

本節で紹介する方法は、設定に失敗すると Aquaからのログインが二度とできない状態に陥ります。 このメモを見て何をしているのか判らない方は、この方法は使わないようにしてください。 判る方も、失敗した時に回復させるための手段*1を確保してから実行してください。

*1:ssh でリモートログインするとか、シングルユーザモードで MacOSX を起動するとか・・。

ID ファイルパス ファイルの
所有者:グループ
ファイルの
規定者
(1)/var/root/Library/Preferences/com.apple.loginwindow.plist root : wheelApple
(2)/Library/loginwindow/ root : adminterra
(3)/Library/loginwindow/loginhook root : adminterra
(4)/Library/loginwindow/logouthook root : adminterra
(5)~/.MacOSX/ terra : stuffApple
(6)~/.MacOSX/environment.plist terra : stuffApple
(7)~/.MacOSX/loginhook terra : stuffterra
(8)~/.MacOSX/logouthook terra : stuffterra
(9)~/.MacOSX/ssh_agent_pid terra : stuffterra
(10)~/.MacOSX/ssh_auth_sock terra : stuffterra

(1)  /var/root/Library/Preferences/com.apple.loginwindow.plist

[PowerBookG4:~] terra% sudo defaults write com.apple.loginwindow    # 次の行に続く
                            LoginHook /Library/loginwindow/loginhook  ¶
[PowerBookG4:~] terra% sudo defaults write com.apple.loginwindow    # 次の行に続く 
                            LogoutHook /Library/loginwindow/logouthook  ¶
※loginwindow の -LoginHook, -LogoutHook オプションを使っても、同様の効果があります。 この場合は /etc/ttys ファイルを書き換えることになります。

(2)  /Library/loginwindow/

[PowerBookG4:~] terra% sudo mkdir /Library/loginwindow ¶

(3)  /Library/loginwindow/loginhook

#!/bin/sh
USER=$1
HOME=/Users/${USER}
if [ -e ${HOME}/.MacOSX/loginhook ]; then
    sudo -u ${USER} ${HOME}/.MacOSX/loginhook
fi

(4)  /Library/loginwindow/logouthook

#!/bin/sh
USER=$1
HOME=/Users/${USER}
if [ -e ${HOME}/.MacOSX/logouthook ]; then
    sudo -u ${USER} ${HOME}/.MacOSX/logouthook
fi

(7)  ~/.MacOSX/loginhook

#!/bin/sh
eval `ssh-agent -s -a ~/.MacOSX/ssh_auth_sock`
echo ${SSH_AGENT_PID} > ~/.MacOSX/ssh_agent_pid

(8)  ~/.MacOSX/logouthook

#!/bin/sh
export SSH_AGENT_PID=`cat ~/.MacOSX/ssh_agent_pid`
eval `ssh-agent -s -k`
rm -f ~/.MacOSX/ssh_agent_pid



[HOME] > [INDEX]
Copyright(c) Kazufumi Terada, 2003-2004