2009-03-09 6 views
149

Spesso devo accedere a uno dei vari server e andare su una delle numerose directory su quelle macchine. Attualmente faccio qualcosa di questo genere:Come posso ssh direttamente ad una particolare directory?

 
localhost ~]$ ssh somehost 

Welcome to somehost! 

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

ho script in grado di determinare quale host e quale directory ho bisogno di entrare in, ma non riesco a trovare un modo per fare questo:

 
localhost ~]$ go_to_dir Foo 

Welcome to somehost! 

somehost Foo]$ 

Is c'è un modo facile, intelligente o in qualche modo per farlo?

risposta

271

È possibile effettuare le seguenti operazioni:

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

questo modo, si otterrà una shell proprio sulla directory_wanted.


Spiegazione

-t  Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. 
      Multiple -t options force tty allocation, even if ssh has no local tty. 
  • Se non si utilizza -t allora apparirà nessuna richiesta.
  • Se non si aggiunge ; bash quindi la connessione otterrà chiuso e restituire il controllo al computer locale
+0

L'esecuzione della shell alla fine è stata l'ultima parte del puzzle. Grazie. – Frosty

+18

nel mio caso -t la parte mancante – Mathieu

+2

Ho usato "csh" invece di "bash" alla fine perché la mia shell era csh. Solo una nota! – quantum

-1

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

+3

Questa è una risposta parziale, non una soluzione. –

2

io uso l'ambiente variabile CDPATH

+0

Utile solo se mi interessava una directory per macchina. Ho bisogno di un modo per passare le informazioni alla macchina remota. La soluzione di Roger fa proprio questo. – Frosty

40

si potrebbe aggiungere

cd /some/directory/somewhere/named/Foo 

a il tuo file .bashrc (o .profile o qualsiasi altra cosa tu lo chiami) sull'altro host. In questo modo, a prescindere da ciò che fai o da dove ti colleghi a ssh, quando effettui il login su quel server, esso sarà cd nella directory corretta per te e tutto ciò che devi fare è usare ssh come normale.

Di maledizione, anche la soluzione di rogeriopvl funziona, ma è un po 'più prolissa e bisogna ricordarsi di farlo ogni volta (a meno che non si crei un alias), quindi sembra un po' meno "divertente".

+1

+1, questo sembra più adatto se hai bisogno di una directory costante invece di fare il comando ssh più a lungo ricordando a quale directory stai andando a muovere quando ti connetti alla macchina X – Tebe

1

Un altro modo per andare direttamente dopo l'accesso è creare "Alias". Quando accedi al tuo sistema, digita quell'alias e sarai in quella directory.

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

volta effettuato l'accesso al sistema digitare l'alias (questo funziona da qualsiasi parte del sistema)
questo comando se non in bashrc sarà lavoro per la sessione corrente. Così si può anche aggiungere questo alias per bashrc da usare che in futuro

$ MyFolder => ti porta a quella cartella

14

ho creato uno strumento per SSH e CD in un server consecutivamente - giustamente intitolato sshcd.Per l'esempio che hai fornito, devi semplicemente utilizzare:

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

Fatemi sapere se avete domande o problemi!

+0

Sarebbe bello se potessi definire una nuova configurazione in ~ /. ssh/config e leggerlo da lì;) – Alexar

+0

@Alexar https://github.com/fraction/sshcd/issues :) – christianbundy

-5

semplicemente modificare la vostra casa con il comando: usermod -d /newhome username

+0

Non consigliato. Cambiare la tua home directory probabilmente causerà la rottura di altre cose. – bronson

0

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

ssh [email protected] 
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir 
exit 

Ma la mia macchina non poteva eseguire l'ssh (che non è riuscito ad allocare una pseudo-tty suppongo) e mi ha tenuto dando il seguente errore:

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

Potrei aggirare questo problema passando "cd a dir + 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 io non ha bisogno di un'allocazione pseudo-terminale.

ssh -T [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir" 
0

Sulla base di integrazioni @ di rogeriopvl risposta, suggerisco il seguente:

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

concatenamento comandi di && farà la prossima corsa di comando solo quando quello precedente ha avuto successo (anziché utilizzare ; , che esegue i comandi in sequenza). Ciò è particolarmente utile quando si ha bisogno di cd in una directory che esegue il comando.

immaginare di fare quanto segue:

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

La directory teminal non esiste, che ti fa rimanere nella home directory e rimuovere tutti i file in là con il seguente comando.

se si utilizza &&:

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

Il comando avrà esito negativo dopo non trovare la directory.

0

un passo avanti con l'idea -t. Mantengo un set di script che chiamano quello sotto per andare in determinati luoghi nei miei host visitati frequentemente. Li tengo tutti in ~/bin e tieni quella directory sul 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" 
Problemi correlati