やりたい事は、
ローカルマシン -> ssh -> リモートサーバ -> sudoということで、TRAMPの「2.0」では、以下のようにすればよかった。
/multi:ssh:foo@remote:sudo:root@localhost:/...これは、例えば、リモートサーバ側に emacs がインストールされておらず、かつ、root で作業したい場合、とても便利だった。
そこで、TRAMPのマニュアル「5.9 Connecting to a remote host using multiple hops」や、色々検索して調べてみたところ、
tramp-default-proxies-alist
に多段接続する条件を追加するらしい。設定方法は、
「ホスト」、「ユーザ」には正規表現が使用でき、「nil」を指定すれば、すべての場合にマッチする。(add-to-list 'tramp-default-proxies-alist '("ホスト" "ユーザ" "接続方法"))
つまり、「/メソッド:ユーザ@ホスト]とした場合、「接続方法」で記述した方法で一旦接続した後に、指定された方法で接続を行なう。
例えば、
とした場合、(add-to-list 'tramp-default-proxies-alist '("host2" "foo" "/ssh:foo@host1"))
/ssh:foo@host2:/...に接続すれば、
という経路で接続できる。これば、「host2」へ直接接続できない場合などで有効だが、これならば、ssh の設定でもできる。ローカルマシン -> ssh -> foo@host1 -> ssh -> foo@host2
~foo/.ssh/config
これで、「ssh host2」とすれば、Host host2 ProxyCommand ssh foo@host1 nc %h %p
となる。この場合、踏み台にする「host1」から「host2」への接続に「nc」コマンドを使うので負荷も少ない。ローカルマシン -> ssh -> foo@host1 -> nc -> foo@host2
ただし、「host1」への接続が、ユーザ「foo」でない場合は、この方法は使いずらい。「host1」から「host2」へは同じユーザで接続するからである。(「nc」を sudo で別ユーザで起動すればできるのかなぁ?)
とにかく、TRAMP では、リモートサーバで sudo (主に root)で作業する事に専念する事とした。したがって、
~/.emacs
という設定を行なった。(add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil)) (add-to-list 'tramp-default-proxies-alist '((regexp-quote (system-name)) nil nil))
最初の設定は、とにかく、ユーザが「root」なら、まず、ssh で指定ホスト(「%h」で置き換わる)に接続する。
2番目の設定は、ホスト名が「localhost」なら何もしない。
さらに、3番目の設定は、ホスト名がローカルマシンのホスト名なら、やはり、何もしない。
したがって、
ならば、/sudo:host1:/...
ローカルマシン -> ssh -> host1 -> sudoと接続できる。「/sudo」メソッドでユーザ名を省略すると「root」が想定される。
また、
/sudo:localhost:/...などとすれば、ローカルマシンで「sudo」が実行される。ちなみに「/sudo::/...」と、ユーザ名、ホスト名共に省略すると、「root@自ホスト名.自ドメイン名」が想定されるので、3番目の設定が、これに対応したものでもある。
/sudo:myhost@mydomain.co.jp:/..
ただし、3番目の設定は、emacs のバージョンが「21」ではエラーとなってしまうので注意が必要である。
まあ、横着せずに、ローカルマシンでも、リモートサーバでも、ホスト名はしっかり記述すれば良いのであるが…。
0 件のコメント:
コメントを投稿