1. ホーム
  2. emacs

[解決済み] EmacsでSSHとSudoを使ってファイルを開く

2022-09-10 04:24:04

質問

リモートサーバーにある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-h i g (tramp)Ad-hoc multi-hops RET

新しい構文では、各「ホップ」の区切りは | . マニュアルの例では

C-x C-f /ssh:bird@bastion|ssh:you@remotehost:/path RET

これは、まず bird@bastion となり、そこから you@remotehost:/path

リモートホストで /su: または /sudo: を使用します。

この構文を使って、リモートホストの root (またはもちろん他のユーザ) に sudo/su を行うこともできます。

C-x C-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-x C-f /ssh:you@remotehost|sudo:them@remotehost:/path/to/file RET

常にリモートホスト名を明示的に指定する

あなたはおそらく sudo:: または su:: で、ホスト名を省略します。もし、あなたが 滞在 にいるのであれば、これはまだ良いのですが、もしリモートサーバに移動する場合は ホップごとにホスト名を指定する必要があります (たとえそれが前のホップと同じであっても)。常に sudo:hostname: または su:hostname: をリモートホストで使うことができます。

ここでのトラップは sudo:: が行う 実際に動作しているように見える --。 しかし を実行すると、ダイナミックプロキシエントリのホスト名が を元にした になります。これは (ファイルパスに間違ったホストが表示されるため) 混乱を招くだけでなく、それ以降に sudo:: を使おうとすると、代わりにリモートサーバにプロキシされることになります! (そして、2 番目のサーバーで同じことをすると、プロキシはおそらく妨害され、さらなる問題を引き起こします)。

要するに :: を使わないでください。

Emacs 27+

Emacs 27.1 (または GNU ELPA パッケージを使用している場合は Tramp 2.4.2) 以降は :: のようなケースは直感的に動作します。 /ssh:you@remotehost|sudo:: は再利用されます。 remotehost を再利用しますので、不正なプロキシエントリで終わることはありません。

さらに /ssh:you@remotehost|sudo:localhost: などは、ユーザーエラーとして検出され、フラグが立てられます。

27より前のバージョンを含む様々なEmacsを使う可能性がある場合(あるいは古いバージョンを使っている可能性のある人に助言する場合)には、引き続き、以下のように扱うのが最も安全でしょう。 :: を安全でないものとして扱い続けるのが最も安全でしょう。 (つまり、Tramp のバージョンが不明な場合、正しいリモート ホストを明示的に指定することが最も安全なアプローチであることに変わりはありません)。