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?
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"
Możesz dodać
do twojego
.bashrc
pliku (lub.profile
jakkolwiek 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 oncd
do odpowiedniego katalogu dla Ciebie, a wszystko, co musisz zrobić, to używaćssh
jak 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”.
źródło
Stworzyłem narzędzie do SSH i CD na serwerze kolejno - trafnie o nazwie sshcd . W podanym przykładzie wystarczy użyć:
Daj mi znać, jeśli masz jakieś pytania lub problemy!
źródło
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ź:
Użycie podwójnych cudzysłowów pozwoli ci używać zmiennych z twojego komputera lokalnego, chyba że są one oznaczone znakami ucieczki (jak
$SHELL
tutaj). Alternatywnie możesz użyć pojedynczych cudzysłowów, a wszystkie używane zmienne będą tymi z maszyny docelowej:Funkcja Bash
Możesz uprościć polecenie, zawijając je w funkcji bash. Powiedzmy, że chcesz po prostu wpisać:
Możesz sprawić, by to działało, dodając to do
~/.bashrc
: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_HOME
zmiennej na zdalnym komputerze: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
RequestTTY
iRemoteCommand
w pliku konfiguracyjnym ssh.Na przykład chciałbym wpisać tylko to polecenie:
ale chcę, aby zawsze zachowywał się tak:
Więc dodałem to do mojego
~/.ssh/config
pliku: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
źródło
Opierając się na dodatkach do odpowiedzi @ rogeriopvl, sugeruję, co następuje:
Łą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śćcd
do katalogu wykonującego polecenie.Wyobraź sobie, że wykonujesz następujące czynności:
Katalog
teminal
nie 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
&&
:Polecenie zakończy się niepowodzeniem po nie znalezieniu katalogu.
źródło
W moim bardzo szczególnym przypadku chciałem po prostu wykonać polecenie na zdalnym hoście, w określonym katalogu z maszyny slave Jenkinsa:
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:
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.
źródło
Używam zmiennej środowiskowej CDPATH
źródło
pójść o krok dalej z
-t
pomysł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~/bin
i trzymam ten katalog na swojej ścieżce.źródło
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
źródło
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.
źródło
po prostu zmodyfikuj swój dom za pomocą polecenia:
usermod -d /newhome username
źródło