افتح الملف عبر SSH و Sudo مع Emacs
سؤال
أرغب في فتح ملف داخل Emacs الموجود على خادم بعيد ، مع صلاحيات Sudo على الخادم. يمكنني فتح الملفات المحلية مع Sudo عبر Tramp مثل هذا:
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
النهج ، وهذا يعني أنه يمكنك مرة أخرى أداء محركات متعددة دون أي تكوين مسبق. للحصول على التفاصيل ، راجع:
الفصلأناز (tramp) Ad-hoc multi-hops
RET
مع بناء الجملة الجديد ، يتم فصل كل "قفزة" |
. المثال في الدليل هو:
CXراجع /ssh:bird@bastion|ssh:you@remotehost:/path
RET
الذي يتصل أولاً كما bird@bastion
, ومن هناك إلى you@remotehost:/path
/su: أو /sudo: على المضيفين عن بعد
يمكنك أيضًا استخدام هذا الجملة إلى sudo/su لجذر (أو بالطبع أي مستخدم آخر) على مضيف بعيد:
CXراجع /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
هل المستخدم الافتراضي لهذه الطرق ، ولكن يمكنك بالطبع أيضًا التغيير إلى مستخدم غير الجذر مع:
CXراجع /ssh:you@remotehost|sudo:them@remotehost:/path/to/file
RET
حدد دائمًا اسم المضيف البعيد بشكل صريح
ربما تكون معتادًا على استخدام sudo::
أو su::
وحذف اسم المضيف. إذا كنت كذلك البقاء على المضيف المحلي ، لا يزال هذا جيدًا ، ولكن إذا كنت تتنقل إلى خادم بعيد ، فأنت أنت يجب حدد اسم المضيف لكل قفزة - حتى لو كان كما هو الحال بالنسبة للقفز السابق. دائما يستخدم sudo:hostname:
أو su:hostname:
مع المضيفين عن بعد.
الفخ هنا هو ذلك sudo::
يفعل في الواقع يبدو أنه يعمل - ومع ذلك عندما تفعل ذلك ، سيكون المضيف لإدخال الوكيل الديناميكي اسم المضيف لك نشأت من بدلاً من المضيف الذي تواصله. لن يبدو هذا مربكًا فقط (حيث سيتم عرض المضيف الخطأ في مسارات الملفات) ، ولكن هذا يعني أيضًا أن أي محاولة لاحقة للاستخدام sudo::
على مضيفك المحلي بدلا من ذلك سيتم تنفيذه إلى الخادم البعيد! (ومن المفترض أن يكون الوكيل متصلاً إذا فعلت نفس الشيء على الخادم الثاني ، مما تسبب في مزيد من المشكلات).
باختصار ، لا تستخدم ::
عندما تكون متعددًا!
نصائح أخرى
تحديث: على الرغم من أن هذه الإجابة حلت المشكلة الأصلية ، فقد تمت كتابتها لـ Emacs 20 أو 21. بالنسبة لـ Emacs 24 ، أوصيك باستخدام إجابة فيلز لأنه يقدم المزيد من التفسير وهو محدث.
أظن أسماء الملفات متعددة القبع في ترامب هو ما تبحث عنه.
سيكون القفزة الأولى SSH والثاني سيكون 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
لقد كان الأمر مربكًا بعض الشيء لأنه في وقت من الأوقات ، طُلب مني كلمة مرور "الجذر" ، لكن إدخال كلمة مرور المستخدم منحني الوصول. كما أنه يعمل عالميًا على جميع المضيفين على الشبكة. أيضا ، لا يزال بإمكاني القيام بذلك حتى لا يكون جذرًا:
/ssh:ssh-host:file-on-ssh-host
من صفحة ويب تكوين Tramp Multi-Hops
(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 ولكن على الجهاز البعيد.
يجب عليك ssh في الخادم أولاً ، ثم يجب عليك تشغيل emacs محليًا.
أو يمكنك استخدام NFS مع no_root_squash ، أو يمكنك المحاولة مع خادم/عميل emacs ، على الرغم من أنه ليس لدي أي فكرة عما قد يحدث (لا تستخدم emacs بنفسي)