Minha abordagem preferida é usar o arquivo de configuração SSH (descrito abaixo), mas existem algumas soluções possíveis, dependendo do seu uso.
Argumentos da linha de comando
Acho que a melhor resposta para essa abordagem é a resposta de christianbundy à resposta aceita:
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
O uso de aspas duplas permitirá que você use variáveis de sua máquina local, a menos que elas escapem (como $SHELLaqui). Como alternativa, você pode usar aspas simples e todas as variáveis que você usar serão as da máquina de destino:
ssh -t example.com 'cd /foo/bar; exec $SHELL -l'
Função Bash
Você pode simplificar o comando envolvendo-o em uma função bash. Digamos que você queira apenas digitar isso:
sshcd example.com /foo/bar
Você pode fazer isso funcionar adicionando isso ao seu ~/.bashrc:
sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }
Se você estiver usando uma variável que existe na máquina remota para o diretório, escape-a ou coloque-a entre aspas simples. Por exemplo, isso fará o cd para o diretório que está armazenado na JBOSS_HOMEvariável na máquina remota:
sshcd example.com \$JBOSS_HOME
Arquivo de configuração SSH
Se você deseja ver esse comportamento o tempo todo para hosts específicos (ou qualquer) com o comando ssh normal sem precisar usar argumentos extras da linha de comando, defina as opções RequestTTYe RemoteCommandno seu arquivo de configuração ssh.
Por exemplo, eu gostaria de digitar apenas este comando:
ssh qaapps18
mas deseja que ele sempre se comporte como este comando:
ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'
Então eu adicionei isso ao meu ~/.ssh/configarquivo:
Host *apps*
RequestTTY yes
RemoteCommand cd $JBOSS_HOME; exec $SHELL
Agora, essa regra se aplica a qualquer host com "aplicativos" em seu nome de host.
Para mais informações, consulte http://man7.org/linux/man-pages/man5/ssh_config.5.html