[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4. TRAMP の設定

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Configuration"
"tramp/TRAMPの設定"へのコメント(無し)
検索全文Elisp

TRAMP は(通常)インストールするだけで完全に機能します。初期状態では、 リモートホストへの接続に ssh プログラムを使用し、base64 エン コーディングもしくは uu エンコーディングを使用するように設定されていま す。 従って最も簡単な場合には C-x C-f と打ち込んでファイル名 `user@machine/path/to.file'. を入力するだけです。

ホストによっては、接続を確立するのに問題が起きることがあります。これは、 remote shell の振る舞いによるものです。この詳細については See 節 4.9 リモートシェルの設定のヒント, を参照してください。

もし、リモートホストとの接続にこれらのコマンドを使用したくない場合は、 TRAMP のデフォルトの接続と転送メソッドを変更してください。リモート マシンに接続しファイルを転送するのに使うことのできる TRAMP のメソッド がいくつかあります (see 節 4.1 リモートマシンへの接続の種類)。

どのメソッドがふさわしいかわからないなら次を見て下さい: See 節 4.5 デフォルトのメソッドの選択.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.1 リモートマシンへの接続の種類

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Connection%20types"
"tramp/リモートマシンへの接続の種類"へのコメント(無し)
検索全文Elisp

転送メソッドには二つの基本的なタイプがあり、それぞれに長所、短所が あります。両者ともに、rshsshtelnet のようなリモートシェルにアクセスするプログラムを使用し、リモートマシン に接続します。

このコネクションは、TRAMP がローカルマシンからリモートマシンへ透過的 にアクセスするために、さまざまなオペレーションをおこなうために使われます。 ファイルをオープンした時のメソッドが異なるだけです。

リモートファイルを読み込んだり、保存する時には、二つのマシン間でファイル の内容を転送する必要があります。ファイルの内容は、マシンにログインしたの と同じコネクションか、rcpscprsync などのリモートコピープログラムを使用した別のコネクションで転送されます。 前者は インラインメソッド、後者は out-of-band メソッド あるいは 外部転送メソッド (略して 外部メソッド) とよばれます。

少なくとも大きなファイルに対しては、一般に外部転送メソッドの性能は インラインメソッドよりすぐれています。その理由は、インライン転送では データの符号化、復号化をおこなう必要があるからです。

このルールの唯一の例外は、scp を使用する転送メソッドです。 これらのメソッドの実際のファイル転送の性能は高いのですが、転送開始時 の暗号化にかかわるネゴシエーションのオーバーヘッドがファイル転送の性能 を帳消しにします。

外部転送メソッドを使うためには、リモートコピーコマンドが対話的でない、 つまりコマンドがパスワードのためにプロンプトを出力しないことが必要です。 もし、パスワード入力なしのリモートコピーコマンドを使う事ができないので あれば、インラインメソッドを使う必要があります。

インラインメソッドの一種に、マルチホップメソッド があります。 このメソッドを使うと、いくつかのホップを使い、リモートホストへ接続 できます。これは、あなたがセキュアなネットワークの中にいて、要塞ホスト を経由して外部に接続する場合に便利です。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.2 インラインメソッド

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Inline%20methods"
"tramp/インラインメソッド"へのコメント(無し)
検索全文Elisp

TRAMP のインラインメソッドは大変強力で、外部転送メソッドを使う事が できない状況でも動作します。インラインメソッドは、telnet 経由でリモート マシンに接続している時に動作する唯一のメソッドです(ホスト間でなく ユーザー 間のファイル転送を可能にする、ちょっと変わったメソッド もあります。以下を参照してください)。

これらのメソッドを使うためには、符号化、復号化のためのコマンドがリモート マシン上に存在しなければなりません。ローカルマシン上では、TRAMP は ファイルを復号化、符号化する Emacs の機能を使うか、外部コマンドを使用 します。

TRAMP は、リモートホストにおいて mimencode (metamail パッケージの一部) や uuencode といった コマンドの存在と、それが使えるかどうかを調べます。最初の信頼できるコマンドが 使われます。検索パスをカスタマイズすることができます。4.8 リモートマシン上で TRAMP がプログラムを発見、使用する方法 を参照して下さい。

もしどちらのコマンドもリモートホストに無かった場合、 TRAMP は小さな Perl のコードをリモートホストに転送し、それをエンコードやデコードに用い ようとします。

`rsh'

リモートホストに rsh で接続します。セキュアでない接続の為、 極めてローカルなホストトポロジー以外に用いるべきではありません。

rsh の代わりに remsh コマンドを提供するオペレーテ ィングシステムではメソッド `remsh' を使うこともできます。例えば HP-UX や Cray UNICOS の場合があてはまります。

`ssh'

リモートホストに ssh で接続します。ssh パッケージ を用いて接続をよりセキュアにしていることを除けば先ほどのオプションと同 じです。

`ssh1' と `ssh2' という二つの変種があり、それぞれは `ssh -1' と `ssh -2' を呼び出します。このようにして、 SSH プロトコルバージョン 1 と 2 のどちらを用いてリモートホストに接続 するかを明示的に選択することができます。(SSH の設定ファイル `~/.ssh/config' でどちらのプロトコルを用いるか指定し、通常の `ssh' メソッドを用いる こともできます。)

