Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm trying to get ssh to automatically change to a particular directory when I log in. I tried to get that behaviour working using the following directives in ~/.ssh/config:

Host example.net
LocalCommand "cd web"

but whenever I log in, I see the following:

/bin/bash: cd web: No such file or directory

although though there is definitely a web folder in my home directory. Even using an absolute path gives the same message. To be clear, if I type cd web after logging in I get to the right folder.

What am I missing here?

EDIT:

Different combinations of quotes/absolute paths give different error messages:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

This makes me think that the quotes shouldn't be there, and that there's another error happening.

share|improve this question
3  
LocalCommand is run on your local system, not the remote system. –  Steve Kehlet Aug 5 '11 at 18:56
    
See here superuser.com/a/124110/47962 –  Nakilon Oct 11 '13 at 13:58

8 Answers 8

up vote 5 down vote accepted

cd is a shell builtin. LocalCommand is executed as:

/bin/sh -c <localcommand>

What you're looking to do can't really be accomplished via SSH; you need to modify the shell in some way, e.g. via bashrc/bash_profile.

share|improve this answer
    
Yep, just wanted to mention to same. You can put the cd command in ~/.bashrc at the remote server instead. –  vdboor Aug 5 '10 at 16:00
    
That's annoying. As I mentioned in another comment, the server has a number of hostnames and I wanted to have different behaviour based on which was used. I guess it's not possible to determine which was used from .bashrc? –  Gareth Aug 5 '10 at 16:15
    
It's possible, just probably not advisable. Something like replacing ssh with a small shell script or alias that passes the host name as a variable to be exported (a la "ssh -t user@host 'export connhostname=host; bash --login'"). But you're starting to get into very strange territory, indeed. Perhaps a better question is, WHY do you want this behavior? –  BMDan Aug 5 '10 at 17:50
    
It's not really that big a deal to be honest. I'm just in the situation where the vast majority of the time I log into this server I head straight to one of two directories (depending on which host I'm using) –  Gareth Aug 6 '10 at 7:32

This works:

ssh server -t "cd /my/remote/directory; bash --login"

To create a directory if it doesn't exist:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

If you don't add bash to the end of path then you exit after the cd comand runs. And If you don't add --login then your ~/.profile isn't sourced.

share|improve this answer
    
This ends me up at the correct location, with a bash prompt. perfect! –  Peter Ehrlich Jul 13 '12 at 21:06
  1. Login to your box
  2. Edit ~/.bash_profile
  3. On the end of the file add cd /path/to/your/destination
  4. Save it & exit your editor
  5. Logout from box
  6. Login again and you should land it in /path/to/your/destination
share|improve this answer

In your ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

At the end of your ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

I tried doing this using variable passing, including with an exported variable, but these commands get run in different shells.

When testing what you were trying to do I didn't get an error when I used the unquoted absolute path, by the way. I added ; pwd at the end of the command and the correct directory is displayed, however the directory I end up in is ~. There are no cd commands in my shell startup files. I tried putting a different cd somedir; pwd in ~/.ssh/rc (with the other still in place). The config command is executed before the motd is issued and the rc command is issued afterwards, but before the shell startup files are sourced. So again, it's happening in a different shell.

Try the passing-by-file technique and let me know if it works for you.

share|improve this answer

Have you enabled this directive in your ssh config?

PermitLocalCommand yes

The default for that is no, in which case your LocalCommand directive would be ignored.

Alternatively, have you tried adding the command to your .bashrc file?

share|improve this answer
    
That directive is set, yes (and I assume I wouldn't see the error message shown if it wasn't). The problem with using .bashrc is that the server has different host names, and I'd like different host names to translate to different starting directories –  Gareth Aug 5 '10 at 14:57
    
Unless each host name has a different IP address, there would be no way for the server to know which host name you requested. While HTTP requests provide a friendly Host: header to identify the requested host name, SSH connections do not. –  Fosco Aug 5 '10 at 19:42

Have you tried it without the quotes around it? The only examples I've seen don't have them so with them it could be trying to execute cd\ web as a command.

share|improve this answer
    
Ok, removing quotes seem to help but I still have errors (see edited post) –  Gareth Aug 5 '10 at 15:15

More robust solution for the case when you need to ssh and override default .bashrc file. This is useful in cases when remote server environment has multiple docroots and used by multiple users.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

More detailed:

  1. First command creates .bashrc_tmp file in /tmp directory on the remote server with a content cd /path/to/dir
  2. Next command executes bash with config file specified in step 1. This allows to switch to desired dir and suppress default .bashrc.
  3. This whole command is wrapped as an alias, so on ssh client command prompt it can be called as ssh_myserver
share|improve this answer

You could also try this, with the option -t :

ssh server -t "cd /my/remote/directory; bash"

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.