Question

I am trying to use Emacs TRAMP to access files over ssh on a server that does not provide /bin/sh, and so I get the following error when I try to connect:

env: can't execute '/bin/sh': No such file or directory

Is there any way to tell TRAMP where the remote shell is for that server? (The "server" is a tethered Android phone, so sh in at /system/bin/sh.)

Was it helpful?

Solution

See also the docstring for the tramp-methods variable. This part would appear noteworthy:

  • tramp-remote-shell
    This specifies the shell to use on the remote host. This MUST be a Bourne-like shell. It is normally not necessary to set this to any value other than "/bin/sh": Tramp wants to use a shell which groks tilde expansion, but it can search for it. Also note that "/bin/sh" exists on all Unixen, this might not be true for the value that you decide to use. You Have Been Warned.

Edit:

So here's a way you could create a new method based on an existing one ("scpc" in this example), and then give the custom method a different remote shell:

(require 'tramp)
(let* ((base-method (cdr (assoc "scpc" tramp-methods)))
       (new-method (copy-tree base-method))
       (rshell (assq 'tramp-remote-shell new-method)))
  (setcdr rshell "/system/bin/sh")
  (add-to-list 'tramp-methods (cons "android" new-method)))

Note that in Emacs 23 (Tramp 2.1.20), this property was named tramp-remote-sh. In Emacs 24 (Tramp 2.2.3-24.1) it has been changed to tramp-remote-shell.

And I'm guessing that you can use this method by default for your specified host with this:

(add-to-list
 'tramp-default-method-alist
 (list "\\`myhost\\'" nil "android"))

OTHER TIPS

ssh expects to use the remote user's login shell. If you have root access to the server, you can change the entry in the passwd file:

:blah:blah:user_name:blah:/path/to/shell

Or just symlink /bin/sh to it.

I don't believe there is any way to change this from the client's side, but if there is, you would need to tell ssh, not TRAMP. (You could do this via an ssh_config file.)

Edit: I stand corrected.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top