またそのほかに、 `ssh1_old' と `ssh2_old' という二つの変種が 存在し、明示的に ssh1 コマンドと ssh2 コマンドを使います。 それらが何か知らないなら、これらのオプションはあなたには必要ありません。

ssh に基づく全てのメソッドは、クルージ的特徴を持ちます: `host#42' のようにして(実ホスト名に続けてハッシュ記号、そしてポート番号) ホスト名を指定することができます。これの意味は、指定したホストに接続する際に、 ssh コマンドの引数として -p 42 を渡すということです。

`telnet'

リモートホストに telnet で接続します。これは `rsh' メソッド と同様にセキュアでない方法です。

`su'

このメソッドはリモートホストに接続しません。そのかわりに su プログラムを使うことで他のユーザとしてファイルを編集することを可能と します。

`sudo'

このメソッドは、`su' メソッドに似ていますが、違うユーザーになる ために su でなく sudo を使用します。

そのユーザーでシェルを起動できるように、sudo が設定されていな ければならないことに注意してください。lsmimedecode の起動の許可だけで十分であればよいのですが、そのように実装するのは簡単では なく、まだ無理です。

`sshx'

お分かりのように、これは `ssh' とちょっと違った類似物です。 `ssh' がリモートホストで通常の対話的シェルを開くのに対し、 このオプションは `ssh -t -t host -l user /bin/sh' を使って接続を行ないます。この方法は、通常のログインシェルが、ログイン の際に質問をしてくるように設定してある場合に有用です。この手順により それらの質問を回避して、`標準的な' ログインシェルを TRAMP に使わせ ることができます。

この手続きは ssh 自身からの質問を排除しないことに注意して下 さい。例えばリモートホストのホスト鍵が未知の物である場合に、"Are you sure you want to continue connecting?" と ssh が訊いてくる かもしれません。TRAMP は(今のところ)そのような質問を扱う方法を知ら ないので、そのような質問をされないでログインできるようにしておく必要が あります。

この手順は、 ssh を Emacs バッファから呼ぶと pseudo tty を割 り当ててないと言われてしまう Windows ユーザにとっても有用です。この時、 ログインシェルはシェルプロンプトを一切表示しようとしなくて、それは TRAMP を大変混乱させてしまいます。未知の理由により、いくつかの ssh の Windows への移植版(たぶん Cygwin のものも)は `-t' オプションを二つ重ねて使うことを要求します。

これは `-p' クルージをサポートします。

`krlogin'

このメソッドも `ssh' に似ています。リモートホストにログインするのに krlogin -x コマンドを使うだけです。

`plink'

このメソッドは SSH の PuTTY 実装を使っている Windows ユーザにとって とても興味深いものです。リモートホストにログインするのに `plink -ssh' を使います。

さらにメソッド `plink1' が提供されます。それは 明示的に SSH プロトコルバージョン 1 を使うために `plink -1 -ssh' を呼び出します。

CCC: SSH key を受理するためにコマンドラインからリモートホストへ繋ぐ必要は あるのか? これは自動化できないか?

CCC: plink は `-p' オプションをサポートしているか? いずれに せよ TRAMP はそれをサポートする。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.3 外部転送メソッド

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=External%20transfer%20methods"
"tramp/外部転送メソッド"へのコメント(無し)
検索全文Elisp

外部転送メソッドは複数のチャネルを使用します。オペレーションのために リモートシェルのコネクションを使い、ファイル転送には、外部プログラム を使います。

これは、インライン転送時の、ひとつのコネクションを使った多重化転送のため の符号化、復号化のオーバーヘッドを削減します。

外部転送メソッドを使いたい場合は、ファイルをコピーするための転送ユーティ リティが、パスワード入力なしで実行できなければなりません。

つまり、scp を使う場合や、使っている scp がコマンド ラインでパスワードを受け付けるバージョンの場合には、ssh-agent を使う必要があるということです。(2) ssh 経由で rsync を使う場合も同様です。

もし、パスワード入力なしで scp を実行することができないが、 コネクションをセキュアにするために ssh を使いたい場合は、 ssh ベースのインラインメソッドを参照してください。

`rcp' -- rshrcp

このメソッドは rshrcp を使い、リモートマシン に接続、ファイル転送をおこないます。おそらく最速のメソッドです。

もう一つ別のメソッド `remcp' では remsh コマンドと rcp コマンドを使います。これは rsh の代わりに remsh が使われるマシン上で使われるべきです。

`scp' -- sshscp

リモートホストへの接続のための ssh や、マシン間のファイル転送 のための scp は、リモートマシンへのセキュアな接続とファイル アクセスのためには最良のメソッドです。

このオプションの性能も優れています。しかし、小さいファイルのオープン、 クローズを頻繁に繰り返す場合はインラインメソッドより遅くなります。 scpセッション開始時の暗号化のためのハンドシェークのコストは、 符号化、復号化をおこなわない利点を帳消しにします。

`scp1' と `scp2' という二つの変種があり、それぞれは `ssh -1' と `ssh -2' を呼び出します。このようにして、 SSH プロトコルバージョン 1 と 2 のどちらを用いてリモートホストに接続 するかを明示的に選択することができます。(SSH の設定ファイル `~/.ssh/config' でどちらのプロトコルを用いるか指定し、通常の `scp' メソッドを用いる こともできます。)

またそのほかに、 `scp1_old' と `scp2_old' という二つの変種が 存在し、明示的に ssh1 コマンドと ssh2 コマンドを使います。 それらが何か知らないなら、これらのオプションはあなたには必要ありません。

ssh に基づく全てのメソッドは、 `-p' に関するクルージ的 特徴を持っており、ホスト名の中でポート番号を指定できます。例えばホスト 名を `host#42' とすることで ssh コマンドの引数リストに -p 42 を指定するように TRAMP に指示できます。

`rsync' -- sshrsync

リモートホストにセキュアに接続するために ssh コマンドを、 ファイル転送のために rsync を使うのが、`scp' メソッドの特徴です。

両側のホスト上に存在するファイルを転送する場合、rsyncscp より高性能です。この利点は、ファイルが片側のホストに しかない場合には失なわれます。

リモートシステムへ書き込む場合、rsync ベースのメソッドは rcp ベースのメソッドよりかなり速いでしょう。しかし、ローカル マシンのファイルを読み込む場合は、直接コピーするより速くありません。

このメソッドは `-p' ハックをサポートします。

`scpx' -- sshscp

想像通り、このメソッドは `scp' とよく似ています。`scp' が リモートホスト上で通常の対話的シェルを起動するのに対して、このオプション はコネクションをオープンするために `ssh -t -t host -l user /bin/sh' を使います。このオプションは、通常のログインシェルがログイン時にいくつか の質問をおこなうように設定されている場合に役に立ちます。この手順により それらの質問を回避して、`標準的な' ログインシェルを TRAMP に使わせ ることができます。

この手順は Windows ユーザにとって ssh を Emacs バッファから 呼ぶと pseudo tty を割り当ててないと言われてしまう場合にも有用です。 この時ログインシェルはシェルプロンプトを一切表示しないために TRAMP は大変混乱してしまいます。たぶんこれは Cygwin に移植されたSSH の場合に 当てはまります。

このメソッドは `-p' ハックをサポートします。

`pscp' -- plinkpscp

このメソッドは `scp' に似ていますが、リモートホストに接続するの に plink コマンドを使い、ファイルを転送するのに pscp を使います。これらのコマンドは Windows 用の SSH 実装である PuTTY に 含まれています。

CCC: plink は `-p' ハックをサポートしているか?

`fcp' -- fshfcp

このメソッドは `scp' に似ていますが、リモートホストに接続するの に fsh コマンドを使い、ファイルを転送するのに fcp を使います。 fsh/fcpssh のフロントエンドで、 同一の ssh セッションを再利用していくつかのコマンドを送るこ とを可能とします。これにより、scp の起動にかかるオーバーヘッド (呼ばれる度にセキュアな接続を確立しないといけない)を回避できます。 一方、同様の効果を得るためにインラインメソッドのどれかを用いることも できることを注意しておきます。

このメソッドはコマンド `fsh host -l user /bin/sh -i' を使って接続を確立します。単に fsh host -l user としただけでは動きません。

fsh プログラムが提供する多重化は我々の文脈ではそれほど有用で はないので、それを用いるインラインメソッドは存在しません。その代わり TRAMP は単にリモートホストへの一つの接続を開き、その接続を保持します。

