Як я можу перенести ssh безпосередньо до певного каталогу?


248

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

localhost ~] $ ssh деякий господар

Ласкаво просимо до когось!

somehost ~] $ cd / деякий / каталог / десь / названий / Foo
somehost Foo] $ 

У мене є сценарії, які можуть визначити, до якого хоста та до якого каталогу мені потрібно потрапити, але я не можу знайти спосіб для цього:

localhost ~] $ go_to_dir Фо

Ласкаво просимо до когось!

somehost Foo] $

Чи є легкий, розумний чи будь-який спосіб це зробити?

Відповіді:


413

Ви можете зробити наступне:

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

Таким чином, ви отримаєте оболонку прямо в каталозі_вишуканий.


Пояснення

-tПримусове розподілення псевдотерміналів. Це можна використовувати для виконання довільних екранних програм на віддаленій машині, що може бути дуже корисно, наприклад, при реалізації служб меню.

Кілька -tопцій примушують розподілити tty, навіть якщо ssh не має локальних tty.

  • Якщо ви не скористаєтеся, -tне з’явиться запит.
  • Якщо ви не додасте, ; bashто з'єднання закриється та поверне контроль до вашої локальної машини

21
у моєму випадку - про відсутність
Матьє

2
При використанні такого підходу .bash_profile не читається, хтось знає чому?
Філіпе

8
Мені довелося це зробити: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
Гуптрон

40
Зазвичай вам потрібна оболонка для входу:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
Крістіанбундія,

10
Просто хотів автоматично зв’язати каталог змін під час входу в ssh - Помилка сервера ; і звідти вставити цю команду (яка є версією тієї, яку написав @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

Ви можете додати

cd /some/directory/somewhere/named/Foo

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

Прокляття, рішення rogeriopvl теж працює, але це трохи більше багатослівних, і ви повинні пам'ятати, що робити це кожен раз (якщо ви не робите псевдонім), тому це здається трохи менш "веселим".


1
+1, це виглядає більш підходящим, якщо вам потрібен постійний каталог, замість того, щоб команда ssh довше запам'ятовувала, до якого каталогу ви збираєтеся перейти під час підключення до машини X
Tebe

Не правильно при гнучкому зміні
Льюїс Чан

21

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

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

Повідомте мене, якщо у вас є питання або проблеми!


1
Було б здорово, якби ви могли визначити нову конфігурацію в ~ / .ssh / config та прочитати її звідти;)
Alexar

21

Моїм переважним підходом є використання конфігураційного файлу 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"; }

Якщо ви використовуєте змінну, яка існує на віддаленій машині для каталогу, не забудьте уникнути її або поставити її в окремі лапки. Наприклад, це буде CD в каталог, який зберігається у 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


13

На основі доповнень до відповіді @ rogeriopvl пропоную наступне:

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

Об'єднання команд by &&зробить наступну команду запущеною лише тоді, коли попередня була успішною (на відміну від використання ;, яка виконує команди послідовно). Це особливо корисно, коли потрібно звернутися cdдо каталогу, який виконує команду.

Уявіть, що ви робите наступне:

/home/me$ cd /usr/share/teminal; rm -R *

Каталог teminalне існує, через що ви залишаєтеся в домашньому каталозі та видаляєте всі файли там із наступною командою.

Якщо ви використовуєте &&:

/home/me$ cd /usr/share/teminal && rm -R *

Команда не вдасться після пошуку каталогу.


1
Використовували одинарні лапки, а не подвійні лапки з командою без && раз, і це вкусило мене в зад, погано ... навчився мого уроку.
Гевін Пікін

4

У моєму дуже конкретному випадку я просто хотів виконати команду у віддаленому хості, у певному каталозі з рабовласницької машини Дженкінса:

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"

3

Я використовую змінну середовища CDPATH


Корисно лише, якщо мене зацікавив один каталог на кожній машині. Мені потрібен спосіб передачі інформації на віддалений апарат. Рішення Роджера робить саме це.
Морозний

2

піти на крок далі з -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"

1

Ще один спосіб переходу безпосередньо після входу в систему - створити "Псевдонім". Коли ви ввійдете в систему, просто введіть цей псевдонім, і ви опинитеся в цьому каталозі.

Приклад: псевдонім = myfolder '/ var / www / Folder'

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

$ myfolder => переведе вас у цю папку


-3

Сам SSH забезпечує засіб спілкування, він нічого не знає про каталоги. Оскільки ви можете вказати, яку віддалену команду виконувати (це - за замовчуванням - ваша оболонка), я би почав з цього місця.


4
Це часткова відповідь, а не рішення.
AL

-7

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


1
Не радить. Зміна домашнього каталогу, ймовірно, призведе до порушення інших речей.
Бронсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.