Como ssh para vagrant sem executar o "vagrant ssh"?

149

Gostaria de reproduzir a maneira como o Vagrant faz logon na minha VM em um script de shell usando o sshcomando, para criar um alias para minha instância do Vagrant.

Qual é a sintaxe do comando para usar o sshcomando regular para acessá-lo?

Kevin Burke
fonte
O que você está realmente perguntando? Vejo três coisas diferentes sendo feitas; talvez você possa expandir a pergunta e sinalizar para migrar. Obrigado.
Kev
3
Por padrão, a porta ssh da VM que é -22 será encaminhada para 2222 na máquina host. Eu putty-ed em 127.0.0.1 e porta 2222 com SSH e funcionou!
Vishal Biyani
8
Se você estiver executando mais de uma caixa, esse número da porta será alterado automaticamente. Você pode obter o caminho certo executando vagrant ssh-config.
Stefano Palazzo

Respostas:

108

Eu tive que reimplementar o "vagrant ssh" porque sua -copção não passou os argumentos corretamente. É basicamente o que faz (pode haver mais, mas funciona bem dessa maneira)

#!/bin/sh
PORT=$(vagrant ssh-config | grep Port | grep -o '[0-9]\+')
ssh -q \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i ~/.vagrant.d/insecure_private_key \
    vagrant@localhost \
    -p $PORT \
    "$@"

Como one-liner (com agradecimentos a kgadek):

ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost

