Come posso ssh direttamente in una directory particolare?


248

Spesso devo accedere a uno dei numerosi server e passare a una delle numerose directory su quelle macchine. Attualmente faccio qualcosa del genere:

localhost ~] $ ssh somehost

Benvenuto in somehost!

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

Ho degli script che possono determinare in quale host e in quale directory devo accedere ma non riesco a trovare un modo per farlo:

localhost ~] $ go_to_dir Foo

Benvenuto in somehost!

somehost Foo] $

C'è un modo semplice, intelligente o per farlo?

Risposte:


413

Puoi fare quanto segue:

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

In questo modo, otterrai una shell direttamente su directory_wanted.


Spiegazione

-tForza l'allocazione pseudo-terminale. Questo può essere usato per eseguire programmi arbitrari basati su schermo su una macchina remota, il che può essere molto utile, ad esempio quando si implementano servizi di menu.

Le -topzioni multiple impongono l'allocazione di tty, anche se ssh non ha tty locale.

  • Se non si utilizza, -tnon verrà visualizzato alcun prompt.
  • Se non aggiungi, ; bashla connessione verrà chiusa e restituirà il controllo al tuo computer locale

21
nel mio caso - la parte mancante
Mathieu il

2
Quando si utilizza questo approccio il .bash_profile non viene letto, qualcuno sa perché?
Filipe,

8
Ho dovuto fare questo: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
Guptron,

40
Di solito vorrai una shell di login:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy,

10
Volevo solo collegare automaticamente la directory di modifica al login ssh - Server Fault ; e da lì incolla questo comando (che è una versione di quello di @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau,

53

Potresti aggiungere

cd /some/directory/somewhere/named/Foo

al tuo .bashrcfile (o come .profilelo chiami) all'altro host. In questo modo, indipendentemente da cosa fai o da dove vieni ssh, ogni volta che accedi a quel server, andrà cdnella directory corretta per te, e tutto ciò che devi fare è usare sshcome al solito.

Di maledizione, anche la soluzione di rogeriopvl funziona, ma è un po 'più dettagliata, e devi ricordarti di farlo ogni volta (a meno che tu non faccia un alias), quindi sembra un po' meno "divertente".


1
+1, questo sembra più adatto se hai bisogno di una directory costante invece di rendere più lungo il comando ssh ricordando ogni volta in quale directory ti sposterai quando ti connetti alla macchina X
Tebe

Non corretto quando si cambia in modo flessibile
Lewis Chan,

21

Ho creato uno strumento per SSH e CD in un server consecutivamente - giustamente chiamato sshcd . Per l'esempio che hai dato, useresti semplicemente:

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

Fammi sapere se hai domande o problemi!


1
Sarebbe bello se tu potessi definire una nuova configurazione in ~ / .ssh / config e leggerla da lì;)
Alexar,

21

Il mio approccio preferito è usare il file di configurazione SSH (descritto di seguito), ma ci sono alcune possibili soluzioni a seconda dei tuoi usi.

Argomenti della riga di comando

Penso che la migliore risposta per questo approccio sia la risposta di christianbundy alla risposta accettata:

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

L'uso di virgolette doppie ti consentirà di utilizzare le variabili dal tuo computer locale, a meno che non siano salvate (come $SHELLqui). In alternativa, è possibile utilizzare virgolette singole e tutte le variabili utilizzate saranno quelle della macchina target:

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

Funzione Bash

Puoi semplificare il comando avvolgendolo in una funzione bash. Diciamo che vuoi solo digitare questo:

sshcd example.com /foo/bar

Puoi farlo funzionare aggiungendolo al tuo ~/.bashrc:

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

Se si utilizza una variabile esistente sul computer remoto per la directory, assicurarsi di evitarlo o di inserirlo tra virgolette singole. Ad esempio, questo eseguirà il cd nella directory memorizzata nella JBOSS_HOMEvariabile sul computer remoto:

sshcd example.com \$JBOSS_HOME

File di configurazione SSH

Se desideri vedere questo comportamento in continuazione per host specifici (o qualsiasi) con il normale comando ssh senza dover utilizzare argomenti di riga di comando aggiuntivi, puoi impostare le opzioni RequestTTYe RemoteCommandnel tuo file di configurazione ssh.

Ad esempio, vorrei digitare solo questo comando:

ssh qaapps18

ma voglio che si comporti sempre come questo comando:

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

Quindi ho aggiunto questo al mio ~/.ssh/configfile:

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

Ora questa regola si applica a qualsiasi host con "app" nel suo nome host.

Per ulteriori informazioni, consultare http://man7.org/linux/man-pages/man5/ssh_config.5.html


13

Sulla base delle aggiunte alla risposta di @ rogeriopvl, suggerisco quanto segue:

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

Concatenare i comandi da &&farà eseguire il comando successivo solo quando il precedente ha avuto esito positivo (anziché utilizzare ;, che esegue i comandi in sequenza). Ciò è particolarmente utile quando è necessario accedere cda una directory che esegue il comando.

Immagina di fare quanto segue:

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

La directory teminalnon esiste, il che ti fa rimanere nella home directory e rimuovi tutti i file in essa contenuti con il seguente comando.

Se usi &&:

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

Il comando fallirà dopo non aver trovato la directory.


1
Ho usato virgolette singole e non doppie virgolette con un comando senza && una volta e mi ha morso nel culo, male ... ho imparato la lezione.
Gavin Pickin,

4

Nel mio caso molto specifico, volevo solo eseguire un comando in un host remoto, all'interno di una directory specifica da una macchina slave Jenkins:

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

Ma la mia macchina non è stata in grado di eseguire l'ssh (non è in grado di allocare una pseudo-tty suppongo) e mi ha tenuto a dare il seguente errore:

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

Potrei aggirare questo problema passando "cd a dir + il mio comando" come parametro del comando ssh (per non dover allocare uno pseudo-terminale) e passando l'opzione -T per dire esplicitamente al comando ssh che non ho fatto non serve allocazione pseudo-terminale.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

3

Uso la variabile d'ambiente CDPATH


Utile solo se ero interessato a una directory per macchina. Ho bisogno di un modo per passare informazioni al computer remoto. La soluzione di Roger fa proprio questo.
Frosty,

2

fare un ulteriore passo avanti con l' -tidea. Tengo una serie di script che chiamano quello qui sotto per andare in posti specifici nei miei host visitati di frequente. Li tengo tutti dentro ~/bine tengo quella directory nel mio percorso.

#!/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

Un altro modo di andare direttamente dopo aver effettuato l'accesso è creare "Alias". Quando accedi al tuo sistema, digita quell'alias e ti troverai in quella directory.

Esempio: Alias ​​= myfolder '/ var / www / Folder'

Dopo aver effettuato l'accesso al tuo sistema digita quell'alias (funziona da qualsiasi parte del sistema)
questo comando se non in bashrc funzionerà per la sessione corrente. Quindi puoi anche aggiungere questo alias a bashrc per usarlo in futuro

$ myfolder => ti porta in quella cartella


-3

SSH stesso fornisce un mezzo di comunicazione, non sa nulla delle directory. Dato che puoi specificare quale comando remoto eseguire (questa è - per impostazione predefinita - la tua shell), inizierei da lì.


4
Questa è una risposta parziale, non una soluzione.
AL

-7

basta modificare la tua casa con il comando: usermod -d /newhome username


1
Non consigliato. La modifica della directory principale probabilmente causerà l'interruzione di altre cose.
bronson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.