Как я могу SSH напрямую в конкретный каталог? - PullRequest
200 голосов
/ 09 марта 2009

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

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]$

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

Ответы [ 11 ]

353 голосов
/ 09 марта 2009

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

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

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


Объяснение

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

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

  • Если вы не используете -t, приглашение не появится.
  • Если вы не добавите ; bash, соединение закроется и вернет управление на локальный компьютер
45 голосов
/ 09 марта 2009

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

cd /some/directory/somewhere/named/Foo

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

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

18 голосов
/ 12 февраля 2014

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

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

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

7 голосов
/ 14 декабря 2017

На основании дополнений к ответу @ 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 *

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

4 голосов
/ 17 января 2019

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

Если вы используете переменную, которая существует на удаленном компьютере для каталога, обязательно экранируйте ее или заключите в одинарные кавычки. Например, это перейдет в каталог, который хранится в переменной 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

2 голосов
/ 13 июня 2017

В моем конкретном случае я просто хотел выполнить команду на удаленном хосте внутри определенного каталога с подчиненного компьютера 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 голосов
/ 09 марта 2009

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

0 голосов
/ 25 февраля 2018

идет на шаг вперед с идеей -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 голосов
/ 16 июня 2016

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

0 голосов
/ 19 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...