Jak mogę ssh bezpośrednio do określonego katalogu?

248

Często muszę zalogować się na jednym z kilku serwerów i przejść do jednego z kilku katalogów na tych komputerach. Obecnie robię coś takiego:

localhost ~] $ ssh somehost

Witaj w Somehost!

somehost ~] $ cd / some / directory / somewhere / named / Foo
somehost Foo] $ 

Mam skrypty, które mogą określić, do którego hosta i do którego katalogu muszę się dostać, ale nie mogę znaleźć sposobu, aby to zrobić:

localhost ~] $ go_to_dir Foo

Witaj w Somehost!

somehost Foo] $

Czy jest na to łatwy, sprytny lub jakikolwiek sposób?

Mroźny
źródło

Odpowiedzi:

413

Możesz wykonać następujące czynności:

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

W ten sposób otrzymasz powłokę bezpośrednio na katalog_zamówiony.


Wyjaśnienie

-tWymuś alokację pseudoterminalową. Można to wykorzystać do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu.

Wiele -topcji wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty.

  • Jeśli nie użyjesz, -tnie pojawi się monit.
  • Jeśli nie dodasz, ; bashpołączenie zostanie zamknięte i przywróci kontrolę na twoim komputerze lokalnym
rogeriopvl
źródło
21
w moim przypadku - brakująca część
Mathieu,
2
Korzystając z tego podejścia, plik .bash_profile nie jest odczytywany, ktoś wie dlaczego?
Filipe
8
Musiałem to zrobić: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron
40
Zwykle będziesz chciał powłoki logowania:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy
10
Chciałem tylko połączyć katalog zmian automatycznie przy logowaniu ssh - Błąd serwera ; i stamtąd wklej to polecenie (które jest wersją tego autorstwa @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Możesz dodać

cd /some/directory/somewhere/named/Foo

do twojego .bashrcpliku (lub .profilejakkolwiek go nazwiesz) na drugim hoście. W ten sposób, bez względu na to, co robisz i skąd jesteś ssh, za każdym razem, gdy logujesz się na ten serwer, trafi on cddo odpowiedniego katalogu dla Ciebie, a wszystko, co musisz zrobić, to używać sshjak zwykle.

Klątwa, rozwiązanie Rogeriopvla również działa, ale jest nieco bardziej szczegółowe i musisz pamiętać, aby robić to za każdym razem (chyba że utworzysz alias), więc wydaje się to nieco mniej „zabawne”.

Chris Lutz
źródło
1
+1, to wydaje się bardziej odpowiednie, jeśli potrzebujesz stałego katalogu zamiast dłuższego zapamiętywania polecenia ssh za każdym razem, do którego katalogu chcesz się przenieść po połączeniu z maszyną X
Tebe
Nieprawidłowe przy elastycznej zmianie
Lewis Chan,
21

Stworzyłem narzędzie do SSH i CD na serwerze kolejno - trafnie o nazwie sshcd . W podanym przykładzie wystarczy użyć:

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

Daj mi znać, jeśli masz jakieś pytania lub problemy!

christianbundy
źródło
1
Byłoby fajnie, gdybyś mógł zdefiniować nową konfigurację w ~ / .ssh / config i przeczytać ją stamtąd;)
Alexar
21

Moim preferowanym podejściem jest użycie pliku konfiguracyjnego SSH (opisanego poniżej), ale istnieje kilka możliwych rozwiązań w zależności od twoich zastosowań.

Argumenty wiersza poleceń

Myślę, że najlepszą odpowiedzią na to podejście jest odpowiedź Christianbundy na zaakceptowaną odpowiedź:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

Użycie podwójnych cudzysłowów pozwoli ci używać zmiennych z twojego komputera lokalnego, chyba że są one oznaczone znakami ucieczki (jak $SHELLtutaj). Alternatywnie możesz użyć pojedynczych cudzysłowów, a wszystkie używane zmienne będą tymi z maszyny docelowej:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

Funkcja Bash

Możesz uprościć polecenie, zawijając je w funkcji bash. Powiedzmy, że chcesz po prostu wpisać:

sshcd example.com /foo/bar

Możesz sprawić, by to działało, dodając to do ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

Jeśli używasz zmiennej, która istnieje na zdalnej maszynie dla katalogu, pamiętaj, aby ją zmienić lub umieścić w cudzysłowie. Na przykład spowoduje to przejście do katalogu przechowywanego w JBOSS_HOMEzmiennej na zdalnym komputerze:

sshcd example.com \$JBOSS_HOME

