I find that the best to run my shells in remote machines in emacs is using TRAMP (using the ssh
command in a local shell does not work for my needs). However, I only know how to run a TRAMP shell if I first visit a remote file with C-x C-f
and then do M-x shell
from that buffer. However, I would like to open a shell in a remote machine, using TRAMP, before opening any file on that remote host, but cannot find any explanation on how to do that on my searches. Is it possible to do that?
Tramp comes into play, when the default-directory is remote. So you might change it, as you do with opening a remote file (or directory) in advance.
But you could write a small command like this:
(defun my-shell () (interactive) (let ((default-directory "/ssh:user@host:")) (shell)))
Then you can call M-x my-shell
-
1If emacs runs on windows and you want to login onto a linux host, you could set with
M-x customize-variable
explicit-shell-file-name
to\bin\bash
to avoid missing shell errors. – kwarnke Jul 25 '18 at 10:17 -
@Michael Albinus I've applied that
my-shell
function. It successfully builds a TRAMP connection from my Windows 7 laptop to my Mac computer but after that it exits withenv: C:/msys64/usr/bin/bash.exe: No such file or directory exit
I think it's because in my.emacs
tramp-encoding-shell
is set toC:/msys64/usr/bin/bash.exe
If only I was able to change the valuetramp-encoding-shell
to/bin/bash
I think it would work out fine. How to do it without hassle? Thanks. – Terry Aug 27 '19 at 9:56 -
As always, you could bind it. Like
... (let ((default-directory "/ssh:user@host:")(tramp-encoding-shell "/bin/bash")) (shell)))
. I haven't tested this, 'tho. – Michael Albinus Aug 27 '19 at 15:02
I use dired to access the remote machine and open a shell there.
Here is the function I use, taken and modified from Tikhon Jelviss' emacs configuration:
(defun anr-shell (buffer)
"Opens a new shell buffer where the given buffer is located."
(interactive "sBuffer: ")
(pop-to-buffer (concat "*" buffer "*"))
(unless (eq major-mode 'shell-mode)
(dired buffer)
(shell buffer)
(sleep-for 0 200)
(delete-region (point-min) (point-max))
(comint-simple-send (get-buffer-process (current-buffer))
(concat "export PS1=\"\033[33m" buffer "\033[0m:\033[35m\\W\033[0m>\""))))
Example:
(anr-shell "/vagrant@localhost#2222:/vagrant/")
-
Please repost the answer here, as links to the actual answer is discouraged to avoid link rot – Jarmund Apr 23 '15 at 9:02
-
-
Although not made overly clear in the manual C-u M-x shell
allows you to specify the name of the shell buffer, and more importantly in your case allows you to specify the Default directory
, which can take a string just like Tramp /ssh:server:/my/path
.
An alternative is to open dired (C-x d
) rather than an actual file, if you M-x shell
from directory, the shell opens with the context of the dired directory.
Here's another approach:
M-x cd
to change the buffer's default directory to the desired remote directory- invoke
M-x shell
, which will open a shell on the remote machine
sshpass
? Would you prefer to enter your password each time? – lawlist Nov 17 '14 at 18:26