2009-03-09 2 views
149

Мне часто приходится заходить на один из нескольких серверов и перейти к одному из нескольких каталогов на этих машинах. В настоящее время я делаю что-то в этом роде:Как я могу передать 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]$ 

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

ответ

271

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

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

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


Объяснение

-t  Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. 
      Multiple -t options force tty allocation, even if ssh has no local tty. 
  • Если вы не используете -t то не появится никаких запросов.
  • Если вы не добавите ; bash, то соединение будет свернуто и вернуть управление локальной машины
+0

Выполнение оболочки в конце было последней частью головоломки. Спасибо. – Frosty

+18

в моем случае -t недостающая часть – Mathieu

+2

Я использовал «csh» вместо «bash» в конце, потому что моя оболочка была csh. Просто заметьте! – quantum

-1

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

+3

Это частичный ответ, а не решение. –

2

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

+0

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

40

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

cd /some/directory/somewhere/named/Foo 

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

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

+1

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

1

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

Пример: Alias ​​= моя_папка «/ вар/WWW/Папка»

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

$ моя_папка => приведет вас к этой папке

14

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

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

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

+0

Было бы здорово, если бы вы могли определить новую конфигурацию в ~ /. ssh/config и прочитать его оттуда;) – Alexar

+0

@Alexar https://github.com/fraction/sshcd/issues :) – christianbundy

-5

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

+0

Не рекомендуется. Изменение домашнего каталога, вероятно, приведет к разрыву других вещей. – bronson

0

В моей очень конкретном случае, я просто хотел, чтобы выполнить команду на удаленном хосте, внутри определенной директории от ведомой машины Дженкинс:

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

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

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

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" 
Смежные вопросы