リモートサーバー上にあるEmacs内のファイルを開き、Sudoでサーバーの電源を入れます。次のようにTramp経由でローカルファイルをSudoで開くことができます。
C-x C-f /Sudo::/home/user/file
しかし、サーバーでSudoを使用したい:
C-x C-f /Sudo::user@server/home/user/file
しかし、これによりローカルマシンでSudoの権限が付与され、ローカルマシンでSudoパスワードが要求されます。サーバーでSudoを使用する方法はありますか?
ところで:Emacsはサーバーにインストールされていません
Emacs 24.3の時点で、古いmulti:
構文の類似物が最新のtramp-default-proxies-alist
アプローチの上に階層化されました。つまり、事前設定なしでもう一度マルチホップを実行できます。詳細については、以下を参照してください。
C-hig (tramp) Ad-hoc multi-Hops
RET
新しい構文では、各「ホップ」は|
で区切られます。マニュアルの例は次のとおりです。
C-xC-f /ssh:bird@bastion|ssh:you@remotehost:/path
RET
最初にbird@bastion
として接続し、そこからyou@remotehost:/path
に接続します
この構文を使用して、リモートホスト上のルート(またはもちろん他のユーザー)にSudo/suすることもできます。
C-xC-f /ssh:you@remotehost|Sudo:remotehost:/path/to/file
RET
重要:ホスト名を明示的に指定してください:Sudo:remotehost:
ではなくSudo::
(以下を参照)。
これはまだ下のプロキシメカニズムを使用するため、tramp-default-proxies-alist
には値("remotehost" "root" "/ssh:you@remotehost:")
を含める必要があります。
つまり、/ssh:you@remotehost:
としてファイルを要求するたびに、プロキシroot@remotehost
が使用されます。
root
はこれらのメソッドのデフォルトのユーザーですが、もちろん次の方法で非rootユーザーに変更することもできます。
C-xC-f /ssh:you@remotehost|Sudo:them@remotehost:/path/to/file
RET
おそらくSudo::
またはsu::
を使用し、ホスト名を省略することに慣れているでしょう。 localhostにstayingである場合、これで問題ありませんが、リモートサーバーにホッピングする場合はmustホップごとにホスト名を指定します-前のホップのホスト名と同じ場合でも。リモートホストでは常にSudo:hostname:
またはsu:hostname:
を使用してください。
ここでの落とし穴は、Sudo::
doesが実際に機能するように見えることです-howeverこれを行うと、動的プロキシエントリのホストは、接続先のホストではなく、originatedのホスト名になります。これは混乱を招くだけでなく(ファイルパスに間違ったホストが表示されるため)、ローカルホストでSudo::
を使用しようとすると、代わりにリモートサーバーにプロキシされることにもなります。 (また、2番目のサーバーで同じことを行った場合、プロキシはおそらく破壊され、さらに問題が発生します)。
要するに、マルチホップするときに::
を使用しないでください!
Update:この回答は元の問題を解決しましたが、emacs 20または21向けに書かれています。emacs24の場合、 philsのanswer より多くの説明を提供し、最新のものであるため。
Trampの multi-hop filenames が探しているものだと思います。
最初のホップはsshで、2番目のホップはSudoです。
更新:emacsの最近のバージョンは、プロキシを使用した複数のホップをサポートしています。
(add-to-list 'tramp-default-proxies-alist ("my-Sudo-alias" nil "/ssh:user@ssh-Host"))
次に、開いて呼び出します:
/Sudo:my-Sudo-alias:file-on-ssh-Host
選択した答えに問題がありました。ただし、この行を.emacsに追加すると機能しました。
(add-to-list 'tramp-default-proxies-alist '(".*" "\\`root\\'" "/ssh:%h:"))
そして、次を実行しました:
/Sudo:ssh-Host:file-on-ssh-Host
ある時点で「root」パスワードの入力を求められましたが、ユーザーのパスワードを入力するとアクセスが許可されたため、少し混乱しました。また、ネットワーク上のすべてのホストで一般的に機能します。また、ルートにならないようにこれを行うことができます:
/ssh:ssh-Host:file-on-ssh-Host
(add-to-list 'tramp-default-proxies-alist
'(nil "\\`root\\'" "/ssh:%h:"))
(add-to-list 'tramp-default-proxies-alist
'((regexp-quote (system-name)) nil nil))
それから
C-x C-f /Sudo:remote-Host:/file
emacsを実行しているユーザーと同じユーザー名でログインした後、リモートマシンでSudoを使用してファイルを開きます。