Моїм переважним підходом є використання конфігураційного файлу 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"; }
Якщо ви використовуєте змінну, яка існує на віддаленій машині для каталогу, не забудьте уникнути її або поставити її в окремі лапки. Наприклад, це буде CD в каталог, який зберігається у 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