Как я могу SSH напрямую в определенный каталог?

248

Мне часто приходится заходить на один из нескольких серверов и заходить в один из нескольких каталогов на этих машинах. В настоящее время я делаю что-то в этом роде:

localhost ~] $ ssh somehost

Добро пожаловать к кому-нибудь!

somehost ~] $ cd / some / directory / где-то / named / Foo
somehost Foo] $ 

У меня есть сценарии, которые могут определить, какой хост и в какой каталог мне нужно попасть, но я не могу найти способ сделать это:

localhost ~] $ go_to_dir Foo

Добро пожаловать к кому-нибудь!

somehost Foo] $

Есть ли простой, умный или какой-либо способ сделать это?

морозный
источник

Ответы:

413

Вы можете сделать следующее:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

Таким образом, вы получите оболочку прямо на directory_wanted.


объяснение

-tПринудительное псевдо-терминальное размещение. Это может быть использовано для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню.

Несколько -tопций принудительно распределяют tty, даже если ssh не имеет локального tty.

  • Если вы не используете, -tто не появится приглашение.
  • Если вы не добавите, ; bashсоединение будет закрыто и вы вернете управление на локальный компьютер.
rogeriopvl
источник
21
в моем случае - это недостающая часть
Матье
2
При использовании этого подхода .bash_profile не читается, кто-нибудь знает почему?
Филипе
8
Я должен был сделать это: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
Гуптрон
40
Обычно вам потребуется оболочка для входа:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy
10
Просто хотел связать изменение каталога автоматически при входе в систему через ssh - Ошибка сервера ; и оттуда вставьте эту команду (которая является версией @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Вы можете добавить

cd /some/directory/somewhere/named/Foo

в ваш .bashrcфайл (или .profileкак вы его называете) на другом хосте. Таким образом, независимо от того, что вы делаете или откуда вы ssh, всякий раз, когда вы входите на этот сервер, он cdпопадает в нужный вам каталог, и все, что вам нужно сделать, это использовать sshкак обычно.

Конечно, решение rogeriopvl тоже работает, но оно немного более многословно, и вы должны помнить, чтобы делать это каждый раз (если вы не делаете псевдоним), так что оно кажется немного менее «забавным».

Крис Лутц
источник
1
+1, это выглядит более подходящим, если вам нужен постоянный каталог вместо того, чтобы делать команду ssh более длинной, помня каждый раз, в какой каталог вы собираетесь перемещаться при подключении к машине X
Tebe
Не правильно при гибком изменении
Льюис Чен
21

Я последовательно создал инструмент для SSH и CD на сервере - метко названный sshcd . Для приведенного вами примера вы просто используете:

sshcd somehost:/some/directory/somewhere/named/Foo

Дайте мне знать, если у вас есть какие-либо вопросы или проблемы!

christianbundy
источник
1
Было бы здорово, если бы вы могли определить новый конфиг в ~ / .ssh / config и прочитать его оттуда;)
Алексар
21

Мой предпочтительный подход заключается в использовании файла конфигурации 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.

Нарисовался
источник
13

Основываясь на дополнениях к ответу @ rogeriopvl, я предлагаю следующее:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

Объединение команд &&в команду заставит следующую команду выполняться только тогда, когда предыдущая была успешной (в отличие от использования ;, которое выполняет команды последовательно). Это особенно полезно, когда требуется cdкаталог, выполняющий команду.

Представьте себе, что вы делаете следующее:

/home/me$ cd /usr/share/teminal; rm -R *

Каталог teminalне существует, поэтому вы остаетесь в домашнем каталоге и удаляете все файлы в нем с помощью следующей команды.

Если вы используете &&:

/home/me$ cd /usr/share/teminal && rm -R *

Команда не будет выполнена после того, как не найден каталог.

Бас Питерс
источник
1
Использовал одинарные кавычки, а не двойные кавычки с командой без && один раз, и это меня укусило, плохо ... выучил мой урок.
Гэвин Пикин
4

В моем конкретном случае я просто хотел выполнить команду на удаленном хосте внутри определенного каталога с подчиненного компьютера Jenkins:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Но моя машина не смогла выполнить ssh (она не могла выделить псевдотермы, я полагаю) и заставила меня выдать следующую ошибку:

Pseudo-terminal will not be allocated because stdin is not a terminal

Я мог обойти эту проблему, передав «cd to dir + my command» в качестве параметра команды ssh (чтобы не выделять псевдо-терминал) и передав опцию -T, чтобы явно сообщить команде ssh, что я не сделал не нужно псевдо-терминальное распределение.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Маурисио Рейс
источник
3

Я использую переменную окружения CDPATH

Эдди
источник
Полезно, только если меня интересует один каталог на машину. Мне нужен способ передать информацию на удаленный компьютер. Решение Роджера делает именно это.
Морозное
2

идти на шаг дальше с -tидеей. Я держу набор скриптов, вызывающих приведенный ниже, для перехода в определенные места на моих часто посещаемых хостах. Я держу их всех ~/binи держу этот каталог на своем пути.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"
DKebler
источник
1

Другой способ перейти сразу после входа в систему - создать «Псевдоним». Когда вы входите в систему, просто введите этот псевдоним, и вы попадете в этот каталог.

Пример: Alias ​​= myfolder '/ var / www / Folder'

После входа в систему введите этот псевдоним (это работает из любой части системы),
эта команда, если она не находится в bashrc, будет работать для текущего сеанса. Таким образом, вы также можете добавить этот псевдоним в bashrc, чтобы использовать его в будущем

$ myfolder => перенесет вас в эту папку

insomiac
источник
-3

Сам SSH предоставляет средства связи, он ничего не знает о каталогах. Поскольку вы можете указать, какую удаленную команду выполнять (это - по умолчанию - ваша оболочка), я бы начал с нее.

Ян Юнгникель
источник
4
Это частичный ответ, а не решение.
AL
-7

просто измените ваш дом с помощью команды: usermod -d /newhome username

Борха Молл
источник
1
Не рекомендуется Изменение вашего домашнего каталога может привести к поломке других вещей.
бронсон