Para explicar quando você tem mais de um host vagante, isso selecionará o host desejado, bem como separará as linhas em branco da configuração (usando sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
fonte
3
Esta resposta não permite que você entre sshem contato com o Vagrant de fora do Vagrantfilediretório ("usando o sshcomando regular "), e foi assim que interpretei a pergunta.
SJY
Você pode configurar a porta por conta própria. Assim, o script será executável a partir de qualquer diretório.
Yser
Então, o que está fazendo dessa porta uma maneira de entrar na máquina? Onde está a configuração de qual porta é?
Nrose
1
O Vagrant escolhe um não utilizado com a auto_correct: trueconfiguração. Aqui está mais informações sobre como alterar manualmente
Stefano Palazzo
1
Eu tive que pular a primeira linha, ou seja. a Hostentrada. O comando modificado é:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
148

Já existem muitas respostas, mas todas parecem complicadas demais ou resolvem problemas que o solicitante não tinha.

simplesmente:

# save the config to a file
vagrant ssh-config > vagrant-ssh

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
fonte
2
Isso é incrível. Lembre-se de adicionar o vagrant-ssharquivo .gitignore.
Sashaegorov 02/05
5
Com algumas conchas (por exemplo zsh), a seguinte linha funciona:ssh -F =(vagrant ssh-config) default
liori 30/08/17
4
Você pode querer echo este resultado em seu ssharquivo de configuração: vagrant ssh-config >> ~/.ssh/config, então você apenas executar ssh defaulta partir de qualquer lugar no seu sistema, onde defaulté o nome da VM que você pode especificar como aqui
adamczi
Graças @adamczi esta é a maneira simplificada que também funciona para soluções automatizadas onde acrescentando parâmetro ssh adicional -Fnão é simples
laimison
3
Ao adicionar uma entrada à ~/.ssh/configmaneira como o @adamczi sugere, você pode usar a extensão Visual Studio Code Remote - SSH para ssh na VM do Vagrant e editar arquivos e fazer desenvolvimento remoto. Simplesmente CMD-SHIFT-P, em seguida, "SSH remoto: conecte-se ao host ..." e a entrada ssh .config que você acabou de adicionar é automaticamente listada - basta selecioná-lo e pronto, o vscode se conecta ao seu vagabundo remoto vm! Sem a abordagem de entrada de configuração, não sei de que outra forma eu teria feito isso com o vscode.
abulka
52

Na execução do terminal

vagrant ssh

Em outra janela / guia do terminal, execute

ps aux | grep ssh

Lá você verá o comando real executado pelo Vagrant, algo como isto:

ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i ~/.vagrant.d/less_insecure_private_key -o ForwardAgent=yes
Leksat
fonte
Um ótimo truque se você precisar do host do seu vagrant por ssh por outros motivos, como uma conexão SQL GUI, como o Sequel Pro. Este me salva!
Atomox
19

Apenas passe o vagrant ssh-configarquivo inteiro como um arquivo de configuração para sshcom o -F configfileparâmetro O alias do host ao qual se conectar é definido na primeira linha vagrant ssh-config; Host defaultsignifica que você pode se conectar ssh default.

Não consegui ver uma opção para ler o arquivo de configuração a partir da entrada padrão, então fui com a rota do arquivo temporário. Aqui está uma lista que também limpa o $TMPDIR.vagrant-ssh-configarquivo temporário posteriormente. Ele precisa ser executado no mesmo diretório que o seu Vagrantfile, supondo que a sua caixa vagrant esteja em funcionamento.

vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config

Nota: no meu sistema Mac OSX, $TMPDIRexpande para /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(agora). Use outra variável ou outra pasta, se não estiver definida no seu sistema.

Joel Purra
fonte
3
Se você estiver usando o bash ou o zsh, a substituição do processo é uma maneira mais simples de passar a saída de um comando para outro. bash: ssh -F <(vagrant ssh-config) zsh: substituição do processo zsh ssh -F =(vagrant ssh-config)
myeeshen
@ myshen: de acordo com a resposta do @tyrion , a substituição do processo não funciona ssh -Fno bash - a maneira como você mencionou deve funcionar no zsh.
Joel Purra
Caramba, eu realmente preciso aprender a usar o vagrant, para não mencionar o bash.
Spencer Williams
14

Resolvi isso de uma maneira muito simples: quando você inicia a caixa vagrant, ela mostra o endereço ssh assim

SSH address: 127.0.0.1:2222

então você pode se conectar à caixa usando o usuário vagante, o host e a porta que você obtém

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
fonte
1
legais! e observe que, normalmente, a senha para o usuário vagabundo évagrant
Brad Parks
7

Se você não precisar usar o stdin com ssh(por exemplo, deseja executar apenas um comando e logout), poderá usar:

vagrant ssh-config --host default | ssh -F /dev/stdin default

Este método foi sugerido em resposta a uma pergunta semelhante nos grupos do Google .

Infelizmente , a substituição do processo bash também não funciona (consulte esta pergunta em unix.stackexchange para obter mais detalhes).

As melhores opções que você tem, se desejar um shell interativo, são criar um arquivo temporário e usá-lo com ssh -Fou awkconforme sugerido pelas outras respostas.

tyrion
fonte
5

Se você quiser apenas configurá-lo para poder usar normalmente a linha de comando ssh normal, assim como o scp e outros, poderá executar vagrant ssh-confige anexar a saída à sua configuração ssh padrão. Se você substituir a linha "Host default" por um nome de host mais descritivo, você deve estar pronto.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
fonte
Exatamente o que o médico pediu ... Thx.
Xenoid 26/04
4

Se você deseja que o comando mínimo necessário se conecte à sua caixa, você precisa conhecer a porta que está usando (impressa ao fazer vagrant upou visível vagrant ssh-config) e onde está sua chave SSH privada (também visível ao fazer vagrant ssh-config)

Depois, basta fornecer a chave e a porta:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key [email protected]

Nico Villanueva
fonte
4

Muitas das outras respostas assumem que você tem o Vagrant instalado.

Eu tenho o Vagrant instalado no Windows 10, mas não posso vagrant sshporque estou usando o PuTTy como meu cliente SSH, o que o vagrant não aceita.

O sshexecutável encontrado no PATH é um cliente SST PuTTY Link. O Vagrant é compatível apenas com clientes OpenSSH SSH.

No entanto, no Windows 10, também temos o Bash no Ubuntu no Windows. Então, eu apenas uso isso com o seguinte comando:

ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal

É fácil instalar o Vagrant no Win10-Ubuntu, mas também quer que você instale o Virtualbox por algum motivo, o que eu prefiro não fazer.

NB Eu tentei com o ssh default -F vagrant-ssh-configmétodo, mas eu apenas

Permissão negada (chave pública, senha).

Suponho que isso ocorre porque o IdentityFilecaminho é um caminho do Windows, enquanto que no Bash deve começar /mnt/c/. Suponho que você possa escrever o arquivo e modificá-lo se isso funcionar melhor para você.

mpen
fonte
4

Você pode adicionar uma configuração de host vagante à sua configuração ssh local.

  1. vagrant ssh-config >> ~ / .ssh / config

  2. ssh vagrant @ {host}

ex. cat ~ / .ssh / config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant @ kmaster
Vinay Kumar Gupta
fonte
3

Existe uma maneira de replicar como um usuário remoto pode efetuar login no sistema

  1. Edite o arquivo Vagrant para sua instância adicionando

config.vm.network "private_network", ip: "192.168.33.10"

Isso adiciona um IP privado para o host (faça o que você deseja no intervalo 192.168, desde que ele ainda não seja usado

  1. Reinicie a instância com recarregamento vagrant na linha de comando
  2. Copie o arquivo vag_ant private_key para algum equivalente do Linux que você deve executar na sua caixa (por exemplo, Cygwin, se estiver no Windows, eu uso o Windows 10) para o diretório inicial do cygwin, renomeando-o no caminho para algo que descreva o host em que a chave será usada por exemplo

your_virtual_host_name.pem

  1. Você encontrará a chave em .vagrant \ machines \ default \ virtualbox \ private_key

  2. Vá para o seu diretório pessoal e faça o seu habitual Unix ssh, então

ssh -i your_virtual_hostname.pem [email protected]

Onde nome de usuário, pode ser vagrant se você tiver uma caixa padrão, observe a saída de vagrant ssh-config para obter detalhes padrão da ssh para a caixa.

É isso aí

Jimbo
fonte
Obrigado, graças à sua idéia de copiar o arquivo-chave do vagrant em outro lugar, percebi qual era o problema - usei o provedor libvirt no Linux. Isso é importante porque, com o provedor libvirt, você precisa inicializar o vagrant com o sudo, e todos os arquivos dentro da .vagrantpasta são de propriedade do root. E as permissões no arquivo eram rw -------, portanto, apenas o root tinha permissões para ler o arquivo-chave. Talvez isso possa ser útil para qualquer pessoa.
TomasH 02/04/19
2

O Vagrant armazena a chave privada ~/.vagrant.d/insecure_private_keye a usa para conectar-se a todas as máquinas ssh, considerando que está configurado para conectar-se na porta 2200 (padrão), seria algo como:

ssh vagrant@localhost -p 2200 -i ~/.vagrant.d/insecure_private_key

Nota: verifique se a chave privada pertence ao usuário em execuçãoVagrant .

Embora, se seu objetivo é ter um ambiente com várias máquinas, você pode fazê-lo usando config.vm.define.

Aqui está um exemplo que ilustra um ambiente com 2 máquinas, uma chamada webe a outra é databases:

config.vm.define 'web', primary: true do |web|
        web.vm.box = 'CentOS64'
        web.vm.hostname = 'vic-develop'
        web.vm.network 'private_network', ip: '192.168.50.10', virtualbox__intnet: true
        web.vm.synced_folder '../code', '/var/www/project', :mount_options => ["dmode=777,fmode=777"]

        web.vm.provision 'ansible' do |ansible|
            ansible.playbook = 'development-web.yml'
            ansible.sudo = true
        end
end

config.vm.define 'databases' do |db|
    db.vm.box = 'CentOS64'

    db.vm.network 'private_network', ip: '192.168.50.20', virtualbox__intnet: true
    db.vm.network :forwarded_port, guest: 3306, host: 8206

    db.vm.provision 'ansible' do |ansible|
        ansible.playbook = 'development-db.yml'
        ansible.sudo = true
    end
end

Então você terá todos os comandos do Vagrant disponíveis por máquina, ie vagrant ssh webe vagrant provision databases.

Mulkave
fonte
Posso alterar uma configuração de uma máquina para uma configuração de 2 máquinas, se eu tornar a máquina antiga "primária"?
Nrose
2

Você pode adicionar a configuração ssh para seu host vagrant na configuração ssh.

  1. Obtenha a configuração ssh para a máquina vagrant na pasta vagrant: vagrant ssh-config

  2. Abra {UserDir}/.ssh/confige acrescente o resultado do comando anterior. Nota : a primeira linha Host defaultsignifica o apelido que você usará posteriormente para o sshcomando. Nomeie-o como sua máquina vagrant ou dir. Se você tiver apenas um diretório vagrant - você pode nomearHost vagrant

  3. Ssh para Vagrant: ssh vagrant. O sobrenome é alias da etapa anterior.

FreeLightman
fonte
1

Você pode pegar qualquer um dos ssh-configargumentos e passá-los para ssh na linha de comando como -o Key=value. Portanto, para uma configuração vagrant simples de um host (talvez você precise fazer um pouco mais de trabalho com grepou perlpara uma configuração multihost), faça algo como o seguinte (ou substitua perl-o sedse desejar):

ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost
Darin London
fonte
0

Meu Env. é Win7 + Centos. A resposta com mais concordância não funciona para mim. Depois de falhar depois de tentar ssh -p [port] [usrname]@127.0.01, apenas uso o XShell para adicionar uma nova sessão com a porta e o nome do usuário vagrantes.

Funciona.

Talvez Xshell seja um candinate.

onebraveman
fonte