`smb' -- smbclient

これはまた別の TRAMP 独自でないメソッドです。smbclient コマンドを別の Unices 上で使って、SMB サーバへの接続を行ないます。 SMB サーバは別の UNIX ホスト上の Samba (もしくは CIFS) サーバであるか もしれませんし、さらに興味深いことに、MS Windows が動いているホストで あるかもしれないのです。今のところ、MS Windows NT、MS Windows 2000、 および MS Windows XP に対してテストされています。

ローカル名の先頭のディレクトリはリモートホストでの共有名でなければなり ません。通常デフォルトの共有の終端は文字 $ ですが、ファイル名の 環境変数による展開のため、それを $$ と書く必要があることを憶えて おいて下さい。もし、共有名が与えられなければ(すなわちリモートディレクトリ が / の場合)、全ての利用可能な共有たちが表示されます。

認可は共有レベルでなされているので、同じホストであっても別の共有にアク セスすると必ずパスワードを求められます。セキュリティ上の理由からパスワ ードはキャッシュされません。

MS Windows は認可のためにユーザ名とドメイン名の両方を用います。このた め、TRAMP 構文は拡張されました: ユーザ名を指定する際に user%domain (実ユーザ名、パーセント記号、ドメイン名)のように書くことができます。 したがって、マシン melancholia にドメイン BIZARRE のユーザ daniel として接続して、ホームディレクトリ (共有 daniel$) にある `.emacs' を編集する場合、ファイル名を `smbdaniel%BIZARRE@melancholia/daniel$$/.emacs' と指定します。

ドメイン名やユーザ名は付けないこともできます。もしユーザ名が指定されな ければ匿名ユーザ(パスワード入力の必要がない)が仮定されます。これは他の 全ての TRAMP メソッドと異なります。他のメソッドで同じ状況の場合には ローカルユーザ名が使われます。

`smb' メソッドは `-p' ハックをサポートします。

注意して下さい: もし Emacs がローカルの MS Windows の下で動い ているならばこのメソッドは利用できません。その代わりに、 `//melancholia/daniel$$/.emacs' のような UNC ファイル名を使うこと ができます。唯一の欠点は他のユーザ名を指定するための方法が無いことです。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.4 複数のホップを使いリモートホストに接続する

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Multi-hop%20Methods"
"tramp/複数のホップを使いリモートホストに接続する"へのコメント(無し)
検索全文Elisp

これまでに説明したメソッドでは不十分な事があります。シンプルなメソッドを 使ってリモートホストに接続できないことがあります。たとえば、セキュアな ネットワークの中にいる場合、外部に接続する前にまず要塞ホストにログイン しなければならないでしょう。もちろん、ターゲットホストは要塞ホストも要求 します。マルチホップのファイル名のフォーマットは、通常の TRAMP の メソッドとすこし異なります。

マルチホップのファイル名は、メソッド名、ホップ数、ローカル名(リモート システム上のパス名)を指定します。メソッド名は常に `multi' です。

各ホップは ホップメソッド 指定、つまりユーザ名とホスト名から成り ます。ホップメソッドはインラインメソッドのみになり得ます。以下のホップ メソッドが(今のところ)利用可能です:

`telnet'

ホストへの接続によく知られた telnet プログラムを使用します。 ユーザー名とホスト名はファイル名の中に含まれ、パスワードをたずねられます。

`rsh'

ホストへの接続に rsh を使用します。rsh がパスワード をたずねる時以外は、パスワードを入力する必要はありません。

この変種 `remsh' は remsh コマンドを使います。これは rsh の代わりに remsh が使われるマシン上で使われる べきです。

`ssh'

このメソッドはホストへの接続のために ssh を使用します。パスワード かパスフレーズを入力する必要があります。

`su'

このメソッドは他のホストへまったくアクセスしません。そのかわり、今いる ホスト上で他のユーザーになることができます。これは、root としてファイル を編集したいが、リモートホストはリモートからの root のログインを許可して いない場合に役に立ちます。このような場合、一般ユーザーでのリモートホスト への接続に `telnet'、`rsh' あるいは `ssh' を使う ことができます。それから、root になるために `su' ホップを使います。 `su' は一連のシークエンス中の最後のホップである必要はありません。 必要であればホップ中のどこででも使うことができます。

`su' ホップと一緒にユーザーとホスト両方を指定しなければなりません。 しかしながら、ホスト名は無視されユーザー名だけが使用されます。

`sudo'

