Мой предпочтительный подход заключается в использовании файла конфигурации SSH (описанного ниже), но есть несколько возможных решений в зависимости от вашего использования.
Аргументы командной строки
Я думаю, что лучший ответ для этого подхода - ответ Кристианбанди на принятый ответ:
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
Использование двойных кавычек позволит вам использовать переменные с вашего локального компьютера, если они не экранированы (как $SHELL
здесь). В качестве альтернативы, вы можете использовать одинарные кавычки, и все переменные, которые вы используете, будут те, что на целевой машине:
ssh -t example.com 'cd /foo/bar; exec $SHELL -l'
Функция Баш
Вы можете упростить команду, поместив ее в функцию 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
Теперь это правило применяется к любому хосту с «приложениями» в его имени хоста.
Для получения дополнительной информации см. Http://man7.org/linux/man-pages/man5/ssh_config.5.html.