Jak SSH do określonego katalogu?

39

Często loguję się na serwerze, a następnie cd do określonego katalogu. Czy można uprościć te dwa polecenia w jedno?

ssh bob@foo  
cd /home/guest

Jeśli to możliwe, chciałbym uniknąć zmiany czegokolwiek w „foo”, ponieważ będę musiał to wyczyścić z administratorem serwera. Używam bash, ale jestem otwarty na odpowiedzi w innych powłokach.

spuder
źródło

Odpowiedzi:

22

Po prostu wstaw jako ostatni wiersz pliku ~ bob / .bash_profile na foo:

cd /home/guest >& /dev/null

Teraz przy każdym logowaniu (przez SSH lub w inny sposób) uruchomi się polecenie cd. Nie jest konieczne używanie funkcji ssh dookoła.

Wiem, że napisałeś, że „chciałbyś uniknąć zmieniania czegokolwiek w„ foo ”, jeśli to możliwe”, ale jeśli konto bob @ foo jest twoje, zmiana własnego .bash_profile powinna być akceptowalna, nie?

DanB
źródło
2
Dlaczego tak, myślę, że to zadziała świetnie. Nie będę musiał uzyskać zgody działu IT, aby dokonać tej zmiany. Czy możesz wyjaśnić, dlaczego potrzebujesz> & / dev / null?
spuder
6
Myślę, że tak powinno być &> /dev/null. Zapobiega wyświetlaniu się komunikatów o błędach na wypadek, gdyby cd nie zmienił katalogu na katalog / home /. Jeśli chcesz zobaczyć te wiadomości, możesz to po prostu wykluczyć.
konsolebox
5
>&i &>są takie same w Bash. Ten ostatni styl jest jednak preferowany.
Dodatkowo przekierowanie do / dev / null zapobiega wyświetlaniu na ekranie nazwy katalogu, co może zrobić „cd”.
DanB
41

Działa to z OpenSSH:

ssh -t bob@foo 'cd /home/guest && exec bash -l'

Ostatni argument działa w powłoce logowania. -tFlaga przekazane sshsiły sshprzydzielić pseudo-koniec, który jest niezbędny dla interaktywnej powłoki. -lFlaga przekazana do bashstartów bash jako powłokę logowania .

Społeczność
źródło
3
Zastanawiam się, czy dodanie opcji -l do bash również byłoby pomocne? ... && exec bash -l
konsolebox
1
@konsolebox: To dobry pomysł. Dodałem to do mojej odpowiedzi.
17

Możesz to zrobić w ten sposób, podobnie jak w rozwiązaniu @ EvanTeitelman:

$ ssh -t bob@foo "cd /tmp ; bash"

Lub jeśli nie znasz powłoki na drugim końcu:

$ ssh -t bob@foo "cd /tmp && exec \$SHELL"

Lub tak:

$ ssh -t bob@foo 'cd /tmp && exec $SHELL'
slm
źródło