it-swarm.com.ru

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

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

 localhost ~] $ ssh somehost 

 Добро пожаловать в somehost! 

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

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

 localhost ~] $ go_to_dir Foo 

 Добро пожаловать в somehost! 

 somehost Foo] $ 

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

185
Frosty

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

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

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


Объяснение

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

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

  • Если вы не используете -t, подсказка не появится. 
  • Если вы не добавите ; bash, соединение будет закрыто и вы вернете управление на локальный компьютер.
338
rogeriopvl

Вы могли бы добавить

cd /some/directory/somewhere/named/Foo

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

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

45
Chris Lutz

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

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

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

18
christianbundy

Основываясь на дополнениях к ответу @ 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 *

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

6
Bas Peeters

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

ssh [email protected]
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 [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
2
Mauricio Reis

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

2
Eddy

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

1
Drew

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

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

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

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

1
insomiac

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