Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Emacs TRAMP with an ssh server that doesn't provide /bin/sh?

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.)

like image 590
Ryan C. Thompson Avatar asked May 17 '12 03:05

Ryan C. Thompson


1 Answers

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"))
like image 149
phils Avatar answered Oct 03 '22 00:10

phils