Plik konfiguracyjny SSH

Jeśli chcesz widzieć to zachowanie przez cały czas dla określonych (lub dowolnego) hosta z normalnym poleceniem ssh bez konieczności używania dodatkowych argumentów wiersza poleceń, możesz ustawić opcje RequestTTYi RemoteCommandw pliku konfiguracyjnym ssh.

Na przykład chciałbym wpisać tylko to polecenie:

ssh qaapps18

ale chcę, aby zawsze zachowywał się tak:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

Więc dodałem to do mojego ~/.ssh/configpliku:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

Teraz ta reguła dotyczy dowolnego hosta z „aplikacjami” w nazwie hosta.

Aby uzyskać więcej informacji, zobacz http://man7.org/linux/man-pages/man5/ssh_config.5.html

Rysował
źródło
13

Opierając się na dodatkach do odpowiedzi @ rogeriopvl, sugeruję, co następuje:

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

Łączenie łańcuchów poleceń &&spowoduje, że następne polecenie zostanie uruchomione tylko wtedy, gdy poprzednie zakończyło się powodzeniem (w przeciwieństwie do używania ;, które wykonuje polecenia sekwencyjnie). Jest to szczególnie przydatne, gdy trzeba przejść cddo katalogu wykonującego polecenie.

Wyobraź sobie, że wykonujesz następujące czynności:

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

Katalog teminalnie istnieje, co powoduje, że pozostajesz w katalogu domowym i usuwasz wszystkie znajdujące się tam pliki za pomocą następującego polecenia.

Jeśli używasz &&:

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

Polecenie zakończy się niepowodzeniem po nie znalezieniu katalogu.

Bas Peeters
źródło
1
Użyłem pojedynczych cudzysłowów, a nie podwójnych cudzysłowów z poleceniem bez && raz i to mnie ugryzło w tyłek, źle ... nauczyłem się mojej lekcji.
Gavin Pickin,
4

W moim bardzo szczególnym przypadku chciałem po prostu wykonać polecenie na zdalnym hoście, w określonym katalogu z maszyny slave Jenkinsa:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Ale mój komputer nie mógł wykonać ssh (chyba nie mógł przydzielić pseudo-tty) i sprawił, że podałem następujący błąd:

Pseudo-terminal will not be allocated because stdin is not a terminal

Mógłbym obejść ten problem, przekazując „cd do katalogu + moje polecenie” jako parametr polecenia ssh (aby nie musieć alokować pseudo-terminala) i przekazując opcję -T, aby wyraźnie powiedzieć komendzie ssh, że nie zrobiłem nie trzeba przydzielać pseudoterminalu.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Mauricio Reis
źródło
3

Używam zmiennej środowiskowej CDPATH

Wir
źródło
Przydatne tylko wtedy, gdy byłem zainteresowany jednym katalogiem na maszynę. Potrzebuję sposobu na przekazanie informacji do zdalnego komputera. Rozwiązanie Rogera właśnie to robi.
Frosty
2

pójść o krok dalej z -tpomysłem. Trzymam zestaw skryptów wywołujących ten poniżej, aby przejść do określonych miejsc na moich często odwiedzanych hostach. Trzymam je wszystkie ~/bini trzymam ten katalog na swojej ścieżce.

#!/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"
DKebler
źródło
1

Innym sposobem przejścia bezpośrednio po zalogowaniu jest utworzenie „Aliasu”. Po zalogowaniu się do systemu po prostu wpisz ten alias, a znajdziesz się w tym katalogu.

Przykład: Alias ​​= mójfolder '/ var / www / Folder'

Po zalogowaniu się do swojego typu systemu, alias (działa z dowolnej części systemu)
to polecenie, jeśli nie jest w bashrc, będzie działać dla bieżącej sesji. Możesz więc dodać ten alias do bashrc, aby użyć go w przyszłości

$ myfolder => zabierze Cię do tego folderu

insomiac
źródło
-3

Sam SSH zapewnia środki komunikacji, nie wie nic o katalogach. Ponieważ możesz określić, które polecenie zdalne ma zostać wykonane (domyślnie jest to twoja powłoka), zacznę od tego.

Jan Jungnickel
źródło
4
To jest częściowa odpowiedź, a nie rozwiązanie.
AL
-7

po prostu zmodyfikuj swój dom za pomocą polecenia: usermod -d /newhome username

Borja Moll
źródło
1
Nie jest zalecane Zmiana katalogu domowego prawdopodobnie spowoduje uszkodzenie innych rzeczy.
bronson,