Мой предпочтительный подход - использовать конфигурационный файл SSH (описан ниже), но есть несколько возможных решений в зависимости от вашего использования.
Аргументы командной строки
Я думаю, что лучший ответ для этого подхода - ответ Кристианбанди на принятый ответ:
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
Использование двойных кавычек позволит вам использовать переменные с вашего локального компьютера, если только они не экранированы (так как $SHELL
здесь). В качестве альтернативы, вы можете использовать одинарные кавычки, и все переменные, которые вы используете, будут такими же, как на целевом компьютере:
ssh -t example.com 'cd /foo/bar; exec $SHELL -l'
Функция Bash
Вы можете упростить команду, поместив ее в функцию bash. Допустим, вы просто хотите напечатать это:
sshcd example.com /foo/bar
Вы можете сделать эту работу, добавив это к своему ~/.bashrc
:
sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }
Если вы используете переменную, которая существует на удаленном компьютере для каталога, обязательно экранируйте ее или заключите в одинарные кавычки. Например, это перейдет в каталог, который хранится в переменной JBOSS_HOME
на удаленном компьютере:
sshcd example.com \$JBOSS_HOME
Файл конфигурации SSH
Если вы хотите постоянно видеть это поведение для определенных (или любых) хостов с помощью обычной команды ssh без необходимости использовать дополнительные аргументы командной строки, вы можете установить опции RequestTTY
и RemoteCommand
в вашем Конфигурационный файл ssh.
Например, я хотел бы набрать только эту команду:
ssh qaapps18
но хотите, чтобы он всегда вел себя так:
ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'
Итак, я добавил это в мой ~/.ssh/config
файл:
Host *apps*
RequestTTY yes
RemoteCommand cd $JBOSS_HOME; exec $SHELL
Теперь это правило применяется к любому хосту с «apps» в имени хоста.
Для получения дополнительной информации см. http://man7.org/linux/man-pages/man5/ssh_config.5.html