これは `su' ホップに似ています。違うユーザーになるために su でなく sudo を使用する点が異なります。

ssh を用いてポートフォワードをしたい場合や、標準的でないポートを 使用しなければならない場合があるかもしれません。そのような場合には、 ホスト名ごとに異なるポート番号を指定した記述を `~/.ssh/config' に 書き込むことで実現できます。しかしながら、マルチホップメソッドを使えば それは TRAMP の枠内で実現することもできます。例えば:

 
(add-to-list
 'tramp-multi-connection-function-alist
 '("sshf" tramp-multi-connect-rlogin "ssh %h -l %u -p 4400%n"))

とすれば、 sshf ホップを用いて、標準的なポートの変わりに 4400 番 ポートへ繋ぐことができます。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.5 デフォルトのメソッドの選択

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Default%20Method"
"tramp/デフォルトのメソッドの選択"へのコメント(無し)
検索全文Elisp

普段よく使う適切な転送メソッドを選択するには、変数 tramp-default-method を設定しなければなりません。この変数には TRAMP ファイル名にメソッドが 指定されなかった時に使用されるデフォルトのメソッドを設定します。 例えば:

 
(setq tramp-default-method "scp")

変数 tramp-default-method-alist を使って特定のユーザ/ホストの 組み合わせに対して異なったメソッドを指定することができます。例えば 次の2行は、ユーザ名が `john' にマッチする場合には `ssh' メソッドを用い、ホスト名が `lily' にマッチする場合には `rsync' メソッドを用います。3行目はマシン `localhost' 上のユーザ`root' に対して `su' メソッドを使うように指定します。

 
(add-to-list 'tramp-default-method-alist '("" "john" "ssh"))
(add-to-list 'tramp-default-method-alist '("lily" "" "rsync"))
(add-to-list 'tramp-default-method-alist
             '("\\`localhost\\'" "\\`root\\'" "su"))

さらなる詳細については変数 tramp-default-method-alist のドキュメント を見て下さい。

一般的には、インライン転送メソッドよりは外部転送メソッドを選ぶべきです。 外部転送メソッドはインラインより高性能です。しかし、外部転送メソッドは、 パスワード入力なしでログインできないリモートマシンがたくさんある場合は 役に立ちません。

See 節 4.2 インラインメソッド. See 節 4.3 外部転送メソッド. See 節 4.4 複数のホップを使いリモートホストに接続する.

転送メソッドの選択をする時に他に考慮すべき事は、それらを使う環境と、 特にインターネット上で使う場合あなたの選択したメソッドのセキュリティ との関係です。

rshtelnet メソッドは、リモートマシンにログイン する時に、パスワードをプレインテキストで送信します。ファイル転送も同じ 方法でおこなうので、他もマシンからファイルの内容を簡単に読むことができます。

インターネットからアクセス可能なリモートシステムに接続する必要がある場合、 接続に ssh ベースのメソッドを使用することを真剣に考えるべきです。 このメソッドは、高いレベルのセキュリティを提供し、誰かがパスワードを入手 したり、編集しているファイルの内容を読んだりすることを困難にします。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.5.1 私はどのメソッドを使うべきか?

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=4.5.1%20私はどのメソッドを使うべきか?"
"tramp/私はどのメソッドを使うべきか?"へのコメント(無し)
検索全文Elisp

ここまでの説明で、これは全くすばらしくて良いものだが、しかしながらメソッド を選ぶ方法については何の助言もされてないよ! と思うことと思います。確かに。 開発者としては、ユーザを牛耳ろうとは思ってなくて、代わりに最大限の自由度を 与えようと考えています。しかしながら実際にはユーザの中には手引きを求める 人も居るでしょう。そこでここではあなたを支配することなく手引きを与えること を試みます。これがうまく行ったか教えて下さいね ...

私の提案は、インラインメソッドを使うことです。大きなファイルに対しては out-of-band メソッドの方が有効かもしれませんが、ほとんどの人は小さな ファイルを編集したいと思うと推測します。

今日では、ほとんどの人がリモートマシンに ssh を使ってアクセス できると推測します。したがって ssh メソッドを使うことを提案します。 つまり、他のホストの `/etc/motd' ファイルを編集するためには C-x C-f /ssh:root@otherhost:/etc/motd RET と入力すればよい です。

もし、ssh を使ってリモートホストにログインできないなら、動作する プログラムを使うメソッドを選択します。例えば Windows ユーザは ssh の PuTTY 実装を使う plink メソッドを好むかもしれません。また、 Kerberos を使っているなら krlogin を好むでしょう。

特別な場合としてローカルホストのファイルを別のユーザとして編集したい場合 には su メソッドもしくは sudo メソッドを参照して下さい。

大きなファイルを編集する人は ssh の代わりに scp 、もしくは plink の代わりに pscp の利用を考えるかもしれません。 これらの out-of-band メソッドは大きなファイルに対してはインラインメソッド よりも高速です。しかし、out-of-band メソッドたちはいくつかの制限 を受けるかもしれないことに注意して下さい。最初に本当に顕著な速度的な 優位を out-of-band メソッドで得られるか試して下さい!おそらく大きなファイル に対してもインラインメソッドたちは十分高速だと思います。

私がインラインメソッドの利用を提案する理由は、それらはリモート側が パスワードを聞いてきたとしても動作するからです。out-of-band メソッド はそのような状況では動作しません。また、マルチホップメソッドたちは 本質的にインラインです。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.6 非標準のメソッドを使う

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Customizing%20Methods"
"tramp/非標準のメソッドを使う"へのコメント(無し)
検索全文Elisp

事前に定義されたメソッドだけでは不十分な場合に、それを変更するための tramp-methods という変数があります。

変更が必要になった時のために、この変数の Lisp ドキュメントについて述べて おきます。ドキュメントは C-h v tramp-methods RET で参照する ことができます。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.7 ユーザ/ホスト名補完のための設定ファイルの選択

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Customizing%20Completion"
"tramp/ユーザ/ホスト名補完のための設定ファイルの選択"へのコメント(無し)
検索全文Elisp

変数 tramp-completion-function-alist は、ユーザ名とホスト名の 補完 (see 節 5.3 ファイル名補完) の際にどのファイルたちを考慮に入れ るかをカスタマイズするためにあります。この変数は各々のメソッドに対して、 設定ファイルの集合とそのファイルをパースできる Lisp 関数との組を保持し ます。tramp-completion-function-alist のエントリは (method pair1 pair2 ...) の形式をとります。

それぞれの pair は (function file) から成ります。 function は補完の際に file からユーザ名とホスト名を取り出 すのに使われます。この変数にアクセスする二つの関数があります:

Function: tramp-get-completion-function method
この関数は method に対する補完関数のリストを返します。

Example:
 
(tramp-get-completion-function "rsh")

     => ((tramp-parse-rhosts "/etc/hosts.equiv")
         (tramp-parse-rhosts "~/.rhosts"))

Function: tramp-set-completion-function method function-list
この関数は method に対する補完関数のリストを function-list に設定します。

Example:
 
(tramp-set-completion-function "ssh"
 '((tramp-parse-sconfig "/etc/ssh_config")
   (tramp-parse-sconfig "~/.ssh/config")))

     => ((tramp-parse-sconfig "/etc/ssh_config")
         (tramp-parse-sconfig "~/.ssh/config"))

設定ファイルをパースするための以下の関数があらかじめ定義されています:

tramp-parse-rhosts

この関数は構文的に `~/.rhosts' と等価なファイルをパースします。もし 書かれていればホスト名とユーザ名の両方を返します。

tramp-parse-shosts

この関数は構文的に `~/.ssh/known_hosts' と等価なファイルをパースします。 そのファイルにはユーザ名は書かれていないのでホスト名のみを返します。

tramp-parse-sconfig

この関数は `~/.ssh/config' 形式のファイルの Host エントリで 定義されたホストのあだなを返します。

tramp-parse-hosts

`/etc/hosts' 形式のファイルのための関数です。ホスト名のみを返します。

tramp-parse-passwd

`/etc/passwd' のようなファイルをパースする関数です。当然ながらユーザ 名のみを返します。

tramp-parse-netrc

最後に、これは `~/.netrc' のようなファイルをパースする関数です。

もし独自のデータを独自の構造でファイルに保持したいなら、このような関数 を提供すればよいです。この関数は以下の慣習に合致する必要があります。

Function: my-tramp-parse file
file はあなたのホストにあるファイル名もしくは nil のいずれか です。この関数は (user host) のリストを返さねばなりません。 それらはユーザ/ホスト名補完の候補として使われます。

Example:
 
(my-tramp-parse "~/.my-tramp-hosts")

     => ((nil "toto") ("daniel" "melancholia"))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.8 リモートマシン上で TRAMP がプログラムを発見、使用する方法

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Remote%20Programs"
"tramp/リモートマシン上でTRAMPがプログラムを発見、使用する方法"へのコメント(無し)
検索全文Elisp

TRAMP はリモートホスト上のいくつかのプログラム、lstestfind そして cat に依存しています。

これらのツールにくわえ、コネクションメソッドのためにいくつかのツールが 必要です。詳細は 4.2 インラインメソッド4.3 外部転送メソッド を参照してください。

いくつかの他のツール、perl (あるいは perl5) と grep が存在すればそれらも使用されます。これは、性能と リモートファイルアクセスの正確さの向上のためです。

TRAMP はリモートマシンに接続した時に、使用可能プログラムを検索します。 変数 tramp-remote-path は、リモートマシン上で検索されるディレクトリ を制御します。

デフォルトで多くのマシンにとって適切なパスが設定されています。しかし ながら、ローカル(あるいはリモート)システムの管理者が、必要なツールを へんぴなディレクトリにインストールしているかもしれません。

このような場合でも TRAMP を使う事ができます。単に、必要なディレクトリ をリモートパスに追加するコードを `.emacs' に書くだけです。これで 接続時に TRAMP により、追加したディレクトリが検索されプログラムが 発見されます。

リモートサーチパスにディレクトリを追加するためには、以下のような コードを使ってください:

 
;; 変数を定義するために TRAMP をロードする
(require 'tramp)
;; perl が "/usr/local/perl/bin" にある
(add-to-list 'tramp-remote-path "/usr/local/perl/bin")



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.9 リモートシェルの設定のヒント

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Remote%20shell%20setup"
"tramp/リモートシェルの設定のヒント"へのコメント(無し)
検索全文Elisp

1. TRAMP の概要 の節で説明したように、TRAMP はリモートホストに接続し、 そこにあるシェルと対話します。もちろんログインする際にはシェルはその 初期化ファイルを実行します。例えばあなたの初期化ファイルがあなたのお母 さんの誕生日を入力させるようになっていたとしましょう; 当然 TRAMP はそのことを知らないので、そのホストへのログインに失敗します。

この問題を追求するために、いくつかの戦略が考えられます。一つは、TRAMP がすべての可能な状況に対応できるようにすることです。これは消耗戦です。 何故なら 全ての 状況を扱うことは不可能だからです。別の手として、 TRAMP の期待通りに振る舞うように、あなたにリモートホストの設定をして いただくということも出来ます。しかしこれは不便かもしれません。何故なら TRAMP を使い始めるより先に、シェルの設定に多くの労力を割く必要がある のですから。

そのことから、このパッケージではそれらを組み合わせた方法をとります。 いくつかのありふれた設定については理解しようとしてくれて、あなたには 本当に特異な設定だけを避けるように求めます。例えば、リモートホスト上で あるプログラムを見つけるためには、ディレクトリの一覧を調べます。 そしてまた、ファイルが存在するかをどうか調べる方法というのも明らかでは ないので、いくつかの異なる可能性を試してくれます。 (あるホストとシェルにおいては、test -e コマンドがその役目を果たす。 別のホスト、シェルに対してはシェルの組み込みコマンドは働かないが、 /usr/bin/test -e/bin/test -e ならうまく働く。 そしてさらに別のホストでは ls -d がその方法として働く。)

以下では、TRAMP が取り扱ってくれない、つまりあなたが正しく設定する必要 のあるいくつかの事柄について述べます。

shell-prompt-pattern

リモートホストにログインした後、TRAMP がリモートシェルに命令を送れる ようになる前に、リモートシェルのセットアップが終了するのを待つ必要があり ます。シェルプロンプトを認識する為に、変数 shell-prompt-pattern をリモートホストのシェルプロンプトを認識出来るように設定しておく必要が あります。

TRAMP は shell-prompt-pattern に対してバッファ末尾でマッチす ることを要求することに注意して下さい。多くの人はこの変数の値として次の ようなものを指定しています: "^[^>$][>$] *"。ここであなたのシェル プロンプトが a <b> c $ のようなものだったとしましょう。この場合、 TRAMP は文字> をプロンプトの終端と認識しますが、それはバッファ の終端にはありません。

tramp-shell-prompt-pattern

この正規表現は shell-prompt-pattern と同様にリモートシェルの プロンプトにマッチするものとして使われます。この二つ目の変数はリモート シェルのプロンプトがローカルシェルと異なる可能性があるので存在します。 とにかく TRAMP の要点はリモートホストに別のユーザとしてログインする ことです。tramp-shell-prompt-pattern のデフォルトの値は shell-prompt-pattern のデフォルト値と同一のものですが、多くの状況 でそれはうまく働くと報告されています。

tset とその他の質問

シェルの起動スクリプトから tset プログラムを呼び出し、 シェルの端末の種類を尋ねるようにしている場合があります。たぶん シェルによってはその他の質問を起動時にしてくる場合もあるでしょう。 TRAMP はこれらの質問に答える方法を知りません。この問題を扱うには 二つのアプローチがあります。一つのアプローチは、シェルが TRAMP から 呼び出されたときに何の質問もしないようにしておくことです。そのためには 環境変数 TERM を調べて下さい。それは接続時に dumb に設定 されます。

変数 tramp-terminal-type によりこの値を dumb に変更する ことができます。

別のアプローチは TRAMP にこれらの質問を教えておくことです。変数 tramp-actions-before-shell および tramp-multi-actions (マルチホップ接続の場合) を参照して下さい。

`.profile' 中の環境変数で、ユーザと同じ名前のものたち

frumple という名前のユーザが居たとして、変数 FRUMPLE をシェル環境 で設定している場合、不具合が起きるかもしれません。 FRUMPLE_DIR とかそのようなものに改名するのがよいでしょう。

奇妙な効果が実際に TRAMP ユーザから報告されています!

`.profile' 中の Non-Bourne コマンドたち

リモートホストにログインした後、TRAMP はコマンド exec /bin/sh を発行します。 (実際にはコマンドはちょっと異なりますが。) /bin/sh が実行される時に、いくつかの初期化ファイルが読み込まれます。 例えば `~/.shrc' や `~/.profile' です。

ここで、ログインシェルが /bin/sh ではなく、 bash や ksh といった Bourne 的なシェルであった場合、人によっては ~/.shrc~/.profile. にシェルの設定を書いているかもしれません。その場合に、Bourne でない構成物 がそれらのファイルに書かれている可能性があります。そうすると、exec /bin/sh によって Bourne シェルはそれらを戻してしまいます。

例えば `~/.profile' ファイルに export FOO=bar と書いてあった とすると、標準的な Bourne シェルはこの構文を理解できないので、この行に 到達するとシンタックスエラーを返します。

別の例としてはチルダ (~) 文字があります。例えば $PATH に `~/bin' を付け加える場合です。 多くの Bourne シェルはこの文字を展開 せず、普通は名前がチルダ一文字のディレクトリは存在しないのでおかしなこと が起こるでしょう。

これに対して何をすればよいのか?

一つの方法としては全てのリモートホスト上の `~/.shrc' と `~/.profile' の中の全てが Bourne-互換であるようにすることです。 上の例では、export FOO=bar の代わりに FOO=bar; export FOO と書けばよいでしょう。

別の方法としては、non-Bourne シェルの設定を別のファイルに書くことです。 例えば、bash はファイル `~/.bash_profile' があれば `~/.profile' の代わりにそれを読み込みます。したがって bash ファンは全てのリモートホスト 上の `~/.profile' を `~/.bash_profile' に改名しておけば大丈夫です。

TRAMP の開発者はこの問題を回避したいと考えています。したがってこれに 関するアイデアがあればぜひ教えて下さい。しかしながら、これはそう単純では ないと考えています: exec /bin/sh と呼ぶ前には、TRAMP はどの 種類のシェルと対話しているのか知らないのです。それは ksh や bash といった Bourne 的なシェルであるかもしれませんし、csh から派生した tcsh のような ものかもしれません。もしくは zsh や、はたまた rc であるかもしれません。 もしシェルがすでに Bourne 的なものであるなら exec /bin/sh の段階を 省略するのが懸命かもしれません。しかし、どうやってシェルが Bourne 的だと 知るのでしょうか?



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.10 Auto-save とバックアップの設定

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Auto-save%20and%20Backup"
"tramp/Auto-saveとバックアップの設定"へのコメント(無し)
検索全文Elisp

auto-save の説明は未完成です。

通常 Emacs はオリジナルのファイルと同じディレクトリにバックアップファ イルを保存しますが、この挙動は変数 backup-directory-alist を通 して変更することができます。TRAMP を用いた接続においてこのことは予 期しない副作用をもたらす可能性があります。例えば全てのバックアップがデ ィレクトリ `~/.emacs.d/backups/' に行くようになっていたとして、フ ァイル `/su:root@localhost:/etc/secretfile' を編集したとしましょ う。その結果は、バックアップファイルは root ではなくあなたの所有となり、 したがってたとえそのつもりがなかったとしてもそれが他者から見てしまう可 能性があります。

backup-directory-alist が nil (デフォルト) であればそのような問 題はおこりません。

もしあなたがその変数をカスタマイズしたいなら、TRAMP のファイルに対 して特別な設定を行なうという回避法があります。例えば以下の記述により、 TRAMP のファイルに対して効果的に backup-directory-alist の効 果を消します:

 
(require 'tramp)
(add-to-list 'backup-directory-alist
             (cons tramp-file-name-regexp nil))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.11 Cygwin ssh にまつわる事柄

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=tramp&node=Windows%20setup%20hints"
"tramp/Cygwinsshにまつわる事柄"へのコメント(無し)
検索全文Elisp

この節はたくさんの仕事が必要です! どうか手伝って下さい。

もしあなたが Cygwin でインストールした ssh (インストーラで明示的に選択 する必要があります) を使っているなら、接続メソッドとして sshx を 選択するだけでマシンの外に出られるはずです。Cygwin のセットアップに ついての情報は http://cygwin.com/faq/ にある彼らの FAQ で得る ことができます。

もし scpx 接続メソッドを使いたいと思ったなら、Emacs が c:/foo のような Windows ファイル名を伴なって scp を呼ぶ時に問題が起きる かもしれません。Cygwin 版の scp は Windows ファイル名について知ら ないので、それをホスト c 上のリモートファイル名と解釈してしまいます。

一つの可能な回避法としては、Windows ファイル名を Cygwin のファイル名に 変換するラッパースクリプトを書くことです。

別の回避法としては Emacs を Cygwin 上で動かすか、もしくは Cygwin 版の Emacs を使うことがあると思います。

何らかの ssh に基づくメソッドを Windows 上で使いたい場合、 ssh-agent に関する問題に遭遇するかもしれません。このプログラム を使うと、ログインの際に毎回パスフレーズを入力することを避けることが できます (また、scpx メソッドは ssh-agent を使うことを 要求します。なぜならそれはパスワードやパスフレーズを入力させてくれない からです)。しかしながら、Emacs をデスクトップショートカットから起動した なら、環境変数 SSH_AUTH_SOCK は設定されないので、 Emacs そして TRAMP、 そして TRAMP から起動される ssh および scpssh-agent と通信することができません。Emacs をシェルから起動 すればうまく動きます。

もし誰か Windows 上でデスクトップショートカットが恩恵を受けられるような、 ssh-agent の起動方法を知っていたら叫んで下さい。私は本当に Windows については何も知らないのです...


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]