Como posso ssh diretamente para um diretório específico?

248

Frequentemente, preciso fazer login em um dos vários servidores e acessar um dos vários diretórios nessas máquinas. Atualmente eu faço algo desse tipo:

localhost ~] $ ssh somehost

Bem-vindo ao somehost!

somehost ~] $ cd / some / directory / algum lugar / chamado / Foo
somehost Foo] $ 

Eu tenho scripts que podem determinar em qual host e em qual diretório eu preciso entrar, mas não consigo descobrir uma maneira de fazer isso:

localhost ~] $ go_to_dir Foo

Bem-vindo ao somehost!

somehost Foo] $

Existe uma maneira fácil, inteligente ou de fazer isso?

Gelado
fonte

Respostas:

413

Você pode fazer o seguinte:

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

Dessa forma, você obterá um shell diretamente no directory_wanted.


Explicação

-tForçar alocação pseudo-terminal. Isso pode ser usado para executar programas arbitrários baseados em tela em uma máquina remota, o que pode ser muito útil, por exemplo, ao implementar serviços de menu.

Várias -topções forçam a alocação de tty, mesmo se ssh não tiver tty local.

  • Se você não usar -t, nenhum prompt será exibido.
  • Se você não adicionar ; bash, a conexão será fechada e retornará o controle à sua máquina local
rogeriopvl
fonte
21
no meu caso, a parte que faltava
Mathieu
2
Ao usar essa abordagem, o .bash_profile não é lido, alguém sabe por quê?
Filipe
8
Eu tive que fazer o seguinte: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron
40
Você geralmente quer um shell de login:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy
10
Só queria vincular o diretório de alteração automaticamente no login ssh - Falha no servidor ; e de lá cole este comando (que é uma versão do um por @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau
53

Você poderia adicionar

cd /some/directory/somewhere/named/Foo

para o seu .bashrcarquivo (ou .profilecomo você o chama) no outro host. Dessa forma, não importa o que você faça ou de onde ssh, sempre que fizer logon no servidor, ele será direcionado cdpara o diretório apropriado para você, e tudo que você precisa fazer é usá-lo sshnormalmente.

É claro que a solução do rogeriopvl também funciona, mas é um pouco mais detalhada, e você deve se lembrar de fazê-lo todas as vezes (a menos que faça um pseudônimo), para que pareça um pouco menos "divertido".

Chris Lutz
fonte
1
+1, isso parece mais adequados se você precisar diretório constante em vez de fazer comando ssh mais tempo lembrando todas as vezes em que diretório que você está indo para mover quando você se conectar a X máquina
Tebe
Inadequado ao mudar de maneira flexível
Lewis Chan
21

Eu criei uma ferramenta para SSH e CD em um servidor consecutivamente - apropriadamente chamado sshcd . Para o exemplo que você deu, basta usar:

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

Deixe-me saber se você tiver alguma dúvida ou problema!

christianbundy
fonte
1
Seria legal se você pudesse definir uma nova configuração em ~ / .ssh / config e lê-lo de lá;)
Alexar
21

Minha abordagem preferida é usar o arquivo de configuração SSH (descrito abaixo), mas existem algumas soluções possíveis, dependendo do seu uso.

Argumentos da linha de comando

Acho que a melhor resposta para essa abordagem é a resposta de christianbundy à resposta aceita:

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

O uso de aspas duplas permitirá que você use variáveis ​​de sua máquina local, a menos que elas escapem (como $SHELLaqui). Como alternativa, você pode usar aspas simples e todas as variáveis ​​que você usar serão as da máquina de destino:

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

Função Bash

Você pode simplificar o comando envolvendo-o em uma função bash. Digamos que você queira apenas digitar isso:

sshcd example.com /foo/bar

Você pode fazer isso funcionar adicionando isso ao seu ~/.bashrc:

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

Se você estiver usando uma variável que existe na máquina remota para o diretório, escape-a ou coloque-a entre aspas simples. Por exemplo, isso fará o cd para o diretório que está armazenado na JBOSS_HOMEvariável na máquina remota:

sshcd example.com \$JBOSS_HOME

Arquivo de configuração SSH

Se você deseja ver esse comportamento o tempo todo para hosts específicos (ou qualquer) com o comando ssh normal sem precisar usar argumentos extras da linha de comando, defina as opções RequestTTYe RemoteCommandno seu arquivo de configuração ssh.

Por exemplo, eu gostaria de digitar apenas este comando:

ssh qaapps18

mas deseja que ele sempre se comporte como este comando:

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

Então eu adicionei isso ao meu ~/.ssh/configarquivo:

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

Agora, essa regra se aplica a qualquer host com "aplicativos" em seu nome de host.

Para mais informações, consulte http://man7.org/linux/man-pages/man5/ssh_config.5.html

Desenhou
fonte
13

Com base nas adições à resposta de @ rogeriopvl, sugiro o seguinte:

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

O encadeamento de comandos por &&fará com que o próximo comando seja executado apenas quando o anterior tiver sido bem-sucedido (ao contrário de usar ;, que executa comandos sequencialmente). Isso é particularmente útil quando é necessário cdum diretório executando o comando.

Imagine fazer o seguinte:

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

O diretório teminalnão existe, o que faz com que você permaneça no diretório inicial e remova todos os arquivos lá com o seguinte comando.

Se você usa &&:

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

O comando falhará depois de não encontrar o diretório.

Bas Peeters
fonte
1
Usei aspas simples e não aspas duplas com um comando sem && uma vez e isso me incomodou, ruim ... aprendi minha lição.
Gavin Pickin
4

No meu caso muito específico, eu só queria executar um comando em um host remoto, dentro de um diretório específico de uma máquina escrava Jenkins:

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

Mas minha máquina não pôde executar o ssh (não podia alocar uma pseudo-tty, suponho) e me manteve dando o seguinte erro:

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

Eu poderia contornar esse problema passando "cd para dir + meu comando" como um parâmetro do comando ssh (para não precisar alocar um pseudo-terminal) e passando a opção -T para informar explicitamente ao comando ssh que eu não precisa de alocação pseudo-terminal.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
Mauricio Reis
fonte
3

Eu uso a variável de ambiente CDPATH

Eddy
fonte
Útil apenas se eu estivesse interessado em um diretório por máquina. Eu preciso de uma maneira de passar informações para a máquina remota. A solução de Roger faz exatamente isso.
Frosty
2

dando um passo adiante com a -tideia. Eu mantenho um conjunto de scripts chamando o abaixo para ir a lugares específicos nos meus hosts visitados com frequência. Eu mantenho todos eles dentro ~/bine mantenho esse diretório no meu caminho.

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

Outra maneira de acessar diretamente após o login é criar "Alias". Ao fazer login no seu sistema, basta digitar esse alias e você estará nesse diretório.

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

Depois de fazer login no seu sistema, digite esse alias (isso funciona em qualquer parte do sistema)
esse comando, se não estiver no bashrc, funcionará para a sessão atual. Então você também pode adicionar esse alias ao bashrc para usá-lo no futuro

$ myfolder => leva você para essa pasta

insomíaco
fonte
-3

O próprio SSH fornece um meio de comunicação, não sabe nada sobre diretórios. Como você pode especificar qual comando remoto executar (este é - por padrão - seu shell), eu começaria por aí.

Jan Jungnickel
fonte
4
Esta é uma resposta parcial, não uma solução.
AL
-7

simplesmente modifique sua casa com o comando: usermod -d /newhome username

Borja Moll
fonte
1
Não recomendado. Alterar o diretório inicial provavelmente fará com que outras coisas sejam interrompidas.
Bronson