Как я могу передать ssh непосредственно в конкретный каталог?
Мне часто приходится заходить на один из нескольких серверов и переходить в один из нескольких каталогов на этих машинах. В настоящее время я делаю что-то в этом роде:
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]$
Есть ли простой, умный или любой способ сделать это?
Ответы
Ответ 1
Вы можете сделать следующее:
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"
Таким образом, вы получите оболочку прямо на directory_wanted.
объяснение
-t
Принудительное псевдо -t окончательное распределение. Это может использоваться для выполнения произвольных программ на экране на удаленном компьютере, что может быть очень полезно, например, при реализации сервисов меню.
Несколько -t
принудительно распределяют tty, даже если ssh не имеет локального tty.
- Если вы не используете
-t
подсказка не появится. - Если вы не добавите
; bash
; bash
тогда соединение закроется и вернет управление на локальный компьютер
Ответ 2
Вы можете добавить
cd /some/directory/somewhere/named/Foo
к вашему файлу .bashrc
(или .profile
или тому, что вы его называете) на другом хосте. Таким образом, независимо от того, что вы делаете или где вы ssh
, при каждом входе на этот сервер, он будет cd
в соответствующий каталог для вас, и все, что вам нужно сделать, это использовать ssh
, как обычно.
Проклятие, решение rogeriopvl тоже работает, но оно немного более подробное, и вы должны помнить, что нужно делать это каждый раз (если вы не делаете псевдоним), поэтому кажется немного менее "забавным".
Ответ 3
Я создал инструмент для SSH и CD на сервере последовательно - метко названный sshcd. В примере, который вы указали, вы просто используете:
sshcd somehost:/some/directory/somewhere/named/Foo
Сообщите мне, есть ли у вас какие-либо вопросы или проблемы!
Ответ 4
Основываясь на дополнениях к @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 *
Команда не будет работать после того, как не найдет каталог.
Ответ 5
Я использую переменную среды CDPATH
Ответ 6
В моем конкретном случае я просто хотел выполнить команду на удаленном узле внутри конкретного каталога с ведомого устройства Jenkins:
ssh [email protected]
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 [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Ответ 7
Другой способ перехода непосредственно после входа в систему - создать "Псевдоним". При входе в систему просто введите этот псевдоним, и вы попадете в этот каталог.
Пример: Alias = myfolder '/var/www/Folder'
После входа в систему введите этот псевдоним (это работает с любой частью системы)
эта команда, если не в bashrc, будет работать для текущего сеанса. Таким образом, вы также можете добавить этот псевдоним к bashrc, чтобы использовать его в будущем
$myfolder = > переносит вас в эту папку
Ответ 8
Я пытался проработать это между серверами Ubuntu некоторое время, используя базовые целевые узлы в ~/.ssh/config
. Это работает:
$ ssh -t targetHost "cd /var/www/target-dir; bash"
где targetHost
соответствует записи configs <Host targetHost
.
Ответ 9
идем еще дальше с идеей -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"
Ответ 10
Мой предпочтительный подход заключается в использовании файла конфигурации 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.
Ответ 11
Я пытаюсь получить доступ с хоста 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.
Ответ 12
Сам SSH предоставляет средства коммуникации, он ничего не знает о каталогах. Поскольку вы можете указать, какую удаленную команду выполнить (это - по умолчанию - ваша оболочка), я бы начал там.
Ответ 13
просто измените свой дом командой:
usermod -d /newhome username