Мне часто приходится заходить на один из нескольких серверов и заходить в один из нескольких каталогов на этих машинах. В настоящее время я делаю что-то в этом роде:
localhost ~] $ ssh somehost Добро пожаловать к кому-нибудь! somehost ~] $ cd / some / directory / где-то / named / Foo somehost Foo] $
У меня есть сценарии, которые могут определить, какой хост и в какой каталог мне нужно попасть, но я не могу найти способ сделать это:
localhost ~] $ go_to_dir Foo Добро пожаловать к кому-нибудь! somehost Foo] $
Есть ли простой, умный или какой-либо способ сделать это?
ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
ssh server -t "cd /my/remote/directory; bash --login"
Вы можете добавить
в ваш
.bashrc
файл (или.profile
как вы его называете) на другом хосте. Таким образом, независимо от того, что вы делаете или откуда выssh
, всякий раз, когда вы входите на этот сервер, онcd
попадает в нужный вам каталог, и все, что вам нужно сделать, это использоватьssh
как обычно.Конечно, решение rogeriopvl тоже работает, но оно немного более многословно, и вы должны помнить, чтобы делать это каждый раз (если вы не делаете псевдоним), так что оно кажется немного менее «забавным».
источник
Я последовательно создал инструмент для SSH и CD на сервере - метко названный sshcd . Для приведенного вами примера вы просто используете:
Дайте мне знать, если у вас есть какие-либо вопросы или проблемы!
источник
Мой предпочтительный подход заключается в использовании файла конфигурации SSH (описанного ниже), но есть несколько возможных решений в зависимости от вашего использования.
Аргументы командной строки
Я думаю, что лучший ответ для этого подхода - ответ Кристианбанди на принятый ответ:
Использование двойных кавычек позволит вам использовать переменные с вашего локального компьютера, если они не экранированы (как
$SHELL
здесь). В качестве альтернативы, вы можете использовать одинарные кавычки, и все переменные, которые вы используете, будут те, что на целевой машине:Функция Баш
Вы можете упростить команду, поместив ее в функцию bash. Допустим, вы просто хотите напечатать это:
Вы можете сделать это, добавив это в свой
~/.bashrc
:Если вы используете переменную, которая существует на удаленном компьютере для каталога, обязательно экранируйте ее или заключите в одинарные кавычки. Например, это перейдет в каталог, который хранится в
JBOSS_HOME
переменной на удаленном компьютере:Файл конфигурации SSH
Если вы хотите постоянно видеть такое поведение для определенных (или любых) хостов с помощью обычной команды ssh без необходимости использования дополнительных аргументов командной строки, вы можете установить параметры
RequestTTY
иRemoteCommand
в файле конфигурации ssh.Например, я хотел бы ввести только эту команду:
но хочу, чтобы он всегда вел себя так:
Поэтому я добавил это в мой
~/.ssh/config
файл:Теперь это правило применяется к любому хосту с «приложениями» в его имени хоста.
Для получения дополнительной информации см. Http://man7.org/linux/man-pages/man5/ssh_config.5.html.
источник
Основываясь на дополнениях к ответу @ rogeriopvl, я предлагаю следующее:
Объединение команд
&&
в команду заставит следующую команду выполняться только тогда, когда предыдущая была успешной (в отличие от использования;
, которое выполняет команды последовательно). Это особенно полезно, когда требуетсяcd
каталог, выполняющий команду.Представьте себе, что вы делаете следующее:
Каталог
teminal
не существует, поэтому вы остаетесь в домашнем каталоге и удаляете все файлы в нем с помощью следующей команды.Если вы используете
&&
:Команда не будет выполнена после того, как не найден каталог.
источник
В моем конкретном случае я просто хотел выполнить команду на удаленном хосте внутри определенного каталога с подчиненного компьютера Jenkins:
Но моя машина не смогла выполнить ssh (она не могла выделить псевдотермы, я полагаю) и заставила меня выдать следующую ошибку:
Я мог обойти эту проблему, передав «cd to dir + my command» в качестве параметра команды ssh (чтобы не выделять псевдо-терминал) и передав опцию -T, чтобы явно сообщить команде ssh, что я не сделал не нужно псевдо-терминальное распределение.
источник
Я использую переменную окружения CDPATH
источник
идти на шаг дальше с
-t
идеей. Я держу набор скриптов, вызывающих приведенный ниже, для перехода в определенные места на моих часто посещаемых хостах. Я держу их всех~/bin
и держу этот каталог на своем пути.источник
Другой способ перейти сразу после входа в систему - создать «Псевдоним». Когда вы входите в систему, просто введите этот псевдоним, и вы попадете в этот каталог.
Пример: Alias = myfolder '/ var / www / Folder'
После входа в систему введите этот псевдоним (это работает из любой части системы),
эта команда, если она не находится в bashrc, будет работать для текущего сеанса. Таким образом, вы также можете добавить этот псевдоним в bashrc, чтобы использовать его в будущем
$ myfolder => перенесет вас в эту папку
источник
Сам SSH предоставляет средства связи, он ничего не знает о каталогах. Поскольку вы можете указать, какую удаленную команду выполнять (это - по умолчанию - ваша оболочка), я бы начал с нее.
источник
просто измените ваш дом с помощью команды:
usermod -d /newhome username
источник