このファイルは tramp version 2.1.8 について説明します。 tramp は GNU Emacs にリモートファイルの編集機能を提供する パッケージです。
tramp は `Transparent Remote (file) Access, Multiple Protocol' の略称です。このパッケージは Ange-FTP のような リモートファイルの編集機能を提供します。
異なる点はファイルの転送方法です。Ange-FTP は、 ローカルホストとリモートホスト間のファイル転送に FTP を使用します。 一方 tramp は、rsh と rcp あるいは他の同じよう な働きをするプログラム、例えば ssh や scpを使用し ます。
このドキュメントの最新バージョンは web サイト http://www.freesoftware.fsf.org/tramp/ にあります。
The manual has been generated for GNU Emacs. If you're using the other Emacs flavour, you should read the XEmacs pages.
このマニュアルには 日本語訳が存在します。
[訳注: そう、あなたが読んでいる、これが日本語訳です :-)]
最新の tramp は download にあります。詳細は Obtaining Tramp を参照してください。 CVS サーバーについての説明もあります。
また、 Savannah Project Page にも tramp の情報があります。
trampのためのメーリングリスト tramp-devel@mail.freesoftware.fsf.org, が存在します。アーカイブは通常の Savannah アーカイブと同じ場所と、 http://www.mail-archive.com/emacs-rcp@ls6.cs.uni-dortmund.de/ にあります。
Copyright © 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover texts being “A GNU Manual”, and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License” in the Emacs manual.(a) The FSF's Back-Cover Text is: “You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.”
This document is part of a collection distributed under the GNU Free Documentation License. If you want to distribute this document separately from the collection, you can do so by adding a copy of the license to the document, as described in section 6 of the license.
エンドユーザー向け:
開発者向け:
--- 詳細なノードの一覧 ---
あなたの GNU Emacs に tramp を導入する
tramp'} の設定
tramp'} の使い方
リモートバージョンコントロールの内部動作
その他バージョン管理システムに関係する事
ファイル名、ディレクトリ、ローカル名がどのように変換され(mangled)、管理されるか
GNU Emacs に tramp をインストールすると、リモートマシン上 のファイルにローカルファイルと同じような感覚でアクセスできます。 リモートファイルシステム上のファイルの編集、バージョンコントロール、 dired を透過的に実行することができます。
リモートマシンへのアクセスには、rsh や rlogin、 telnet コマンド、あるいはこれらに類似した接続方法を使用 します。これらのコマンドは ASCII を通過させることが可能でなければ なりませんが、8-bit クリーンである必要はありません。
このパッケージは別のマシンへの ssh 接続をサポートします。 これは、このパッケージのもっとも一般的な使い方のひとつです。特に ftpアクセスが許可されていない場合にも、他のマシンへの 比較的セキュアなアクセスが可能となります。
tramp によって実行されるアクティビティのほとんどは、リモート ログインが可能で、端末上で実行できることだけを要求します。リモート ファイルにアクセスするために、tramp はファイルの内容を一時的 にローカルマシンに転送します。
tramp は、さまざまな方法でマシン間のファイル転送をおこないます。 転送方法は簡単に選択でき、あなたのニーズとマシン環境に応じて使い わける事ができます。
(大きなファイルに対して)もっとも速い転送メソッドは、リモートファイルの 転送パッケージ、たとえば rcp、scp、rsync を使うものです。これらのメソッドは、ファイルのコピーコマンドがリモート マシンのパスワードをたずねない場合にのみ有効です。
もし、リモートコピーメソッドが使えない場合のために、tramp は、 シェルを直接利用した符号化転送方法をサポートしています。この方法を使う ためには、mimencode か uuencode がリモートマシン 上に存在しなければなりません。これらは一般に小さなファイルに対して速い 方法です。
上記の制限内であれば、tramp は非常にパワフルです。ただし、注意して おかなければならないのは、現在の tramp は、エンドユーザー向けの洗練 された製品とはほど遠い状態であるということです。もうしばらくの間は、時々 ちょっと困った事になったり、コードに問題があるかもしれないということを 念頭においておいてください。
すでに開発者が日々の作業に使う事ができる程度には安定しています。しかし、 インストールと設定を覚えるのは、専門用語のせいで若干難しいでしょう。
tramp は、まだアクティブに開発をしている最中です。したがって、どんな 些細な問題であっても、ぜひ tramp 開発者に報告してください。 See Bug Reports.
このセクションでは、tramp を使いリモートファイルにアクセスした時に、 舞台の裏側で何がおこっているかを説明します。
C-x C-f とタイプし、tramp のファイル名の一部を入力します。 それから、ファイル名の補完のために <TAB> を押します。これ がそのホストに対する初めての tramp の起動の場合、以下のような事 がおこります。
パスワードかパスフレーズを入力すると、tramp はそれをリモートホスト に送信し、次に改行を送信します。
もし、tramp が、一定時間(たとえば一分)待っても、これらのメッセージを 発見することができなかったら、リモートシェルのプロンプトを発見できなかっ た旨のメッセージを出力し、リモートホストから送信されたメッセージを表示 します。
もし、tramp が `login failed' というメッセージを発見したら、それを 表示し、ログインを中止します。これで再びログインを試みることができます。
Bourne シェルが起動されたら、tramp は確実に動作する環境を準備するため にいくつかのコマンドを送信します。echo をオフにし、シェルプロンプトを設定 したり、その他いくつかの事をおこないます。
tramp は cd と ls コマンド、そして時々 globbing された echo を実行します。これ以外に、ファイルが書き込み可能 かどうか、ディレクトリかどうか等を調べるために test が、しば しば使用されます。オペレーションをおこなうために、すべてのコマンドの出 力はパースされます。
tramp がどのようにファイルの内容を転送するのかという説明は、上を見て ください。
インライン転送のために、tramp は `mimencode -b /path/to/remote/file' のようなコマンドを実行し、出力がコミュニケーションのためのバッファに 蓄積されるまで待ちます。そして、ファイルの中身を作成するために、出力を 復号化します。
out-of-band 転送のために、tramp は以下のようなコマンドを実行します:
rcp user@host:/path/to/remote/file /tmp/tramp.4711
そして、ローカルな一時ファイル /tmp/tramp.4711 をバッファに読み 込み、一時ファイルを削除します。
この説明で、tramp を使いファイルをオープンした時に舞台裏でおこっている 事をわかってもらえることを願っています。
tramp は、インターネット上でフリーに配布されています。最新版は http://savannah.nongnu.org/download/tramp/ からダウンロード可能です。この中には、インストールに必要な tramp のすべてのドキュメントとソースコードが含まれています。しかし、Emacs (21.4 かそれ以降のもの) は、tramp を含んでおり、XEmacs にも tramp のパッケージがあります。したがって、それらを使う方がたぶん簡単でしょう。 しかし、もし最新の開発版を求めるのであれば、続きを読んで下さい......
冒険家のために tramp は CVS からも入手可能です。CVS から入手した バージョンはソースコードの最新バージョンです。したがって、不完全な 機能や新たな問題をかかえているかもしれません。このバージョンは自分 の責任で使用してください。
tramp の最新の開発バージョンを CVS から入手する方法は、以下に示す Savannah プロジェクトページに行って一番上のナビゲーションバーにある CVS のリンクをクリックすれば見ることが出来ます。
http://savannah.gnu.org/projects/tramp/
もしくは、以下のセッションの例に従って下さい。
] cd ~/emacs ] cvs -d:pserver:anoncvs@subversions.gnu.org:/cvsroot/tramp login CVS password: (just hit RET here) ... ] cvs -z3 -d:pserver:anoncvs@subversions.gnu.org:/cvsroot/tramp co tramp
これで、tramp の最新バージョンが含まれるディレクトリ ~/emacs/tramp が作成されるはずです。以下のコマンドを実行することにより、最新のバージョン に更新することができます:
] cd ~/emacs/tramp ] cvs update -d
CVS リポジトリからファイルを更新したら、新しい configure スクリプト を生成するために autoconf を実行する必要があります:
] cd ~/emacs/tramp ] autoconf
tramp の開発は 1998 年の 11月下旬に始まりました。その当時は、この パッケージは rssh.el と呼ばれていました。ファイルにアクセスするため のたったひとつのメソッドがあるだけで、ssh を使用しリモート ホストにログインし、scp でファイルの内容を転送していました。 しばらくして、名前が rcp.el に変わり、今は tramp と呼ばれています。 これに伴い、リモートシェルを起動しファイルの内容を転送する多くのメソッド が追加されました。また、VC サポートも追加されました。
もっとも最近の大きな機能追加は、2000年4月のマルチホップメソッドの追加と、 2002年7月の tramp におけるファイル名と Ange-FTP におけるファイル名の 統一です。
If you use the version that comes with your GNU Emacs, the following information is not necessary. Installing tramp into your GNU Emacs is a relatively easy process, at least compared to rebuilding your machine from scratch. ;)
Seriously though, the installation should be a fairly simple matter. The easiest way to proceed is as follows:
ln -s tramp-2.1.8 tramp
Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for.
dired
(C-x d) mode,
at ~/emacs/tramp/lisp. Mark the lisp files with
m, then press B to byte compile your selections.
Something similar can be done to create the info manual. Just change to directory ~/emacs/tramp/texi and load the tramp.texi file in GNU Emacs. Then press M-x texinfo-format-buffer <RET> to generate ~/emacs/tramp/info/tramp.
There are some Lisp packages which are not contained in older GNU Emacsen by default yet. In order to make a link for them into Tramp's contrib directory, you must use the --with-contrib option:
./configure --with-contrib
By default, make install will install tramp's files in /usr/local/share/emacs/site-lisp and /usr/local/share/info. You can specify an installation prefix other than /usr/local by giving configure the option --prefix=PATH. On GNU/Linux systems, it has been reported useful to apply
./configure --prefix=/usr
If your installed copy of GNU Emacs is named something other than emacs, you will need to tell `make' where to find it so that it can correctly byte-compile the tramp sources.
For example, to force the use of XEmacs you might do this:
./configure --with-xemacs
You can even pass the GNU Emacs or XEmacs command to be called:
./configure --with-xemacs=xemacs21
The syntax of tramp file names is different for GNU Emacs and XEmacs. The Info manual will be generated for the Emacs flavor choosen in the configure phase. If you want the Info manual for the other version, you need to set the variable EMACS_INFO to make:
./configure --with-emacs make EMACS_INFO=xemacs
Also, the --prefix=PATH option to configure may not be general enough to set the paths you want. If not, you can declare the directories Lisp and Info files should be installed.
For example, to put the Lisp files in ~/elisp and the Info file in ~/info, you would type:
./configure --with-lispdir=$HOME/elisp --infodir=$HOME/info
On MS Windows, given Emacs is installed at C:/Program Files/Emacs, you should apply
./configure --with-lispdir='C:/Program Files/Emacs/site-lisp' \ --infodir='C:/Program Files/Emacs/info'
make supports the DESTDIR variable for staged installation; see Command Variables:
make DESTDIR=/tmp install
Running configure might result in errors or warnings. The output explains in detail what's going wrong.
In case of errors, it is mandatory to fix them before continuation. This can be missing or wrong versions of emacs, GNU Emacs packages, make, or makeinfo.
Warnings let configure (and the whole installation process) continue, but parts of Tramp aren't installed. This can happen with missing or wrong versions of texi2dvi or install-info. Here you can decide yourself whether you want to renounce on the related feature (tramp.dvi file for printed output, Tramp entry in Info's dir file), or whether you want to adapt your $PATH environment variable, and rerun configure. An alternative is calling the missed parts manually later on.
If you don't install tramp into the intended directories, but prefer to use from the source directory, you need to add the following lines into your .emacs:
(add-to-list 'load-path "~/emacs/tramp/lisp/") (require 'tramp)
If the environment variable INFOPATH is set, add the directory
~/emacs/tramp/info/ to it. Else, add the directory to
Info-default-directory-list
, as follows:
(add-to-list 'Info-default-directory-list "~/emacs/tramp/info/")
Thanks to Yoichi Nakayama yoichi@geiin.org, there exists a japanese translation of the tramp manual. You can generate it applying the --with-japanese-manual option:
./configure --with-japanese-manual
This will result in an Info manual tramp_ja.
tramp は(通常)インストールするだけで完全に機能します。初期状態では、 リモートホストへの接続に ssh プログラムを使用し、base64 エン コーディングもしくは uu エンコーディングを使用するように設定されていま す。 従って最も簡単な場合には C-x C-f と打ち込んでファイル名 /user@machine:/path/to.file. を入力するだけです。
ホストによっては、接続を確立するのに問題が起きることがあります。これは、 remote shell の振る舞いによるものです。この詳細については See Remote shell setup, を参照してください。
もし、リモートホストとの接続にこれらのコマンドを使用したくない場合は、 tramp のデフォルトの接続と転送メソッドを変更してください。リモート マシンに接続しファイルを転送するのに使うことのできる tramp のメソッド がいくつかあります (see Connection types)。
どのメソッドがふさわしいかわからないなら次を見て下さい: See Default Method.
転送メソッドには二つの基本的なタイプがあり、それぞれに長所、短所が あります。両者ともに、rsh や ssh、telnet のようなリモートシェルにアクセスするプログラムを使用し、リモートマシン に接続します。
このコネクションは、tramp がローカルマシンからリモートマシンへ透過的 にアクセスするために、さまざまなオペレーションをおこなうために使われます。 ファイルをオープンした時のメソッドが異なるだけです。
リモートファイルを読み込んだり、保存する時には、二つのマシン間でファイル の内容を転送する必要があります。ファイルの内容は、マシンにログインしたの と同じコネクションか、rcp や scp、rsync などのリモートコピープログラムを使用した別のコネクションで転送されます。 前者は インラインメソッド、後者は out-of-band メソッド あるいは 外部転送メソッド (略して 外部メソッド) とよばれます。
少なくとも大きなファイルに対しては、一般に外部転送メソッドの性能は インラインメソッドよりすぐれています。その理由は、インライン転送では データの符号化、復号化をおこなう必要があるからです。
このルールの唯一の例外は、scp を使用する転送メソッドです。 これらのメソッドの実際のファイル転送の性能は高いのですが、転送開始時 の暗号化にかかわるネゴシエーションのオーバーヘッドがファイル転送の性能 を帳消しにします。
外部転送メソッドを使うためには、リモートコピーコマンドが対話的でない、 つまりコマンドがパスワードのためにプロンプトを出力しないことが必要です。 もし、パスワード入力なしのリモートコピーコマンドを使う事ができないので あれば、インラインメソッドを使う必要があります。
インラインメソッドの一種に、マルチホップメソッド があります。 このメソッドを使うと、いくつかのホップを使い、リモートホストへ接続 できます。これは、あなたがセキュアなネットワークの中にいて、要塞ホスト を経由して外部に接続する場合に便利です。
tramp のインラインメソッドは大変強力で、外部転送メソッドを使う事が できない状況でも動作します。インラインメソッドは、telnet 経由でリモート マシンに接続している時に動作する唯一のメソッドです(ホスト間でなく ユーザー 間のファイル転送を可能にする、ちょっと変わったメソッド もあります。以下を参照してください)。
これらのメソッドを使うためには、符号化、復号化のためのコマンドがリモート マシン上に存在しなければなりません。ローカルマシン上では、tramp は ファイルを復号化、符号化する Emacs の機能を使うか、外部コマンドを使用 します。
tramp は、リモートホストにおいて mimencode (metamail パッケージの一部) や uuencode といった コマンドの存在と、それが使えるかどうかを調べます。最初の信頼できるコマンドが 使われます。検索パスをカスタマイズすることができます。Remote Programs を参照して下さい。
もしどちらのコマンドもリモートホストに無かった場合、 tramp は小さな Perl のコードをリモートホストに転送し、それをエンコードやデコードに用い ようとします。
rsh の代わりに remsh コマンドを提供するオペレーテ
ィングシステムではメソッド remsh を使うこともできます。例えば
HP-UX や Cray UNICOS の場合があてはまります。
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
を渡すということです。
そのユーザーでシェルを起動できるように、sudo が設定されていな
ければならないことに注意してください。ls と mimedecode
の起動の許可だけで十分であればよいのですが、そのように実装するのは簡単では
なく、まだ無理です。
この手続きは ssh 自身からの質問を排除しないことに注意して下 さい。例えばリモートホストのホスト鍵が未知の物である場合に、“Are you sure you want to continue connecting?” と ssh が訊いてくる かもしれません。tramp は(今のところ)そのような質問を扱う方法を知ら ないので、そのような質問をされないでログインできるようにしておく必要が あります。
この手順は、 ssh を Emacs バッファから呼ぶと pseudo tty を割 り当ててないと言われてしまう Windows ユーザにとっても有用です。この時、 ログインシェルはシェルプロンプトを一切表示しようとしなくて、それは tramp を大変混乱させてしまいます。未知の理由により、いくつかの ssh の Windows への移植版(たぶん Cygwin のものも)は `-t' オプションを二つ重ねて使うことを要求します。
これは `-p' クルージをサポートします。
さらにメソッド plink1 が提供されます。それは 明示的に SSH プロトコルバージョン 1 を使うために `plink -1 -ssh' を呼び出します。
CCC: SSH key を受理するためにコマンドラインからリモートホストへ繋ぐ必要は あるのか? これは自動化できないか?
CCC: plink は `-p' オプションをサポートしているか? いずれに せよ tramp はそれをサポートする。
外部転送メソッドは複数のチャネルを使用します。オペレーションのために リモートシェルのコネクションを使い、ファイル転送には、外部プログラム を使います。
これは、インライン転送時の、ひとつのコネクションを使った多重化転送のため の符号化、復号化のオーバーヘッドを削減します。
外部転送メソッドを使いたい場合は、ファイルをコピーするための転送ユーティ リティが、パスワード入力なしで実行できなければなりません。
つまり、scp を使う場合や、使っている scp がコマンド ラインでパスワードを受け付けるバージョンの場合には、ssh-agent を使う必要があるということです。2 ssh 経由で rsync を使う場合も同様です。
もし、パスワード入力なしで scp を実行することができないが、 コネクションをセキュアにするために ssh を使いたい場合は、 ssh ベースのインラインメソッドを参照してください。
もう一つ別のメソッド remcp では remsh コマンドと
rcp コマンドを使います。これは rsh の代わりに
remsh が使われるマシン上で使われるべきです。
このオプションの性能も優れています。しかし、小さいファイルのオープン、 クローズを頻繁に繰り返す場合はインラインメソッドより遅くなります。 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 は scp より高性能です。この利点は、ファイルが片側のホストに しかない場合には失なわれます。
リモートシステムへ書き込む場合、rsync ベースのメソッドは rcp ベースのメソッドよりかなり速いでしょう。しかし、ローカル マシンのファイルを読み込む場合は、直接コピーするより速くありません。
このメソッドは `-p' ハックをサポートします。
この手順は Windows ユーザにとって ssh を Emacs バッファから 呼ぶと pseudo tty を割り当ててないと言われてしまう場合にも有用です。 この時ログインシェルはシェルプロンプトを一切表示しないために tramp は大変混乱してしまいます。たぶんこれは Cygwin に移植されたSSH の場合に 当てはまります。
このメソッドは `-p' ハックをサポートします。
CCC: plink は `-p' ハックをサポートしているか?
このメソッドはコマンド `fsh host -l user /bin/sh -i' を使って接続を確立します。単に fsh host -l user としただけでは動きません。
fsh プログラムが提供する多重化は我々の文脈ではそれほど有用で
はないので、それを用いるインラインメソッドは存在しません。その代わり
tramp は単にリモートホストへの一つの接続を開き、その接続を保持します。
ローカル名の先頭のディレクトリはリモートホストでの共有名でなければなり
ません。通常デフォルトの共有の終端は文字 $
ですが、ファイル名の
環境変数による展開のため、それを $$
と書く必要があることを憶えて
おいて下さい。もし、共有名が与えられなければ(すなわちリモートディレクトリ
が /
の場合)、全ての利用可能な共有たちが表示されます。
認可は共有レベルでなされているので、同じホストであっても別の共有にアク セスすると必ずパスワードを求められます。セキュリティ上の理由からパスワ ードはキャッシュされません。
MS Windows は認可のためにユーザ名とドメイン名の両方を用います。このた
め、tramp 構文は拡張されました: ユーザ名を指定する際に user%domain
(実ユーザ名、パーセント記号、ドメイン名)のように書くことができます。
したがって、マシン melancholia
にドメイン BIZARRE
のユーザ
daniel
として接続して、ホームディレクトリ (共有 daniel$
)
にある .emacs を編集する場合、ファイル名を
/smb{No value for `postfixsinglehop'}daniel%BIZARRE@melancholia:/daniel$$/.emacs
と指定します。
ドメイン名やユーザ名は付けないこともできます。もしユーザ名が指定されな ければ匿名ユーザ(パスワード入力の必要がない)が仮定されます。これは他の 全ての tramp メソッドと異なります。他のメソッドで同じ状況の場合には ローカルユーザ名が使われます。
smb メソッドは `-p' ハックをサポートします。
注意して下さい: もし Emacs がローカルの MS Windows の下で動い ているならばこのメソッドは利用できません。その代わりに、 //melancholia/daniel$$/.emacs のような UNC ファイル名を使うこと ができます。唯一の欠点は他のユーザ名を指定するための方法が無いことです。
これまでに説明したメソッドでは不十分な事があります。シンプルなメソッドを 使ってリモートホストに接続できないことがあります。たとえば、セキュアな ネットワークの中にいる場合、外部に接続する前にまず要塞ホストにログイン しなければならないでしょう。もちろん、ターゲットホストは要塞ホストも要求 します。マルチホップのファイル名のフォーマットは、通常の tramp の メソッドとすこし異なります。
マルチホップのファイル名は、メソッド名、ホップ数、ローカル名(リモート システム上のパス名)を指定します。メソッド名は常に multi です。
各ホップは ホップメソッド 指定、つまりユーザ名とホスト名から成り ます。ホップメソッドはインラインメソッドのみになり得ます。以下のホップ メソッドが(今のところ)利用可能です:
この変種 remsh は remsh コマンドを使います。これは
rsh の代わりに remsh が使われるマシン上で使われる
べきです。
su ホップと一緒にユーザーとホスト両方を指定しなければなりません。
しかしながら、ホスト名は無視されユーザー名だけが使用されます。
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 番
ポートへ繋ぐことができます。
普段よく使う適切な転送メソッドを選択するには、変数 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 Inline methods. See External transfer methods. See Multi-hop Methods.
転送メソッドの選択をする時に他に考慮すべき事は、それらを使う環境と、 特にインターネット上で使う場合あなたの選択したメソッドのセキュリティ との関係です。
rsh と telnet メソッドは、リモートマシンにログイン する時に、パスワードをプレインテキストで送信します。ファイル転送も同じ 方法でおこなうので、他もマシンからファイルの内容を簡単に読むことができます。
インターネットからアクセス可能なリモートシステムに接続する必要がある場合、 接続に ssh ベースのメソッドを使用することを真剣に考えるべきです。 このメソッドは、高いレベルのセキュリティを提供し、誰かがパスワードを入手 したり、編集しているファイルの内容を読んだりすることを困難にします。
ここまでの説明で、これは全くすばらしくて良いものだが、しかしながらメソッド を選ぶ方法については何の助言もされてないよ! と思うことと思います。確かに。 開発者としては、ユーザを牛耳ろうとは思ってなくて、代わりに最大限の自由度を 与えようと考えています。しかしながら実際にはユーザの中には手引きを求める 人も居るでしょう。そこでここではあなたを支配することなく手引きを与えること を試みます。これがうまく行ったか教えて下さいね ...
私の提案は、インラインメソッドを使うことです。大きなファイルに対しては 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 メソッド はそのような状況では動作しません。また、マルチホップメソッドたちは 本質的にインラインです。
事前に定義されたメソッドだけでは不十分な場合に、それを変更するための
tramp-methods
という変数があります。
変更が必要になった時のために、この変数の Lisp ドキュメントについて述べて おきます。ドキュメントは C-h v tramp-methods <RET> で参照する ことができます。
変数 tramp-completion-function-alist
は、ユーザ名とホスト名の
補完 (see Filename completion) の際にどのファイルたちを考慮に入れ
るかをカスタマイズするためにあります。この変数は各々のメソッドに対して、
設定ファイルの集合とそのファイルをパースできる Lisp 関数との組を保持し
ます。tramp-completion-function-alist
のエントリは
(method pair1 pair2 ...) の形式をとります。
それぞれの pair は (function file) から成ります。 function は補完の際に file からユーザ名とホスト名を取り出 すのに使われます。この変数にアクセスする二つの関数があります:
この関数は method に対する補完関数のリストを返します。
Example:
(tramp-get-completion-function "rsh") => ((tramp-parse-rhosts "/etc/hosts.equiv") (tramp-parse-rhosts "~/.rhosts"))
この関数は 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
tramp-parse-shosts
tramp-parse-sconfig
Host
エントリで
定義されたホストのあだなを返します。
tramp-parse-hosts
tramp-parse-passwd
tramp-parse-netrc
もし独自のデータを独自の構造でファイルに保持したいなら、このような関数 を提供すればよいです。この関数は以下の慣習に合致する必要があります。
file はあなたのホストにあるファイル名もしくは
nil
のいずれか です。この関数は (user host) のリストを返さねばなりません。 それらはユーザ/ホスト名補完の候補として使われます。Example:
(my-tramp-parse "~/.my-tramp-hosts") => ((nil "toto") ("daniel" "melancholia"))
tramp はリモートホスト上のいくつかのプログラム、ls、 test、find そして cat に依存しています。
これらのツールにくわえ、コネクションメソッドのためにいくつかのツールが 必要です。詳細は Inline methods と External transfer methods を参照してください。
いくつかの他のツール、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")
Overview の節で説明したように、tramp はリモートホストに接続し、 そこにあるシェルと対話します。もちろんログインする際にはシェルはその 初期化ファイルを実行します。例えばあなたの初期化ファイルがあなたのお母 さんの誕生日を入力させるようになっていたとしましょう; 当然 tramp はそのことを知らないので、そのホストへのログインに失敗します。
この問題を追求するために、いくつかの戦略が考えられます。一つは、tramp がすべての可能な状況に対応できるようにすることです。これは消耗戦です。 何故なら 全ての 状況を扱うことは不可能だからです。別の手として、 tramp の期待通りに振る舞うように、あなたにリモートホストの設定をして いただくということも出来ます。しかしこれは不便かもしれません。何故なら tramp を使い始めるより先に、シェルの設定に多くの労力を割く必要がある のですから。
そのことから、このパッケージではそれらを組み合わせた方法をとります。
いくつかのありふれた設定については理解しようとしてくれて、あなたには
本当に特異な設定だけを避けるように求めます。例えば、リモートホスト上で
あるプログラムを見つけるためには、ディレクトリの一覧を調べます。
そしてまた、ファイルが存在するかをどうか調べる方法というのも明らかでは
ないので、いくつかの異なる可能性を試してくれます。
(あるホストとシェルにおいては、test -e
コマンドがその役目を果たす。
別のホスト、シェルに対してはシェルの組み込みコマンドは働かないが、
/usr/bin/test -e
や /bin/test -e
ならうまく働く。
そしてさらに別のホストでは ls -d
がその方法として働く。)
以下では、tramp が取り扱ってくれない、つまりあなたが正しく設定する必要 のあるいくつかの事柄について述べます。
shell-prompt-pattern
をリモートホストのシェルプロンプトを認識出来るように設定しておく必要が
あります。
tramp は shell-prompt-pattern
に対してバッファ末尾でマッチす
ることを要求することに注意して下さい。多くの人はこの変数の値として次の
ようなものを指定しています: "^[^>$][>$] *"
。ここであなたのシェル
プロンプトが a <b> c $
のようなものだったとしましょう。この場合、
tramp は文字>
をプロンプトの終端と認識しますが、それはバッファ
の終端にはありません。
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
(マルチホップ接続の場合) を参照して下さい。
FRUMPLE
をシェル環境
で設定している場合、不具合が起きるかもしれません。
FRUMPLE_DIR
とかそのようなものに改名するのがよいでしょう。
奇妙な効果が実際に 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 的だと
知るのでしょうか?
通常 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))
もしあなたが 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
および scp
は ssh-agent
と通信することができません。Emacs をシェルから起動
すればうまく動きます。
もし誰か Windows 上でデスクトップショートカットが恩恵を受けられるような、
ssh-agent
の起動方法を知っていたら叫んで下さい。私は本当に Windows
については何も知らないのです...
tramp をインストールすると、tramp は完全に透過的に動作します。 ログイン可能なリモートマシン上のファイルに、あたかもローカルファイル のようにアクセスすることができます。
tramp では、formalized シンタックスを使いファイルを指定します。これは、 Ange-FTP パッケージのシンタックスに似ています。
あなたを驚かせることが起こり得ます。 Emacs は全てのキー入力を憶えています。 したがって Emacs からのパスワードプロンプトを目にして <RET> を一回でなく二回叩いた場合、二回目のキー入力は tramp が動作した後で Emacs で処理されます。何故この先行入力が通常の挙動かと思うでしょう。 あなたは正しい、しかしリモートファイルを開くにはしばらくの時間がかかり、 接続が開かれるまでに30秒かかるかもしれないということに気付いて下さい。 おそらく30秒後にはそのキーを叩いたことをすでに忘れているでしょう!
リモートマシン machine 上のファイル localname にアクセスす るためには、ファイル名 /machine:localname. を指定してください。これで、 machine に接続し、デフォルトメソッド を使用してファイルが転送されます。See Default Method.
tramp のファイル名の例を以下に挙げます。
melancholia
上のホームディレクトリにある .emacsを
編集します。
melancholia
上のユーザー daniel
のホームディレクトリ
にあるファイル .emacs を編集します。~<ユーザー> 構文は
リモートマシン上のユーザーのホームディレクトリに展開されます。
melancholia
上のファイル /etc/squid.conf を編集
します。
違う名前を使うように指定しない限り、tramp は現在のローカルなユーザ名 をログインのためのリモートユーザー名として使います。もし、違うユーザーで ログインする必要がある場合は、ファイル名の一部としてユーザー名を指定する ことができます。
指定したユーザーでリモートマシンにログインする必要がある場合、
/user@machine:/path/to.file
というシンタックスを使用してください。つまり、 melancholia
にユーザー
daniel
として接続してホームディレクトリの .emacs を編集
する場合、/daniel@melancholia:.emacs
を指定すればよいのです。
ファイル名の一部として、他のファイル転送メソッド(see Default Method) を指定することもできます。 そうするには以下のようにして、ユーザ名、ホスト名より前にメソッドを書きます。 /method{No value for `postfixsinglehop'} (末尾のコロンに注意)。 ユーザー、マシン、ファイルの指定は今までと同じです。
マシン melancholia
に daniel
として接続し、ファイル転送に
ssh メソッドを使い、ホームディレクトリの .emacs を編集する
ためには、ファイル名
/ssh{No value for `postfixsinglehop'}daniel@melancholia:.emacs
を指定します。
マルチホップファイル名のシンタックスは、当然のことながら、他の tramp のファイル名と若干異なります。以下に、マルチホップファイル名の例を あげます。最初が Emacs のシンタックスで次が XEmacs のシンタックスによ るものです:
/multi{No value for `postfixsinglehop'}rsh{No value for `postfixmultihop'}out@gate{No value for `postfixsinglehop'}telnet{No value for `postfixmultihop'}kai@real.host:/path/to.file
これは非常に重要なので、ひとつひとつ説明しましょう。ファイル名は 3つの部分から成り、 各部はコロンで区切られます。 最初のパート /multi はメソッドの指定です。 二番目のパートは rsh{No value for `postfixmultihop'}out@gate{No value for `postfixsinglehop'}telnet{No value for `postfixmultihop'}kai@real.host でホップを指定します。最後のパートは /path/to.file で、リモート ホスト上のファイル名を指定します。
最初と最後のパートは明白でしょう。Multi-hop Methodsに指定可能 なメソッドの一覧があります。
二番目のパートは、再びコンポーネントに、つまりホップたち(hops) に分割 されることがあります。上記のファイル名には、二つのホップたち、 rsh{No value for `postfixmultihop'}out@gate および telnet{No value for `postfixmultihop'}kai@real.host が含まれています。
それぞれのホップは、再び(3つの)コンポーネント、 ホップメソッド、ユーザー名、ホスト名に分割されることが ありまます。二番目、三番目のコンポーネントの意味は明白です。ホップメソッドは、 このホップでどのようなプログラムを使うかを意味しています。
最初のホップ rsh{No value for `postfixmultihop'}out@gate は、
ホスト gate
にユーザー out
としてログインするために
rsh を使うという意味です。二番目のホップ
telnet{No value for `postfixmultihop'}kai@real.hosttelnet{No value for `postfixmultihop'}kai@real.host
は、このホストからホスト real.host
にユーザー kai
でログ
インするために telnet を使うという意味です。
See Multi-hop Methods. ここにホップメソッドの一覧があります。
変数 tramp-multi-connection-function-alist
には、選択可能なホップ
メソッドのリストとそれらをどのように実行するかという情報が含まれています。
あなたが作ったメソッドをこの変数に追加してください。
tramp のファイル名補完はリモートマシンのファイル名の補完に加えて メソッド、ユーザ名およびマシン名(マルチホップメソッドたちは除く)に 対して働きます。
例えば C-x C-f /t<TAB> と入力すると tramp は以下の選択肢を返します。
{No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'} tmp/ {No value for `prefixsinglehop'}toto:
`{No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}' はメソッドの補完であり、 `tmp/' はローカルマシン上のディレクトリ /tmp であり、 `{No value for `prefixsinglehop'}toto:' は tramp がファイル ~/.ssh/known_hosts から検出したホスト名 です(デフォルトメソッド ssh を使っている場合)。
続けて e <TAB> とすれば、ミニバッファは `/telnet{No value for `postfixsinglehop'}' と補完されます。次の <TAB> では tramp がファイル /etc/hosts から検出した全てのマシン名を挙げます。例えば、
{No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}127.0.0.1: {No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}192.168.0.1: {No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}localhost: {No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}melancholia.danann.net: {No value for `prefixsinglehop'}telnet{No value for `postfixsinglehop'}melancholia:
ここで希望のマシンを選択することができ、続けてそのマシン上のファイル名 を補完することができます。
ファイル名補完はリモートマシンからファイルリストを取り寄せる必要が あるために、しばしばとても遅くなります。今の所 tramp はディレクトリ リストをキャッシュしないので二回目のファイル名補完でもパフォーマンス 上の違いは現れません。
tramp が補完の解析に用いる設定ファイル (see Customizing Completion) がユーザ名を提供した場合、それらのユーザ名も考慮されます。
tramp は dired 上でも透過的に動作します。この強力なファイル管理 ツールを使い、インターネットを経由しアクセス可能なすべてのマシン上の ファイルを管理できます。
ディレクトリツリーをブラウズしたい場合は、今のところファイル名の補完 より dired を使うほうが良いでしょう。dired は自身でキャッシュの仕組み をもっているので、ファイル一覧を一度しか取得しません。
tramp のバグや問題は、開発チームによってアクティブに解決されています。 仕様に関するリクエストや提案も歓迎します。
tramp メーリングリストは、tramp の情報を入手したり、問題の解決や、 一般的な議論、そしてこのパッケージに関係する話題へのアドバイスに最適 の場所です。
メーリングリストは tramp-devel@mail.freesoftware.fsf.org です。 このアドレスにメッセージをを送るとすべての講読者に届きます。 これは講読のリクエストを送信するためのアドレスでは ありません。
メーリングリストを講読するためのヘルプを入手するには、サブジェクトに `help' と書いたメールを管理用のアドレス tramp-devel-request@mail.freesoftware.fsf.org に送信してください。
tramp のバグ報告をする場合には、M-x tramp-bug を実行してください。 これは、あなたのシステムの詳細や tramp のバージョン情報を含むバッファ を自動的に生成します。
バグ報告を提出する時には、問題を再現する手順、リモートマシンの設定、 もし存在するのであれば特殊な条件を、しつこいぐらい詳細に記述してく ださい。もし可能なら、簡単な再現手順も記述してください。
もし、問題を再現するための簡単なテストケースがわかれば、それをバグ 報告に含めてください。これにより、開発チームがバグを突き止め、修正 するのが容易になります。
tramp は以下の URL で入手可能です
http://savannah.nongnu.org/download/tramp/
また Savannah のプロジェクトページもあります。
このパッケージは、Emacs 20 と Emacs 21 上で動作します。XEmacs 20 上では 問題があります。tramp.el のコメントを参照してください。Emacs 19 で試した人がいるのかどうかは知りません。
このパッケージは Unix 上で動作するように設計されています。そしてリモート 側も Unix 風のシステムであることを期待しています。しかし、NT Emacs 上で 動作させることに成功した人が何人かいるようです。
以下の URL には、Tramp を NT で使うための情報があります; Joe Stoy には情報の提供に対して深く感謝します: ftp://ftp.comlab.ox.ac.uk/tmp/Joe.Stoy/
上記はもっぱら古いバージョンの ssh へのパッチがおいてあります; Tom Roche の Web page にも説明があります: http://www4.ncsu.edu/~tlroche/plinkTramp.html
??? XEmacs の情報は正しいのでしょうか?
??? 誰か、NT Emacs 上で動かすための情報を教えてください。たぶん、ssh 関係の問題があるのではないかと思います。
ftp メソッドによりファイルを要求すると、tramp によって Ange-FTP が自動的に読み込まれます。不幸なことにいくつかの Lisp パッケージは Ange-FTP ファイル名ハンドラを有効に してしまいます。C-h v file-name-handler-alist とするとそれを確か めることができます:
file-name-handler-alist's value is (("^/[^/:]*\\'" . ange-ftp-completion-hook-function) ("^/[^/:]*[^/:.]:" . ange-ftp-hook-function) ("^/[^/]*$" . tramp-completion-file-name-handler) ("\\`/[^/:]+:" . tramp-file-name-handler) ("\\`/:" . file-name-non-special))
どのパッケージが Ange-FTP を読み込ませているか調べて ぜひバグレポートを出して下さい。
回避法としては、~/.emacs で tramp より先に Ange-FTP
を require しておくことです。何故なら tramp は file-name-handler-alist
内の登録を整理するからです:
;; Ange-FTP を仮に require する
(require 'ange-ftp)
;; tramp が file-name-handler-alist
を整理する
(require 'tramp)
リモートマシンにログインした時に、ls の出力が色付きになって いませんか? もし、そうなら、それが原因です。
ls は、端末エミュレーターが色を変更するための ANSI エスケープシークエンスを出力します。しかしながら、このエスケープ シークエンスは tramp を混乱させます。
リモートマシン上の .bashrc、.profile あるいは同じような 設定ファイルに、--color=yes または --color=auto が追加された設定の alias があるはずです。
この alias を削除し、新しくログインした時の ls の出力が 色付きで表示され ない ことを確認してください。もし、これでも ファイル名の補完が正常に動作しない場合は、tramp 開発者にバグ報告 をしてください。
tramp はいくつかのオペレーションで globbing を使用します。(globbing とは、`*.c' のようなワイルドカード展開のためにシェルを使うことです) これは、たくさんのファイルが存在するディレクトリでは長いコマンドライン を作ります。いくつかのシェルでは長いコマンドラインをけずりとったり、 あるいは globbing 自身を処理できません。
リモートホスト側に巨大なディレクトリがある場合は、 `ls -d * ..?* > /dev/null' のようなコマンドを実行し、ハングするか どうかを確認してください。注意する必要があるのは、最初に正しいシェル、 /bin/sh、ksh あるいは bash、つまり tilde の 展開をサポートするシェルから試すべきだという事です。
tramp は、リモートシステムが Unix 風のシステムである事を前提にして います。また、ローカルシステムも Unix 風のシステムのほうが望ましいで しょう。しかし、すこし修正すれば、tramp は NT 上でも動作するはずです。
以下のコードを、~/.emacs に追加してください。これで、リモート ホストに対する読み書きの後に、Emacs が beep 音をならしてくれます。
(defadvice tramp-handle-write-region (after tramp-write-beep-advice activate) " make tramp beep after writing a file." (interactive) (beep)) (defadvice tramp-handle-do-copy-or-rename-file (after tramp-copy-beep-advice activate) " make tramp beep after copying a file." (interactive) (beep)) (defadvice tramp-handle-insert-file-contents (after tramp-copy-beep-advice activate) " make tramp beep after copying a file." " make tramp beep after copying a file." (interactive) (beep))
tramp はティルダ展開の為に、しばしばリモートホストで ksh
を
起動します。たぶん ksh
はデフォルトで履歴を保存します。tramp
は履歴の保存を停止しようと試みますが、あなたが手助けをする必要がある
かもしれません。例えば、あなたの .kshrc にこれを入れてください:
if [ -f $HOME/.sh_history ] ; then /bin/rm $HOME/.sh_history fi if [ "${HISTFILE-unset}" != "unset" ] ; then unset HISTFILE fi if [ "${HISTSIZE-unset}" != "unset" ] ; then unset HISTSIZE fi
いくつかの稀なシステムでは、process-send-string
の実装が
長い文字列に対して壊れています。この場合、変数 tramp-chunksize
を 500 にカスタマイズします。これが必要かどうかをどうやって知るかは
tramp-chunksize
の説明を見て下さい。
Ange-FTP と異なり、tramp は、リモートマシン上のシェルを実行 します。したがって、tramp を使いアクセスしたファイルのバージョン 管理をおこなう事ができます。
バージョン管理をおこなうバイナリが、リモートマシンにインストールされて いなければなりません。そして、tramp-remote-path で指定された ディレクトリに置かれて、アクセス可能でなければなりません。
バージョン管理システムの透過的な統合は、tramp のもっとも価値のある 機能のひとつです。しかし、まだ完全にはほど遠い状態です。システムの透過 性を向上させるための作業が続けられています。
VC パッケージは、ディスク上のマスターファイルの存在をもとに、指定された ファイルがバージョン管理システムの管理下にあるかどうかを判断します。 これらのファイルのテストは、標準的な tramp の仕組みを使いリモート マシン上で実行されます。
バージョン管理システムのコマンドの実行を横取りすることのできる VC 用の
hook は存在しません。call-process
の仕組みを使い、
関数呼び出しが発生します。関数は shell-command
より、若干
効率的ですが、リモートでコマンドを実行するための hook は用意されていません。
とりあえず動作させるために、関数 vc-do-command
と
vc-simple-command
に、tramp を経由しアクセスされたファイルへの
オペレーションのためのリクエストを横取することが通知されます。
リモートファイルの場合、ローカルマシンと同じ機能を提供するために、
shell-command
インターフェースが、いくつかのラッパーコードと
共に使用されます。
今のところ、リモートマシン上のファイルの mtime を取得する移植性の高い
方法は存在しません。vc-workfile-unchanged-p
関数に、リモート
ファイルのために tramp の関数の呼び出しが通知されます。
tramp-vc-workfile-unchanged-p
関数は、作業ファイルとバージョン
管理マスタファイルの変更点を調べるために VC の diff 機能を使用します。
これを実現するためには、リモートでのシェルコマンドが実行可能でなれば なりません。この処理は、ローカルファイルで使われる mtime の取得より 重い処理です。残念ながら、移植性の高い解決方法が見つかるまでは、リモート バージョン管理のコストはこのままでしょう。
デフォルトでは、VC はリモートファイルをチェックし、リポジトリからチェック
アウトされたファイルがある場合は、チェックアウトをおこないません。この問題
を解決するために、関数 vc-checkout
は tramp ファイルを区別し、
バージョン管理をおこなうことを可能にします。
こまかな実装の詳細、その他。
Emacs は、任意のユーザー ID の値とログイン名をマッピングするのと同様に、
現在のユーザーのログイン名をかえす関数 user-full-name
を用意して
います。VC は、いくつかの状況で、ワークファイルのオーナーの uid からログ
イン名へのマップ機能を使用します。
これは、リモートシステムが異なるログインセットを持つ場合には、あきらか に正しく動作しません。したがって、uid に対応するログイン名の決定をリモート マシンにおこなわせる必要があります。
残念ながら、NIS
、NIS+
そして NetInfo
のような、
分散管理システム を使う場合、シンプルで、信頼性があり、移植性の高い
マッピングの方法は存在しません。
ありがたい事に、uid からログイン名へのマッピングに依存する VC のコードは、
関数 vc-file-owner
ひとつだけです。この関数は、ファイルのオーナー
のログイン名を文字列として返します。
ログイン名を決定するために、この関数に、リモートマシン上の ls の出力を使用することが通知されます。uid からログイン名のマッピングを、 私よりそれらについて良く知っているはずのリモートシステムに委譲します。
VC は、どのリリースのバージョン管理システムのバイナリを使っているかを 知る必要があります。これは、VC がサポートしているすべての機能を、古い バージョンのrcs(1)、cvs(1)、sccs(1)が提供 しているわけでは無いからです。
VC のデフォルトの実装では、最初に必要になった時に、この値を決定します。 これは、必要になった時に毎回プロセスを実行し、その出力をパースすることの オーバーヘッドをさけるためです。
いかし、リモートのバージョン管理システムの事が関係してくると、人生は それほど簡単ではありません。リモートマシンはそれぞれ、異なるバージョン のバージョン管理ツールをもっています。これが困難な間は、存在しない機能 が、リモートで使用されないことを保証する必要があります。
この問題を解決するために、現在の tramp は、バージョン管理ツールの バージョン番号を tramp バッファ毎にローカルな変数にし、新しい ファイルを開くたびにVC にこの値を決定させるという力ずくのアプローチ を採用しています。
これはあきらかに性能に影響します。ありがたいことに、VC によっておこなわれる ほとんどの処理は、実際にはリモートのバージョンを知ることを必要としません。 したがって、それほど問題になりません。
最終的には、これらの変数は tramp によってシステム毎に調べられ、 その結果は性能を改善するためにキャッシュされるようになるでしょう。
tramp のファイル名は普通のファイル名とは明らかに異なっています。
したがって、lisp の関数 file-name-directory
と
file-name-nondirectory
は、tramp パッケージ内で上書きされて
います。
関数の置き換えはシンプルかつ適切な方法です。ファイル名を分解し、 ローカル名に対してオリジナルのハンドラーがよばれます。そして、 その結果をもとに tramp ファイル名が再構成されます。
これにより、tramp ファイル名の情報を扱う場合も、プラットホーム固有の オリジナルハンドラーのハックは有効です。
tramp の設計上の理由で、符号化と復号化をおこなうプログラムは標準
入力から読み込み、標準出力に書き込む必要があります。いくつかのシステム
では、uudecode -o -
で標準入力から読み込み、復号化されたファイル
を標準出力に書き込みます。他のシステムでは、uudecode -p
が同じ
動作をします。しかし、いくつかのシステムの uudecode の実装では、これら
のことが全くできません。これらの uudecode の実装に、標準出力に書き込む
ために適切なパラメータを渡して呼ぶことは不可能です。
もちろん、これを回避する事は可能です。テンポラリファイル名を追加する
ために begin foo 644
行を書きかえれば、uudecode
を呼ぶこと
ができます。そしてテンポラリファイルを表示し削除します。
しかし、この方法はあまりにも信頼性が低いため、いくつかのシステムでは uuencode メソッドを使用できないままにしておく事にしました。
これは、XEmacs 20 に存在しないマクロ with-timeout
を使っている
からです。私は、エミュレーションのためのマクロを tramp に追加する
ことに、あまり乗り気ではありません。しかし、XEmacs 20 ユーザーの誰かが
積極的に実装とテストをしたいと考えているのであれば、私かメーリングリスト
に連絡してください。
Emacs のメンテナ達は、ユーザが新しいシンタックスを勉強する必要がないよ うに Ange-FTP と tramp で統一されたファイル名シンタックスを使いたい と望んでいます。
XEmacs のメンテナにとっては、統一されたファイル名シンタックスを用いる ことによる利益よりもそのことによる問題の方が大きいです。 XEmacs のパッケージシステムはパッケージをダウンロードするのに EFS を 使います。したがって明らかに EFS は最初からインストールされているはず です。もしファイル名が統一されていたとすると、tramp もまた最初から インストールされている必要があります。