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

173

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

localhost ~]$ ssh somehost

Welcome to somehost!

somehost ~]$ cd /some/directory/somewhere/named/Foo
somehost Foo]$ 

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

localhost ~]$ go_to_dir Foo

Welcome to somehost!

somehost Foo]$

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

Теги:
scripting
ssh

13 ответов

314
Лучший ответ

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

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

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


объяснение

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

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

  • Если вы не используете -t подсказка не появится.
  • Если вы не добавите ; bash ; bash тогда соединение закроется и вернет управление на локальный компьютер
  • 0
    Выполнение снаряда в конце было последней частью головоломки. Спасибо.
  • 19
    в моем случае - это недостающая часть
Показать ещё 10 комментариев
47

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

cd /some/directory/somewhere/named/Foo

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

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

  • 1
    +1, это выглядит более подходящим, если вам нужен постоянный каталог вместо того, чтобы делать команду ssh более длинной, помня каждый раз, в какой каталог вы собираетесь перемещаться при подключении к машине X
18

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

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

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

  • 0
    Было бы здорово, если бы вы могли определить новый конфиг в ~ / .ssh / config и прочитать его оттуда;)
  • 0
    @Alexar github.com/fraction/sshcd/issues :)
5

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

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 *

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

  • 0
    Использовал одинарные кавычки, а не двойные кавычки с командой без && один раз, и это меня укусило, плохо ... выучил мой урок.
2

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

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

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

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"
2

Я использую переменную среды CDPATH

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

Я пытался проработать это между серверами Ubuntu некоторое время, используя базовые целевые узлы в ~/.ssh/config. Это работает:

$ ssh -t targetHost "cd /var/www/target-dir; bash"

где targetHost соответствует записи configs <Host targetHost.

1

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

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

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

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

0

Я пытаюсь получить доступ с хоста host1 к хосту host2 (aix) через ssh без пароля. пример: user1 @host1: ~ $ ssh [email protected]

Все в порядке, кроме одного:

Владельцем домашнего каталога пользователя на удаленной машине должен быть другой пользователь.

Когда я устанавливаю владельца user2 на /gl/user3/dir1/, все работает нормально:

ls -ld/gl/user3/dir1/

drwx------ 493 user3 gruv 36864 18 января 09:12/gl/user3/dir1/

но когда я меняю владельца, он не работает, даже подумав, что пользователи находятся в одной группе. И не может сменить владельца из-за того, что dir является основным dir.

0

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

Теперь это правило применяется к любому хосту с "apps" в его имени хоста.

Для получения дополнительной информации см. Http://man7.org/linux/man-pages/man5/ssh_config.5.html.

0

идем еще дальше с идеей -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"
0

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

  • 3
    Это частичный ответ, а не решение.
-5

просто измените свой дом командой: usermod -d /newhome username

  • 0
    Не рекомендуется Изменение вашего домашнего каталога может привести к поломке других вещей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню