Come ssh a vagabondo senza effettivamente eseguire "vagrant ssh"?


149

Vorrei riprodurre il modo in cui Vagrant accede alla mia VM all'interno di uno script di shell usando il sshcomando, quindi creo un alias per la mia istanza di Vagrant.

Qual è la sintassi del comando per utilizzare il sshcomando normale per accedervi?


Che cosa stai effettivamente chiedendo, vedo che tre cose diverse vengono poste, forse potresti espandere la domanda e contrassegnare per migrare. Grazie.
Kev

3
Per impostazione predefinita, la porta SSH della VM che è -22 verrà inoltrata a 2222 sul computer host. Ho messo su il 127.0.0.1 e la porta 2222 con SSH e ha funzionato!
Vishal Biyani,

8
Se stai eseguendo più di una casella, quel numero di porta cambierà automaticamente. Puoi ottenere quello giusto correndo vagrant ssh-config.
Stefano Palazzo,

Risposte:


108

Ho dovuto reimplementare "vagrant ssh" perché la sua -copzione non ha trasmesso correttamente gli argomenti. Questo è fondamentalmente quello che fa (potrebbe essercene di più, ma funziona bene in questo modo)

#!/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 \
    "$@"

Come one-liner (grazie a kgadek):

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

Per tenere conto di quando hai più di un host vagabondo, questo selezionerà l'host desiderato, oltre a eliminare le righe vuote dalla configurazione (usando sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost

3
Questa risposta non ti lascia sshal tuo Vagrant dall'esterno della Vagrantfiledirectory ("usando il sshcomando regolare "), ed è così che ho interpretato la domanda.
sjy,

È possibile impostare la porta da soli. Quindi lo script sarà eseguibile da qualsiasi directory.
Yser,

Quindi, cosa sta facendo di quella porta un modo per entrare nella macchina? Dov'è la configurazione di quale porta è?
Annullato il

1
Vagrant ne sceglie uno inutilizzato con l' auto_correct: trueimpostazione. Ecco maggiori informazioni su come modificarlo manualmente
Stefano Palazzo,

1
Ho dovuto saltare la prima riga, cioè. la Hostvoce. Il comando modificato è:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek,

148

Ci sono già molte risposte, ma sembrano tutte eccessivamente complicate o risolvono problemi che il richiedente non ha avuto.

semplicemente:

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

# run ssh with the file.
ssh -F vagrant-ssh default

2
È fantastico. Mente di aggiungere vagrant-sshfile .gitignore.
sashaegorov,

5
Con alcune conchiglie (ad es. zsh), Funziona come ssh -F =(vagrant ssh-config) default
segue

4
Potresti voler echo questo risultato nel tuo sshfile di configurazione vagrant ssh-config >> ~/.ssh/configssh defaultdefault
:,

Grazie @adamczi questo è il modo semplificato che funziona anche per soluzioni automatizzate in cui l'aggiunta di ulteriori parametri ssh -Fnon è semplice
laimison

3
Aggiungendo una voce ~/.ssh/confignel modo in cui @adamczi suggerisce che è quindi possibile utilizzare l'estensione Visual Studio Code Remote - SSH per ssh nella VM Vagrant e modificare i file ed eseguire lo sviluppo remoto. Semplicemente CMD-SHIFT-P, quindi "Remote-SSH: Connect to Host ..." e la voce ssh .config che hai appena aggiunto viene automaticamente elencata: basta selezionarla e voilà, vscode si connette al tuo vagrant remoto vm! Senza l'approccio di accesso alla configurazione, non sono sicuro di come avrei fatto altrimenti con vscode.
abulka,

52

In esecuzione terminale

vagrant ssh

In un altro terminale finestra / tab run

ps aux | grep ssh

Lì vedrai il comando effettivo eseguito da Vagrant, qualcosa del genere:

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

Ottimo trucco se hai bisogno dell'host del tuo vagabondo per ssh per altri motivi, come una connessione GUI SQL, come Sequel Pro. Questo mi salva!
Atomox,

19

Basta passare l'intero vagrant ssh-configcome file di configurazione sshcon il -F configfileparametro. L'alias host a cui connettersi è definito nella prima riga in vagrant ssh-config; Host defaultsignifica che puoi connetterti con ssh default.

Non riuscivo a vedere un'opzione per leggere il file di configurazione dall'input standard, quindi sono andato con il percorso del file temporaneo. Ecco un one-liner che pulisce anche il $TMPDIR.vagrant-ssh-configfile temporaneo in seguito. Deve essere eseguito nella stessa directory della tua Vagrantfile, supponendo che il tuo vagabondo sia attivo e funzionante.

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

Nota: sul mio sistema Mac OSX, si $TMPDIRespande a /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(in questo momento). Utilizzare un'altra variabile o un'altra cartella, se non è impostata sul proprio sistema.


3
Se stai usando bash o zsh, la sostituzione del processo è un modo più semplice di passare l'output di un comando a un altro. bash: ssh -F <(vagrant ssh-config) zsh: sostituzione processo zsh ssh -F =(vagrant ssh-config)
myeeshen

@myshen: secondo la risposta di @tyrion la sostituzione del processo non funziona ssh -Fin bash - il modo in cui menzioni dovrebbe funzionare in zsh.
Joel Purra,

Ho davvero bisogno di imparare a usare il vagabondo, per non parlare di bash.
Spencer Williams,

14

L'ho risolto in un modo molto semplice: quando avvii la casella vagabondo mostra l'indirizzo ssh in questo modo

SSH address: 127.0.0.1:2222

quindi puoi connetterti al box usando l'utente vagabondo, l'host e la porta che ottieni

ssh vagrant@127.0.0.1 -p 2222

1
simpatico! e nota che in genere la password per l'utente vagabondo èvagrant
Brad Parks,

7

Se non è necessario utilizzare stdin con ssh(ad esempio si desidera eseguire solo un comando e disconnettersi) è possibile utilizzare:

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

Questo metodo è stato suggerito in risposta a una domanda simile sui gruppi di Google .

Sfortunatamente neanche la sostituzione del processo bash non funziona (vedi questa domanda su unix.stackexchange per maggiori dettagli).

Le migliori opzioni che hai, se vuoi una shell interattiva, sono creare un file temporaneo e usarlo con ssh -Fo usare awkcome suggerito dalle altre risposte.


5

Se vuoi solo configurarlo in modo da poter usare normale la normale linea di comando ssh, così come scp e simili, puoi eseguire vagrant ssh-confige aggiungere l'output alla tua configurazione ssh predefinita. Se sostituisci la riga "Default host" con un nome host più descrittivo, dovresti essere pronto.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box

Esattamente quello che il dottore ha ordinato ... Grazie.
xenoide,

4

Se vuoi solo che il comando minimo indispensabile si connetta al tuo box, devi conoscere la porta che sta usando (stampata quando lo fai vagrant upo visibile facendo vagrant ssh-config) e dov'è la tua chiave SSH privata (visibile anche quando lo fai vagrant ssh-config)

Quindi è solo una questione di fornire la chiave e la porta:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key vagrant@127.0.0.1


4

Molte delle altre risposte presuppongono che tu abbia installato Vagrant.

Ho Vagrant installato su Windows 10, ma non posso vagrant sshperché sto usando PuTTy come client SSH, che Vagrant non accetterà.

L' ssheseguibile trovato nel PERCORSO è un client SSH Link PuTTY. Vagrant è compatibile solo con i client SSH OpenSSH.

Tuttavia, in Windows 10 abbiamo anche Bash su Ubuntu su Windows. Quindi, lo uso solo con il seguente 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

Installare Vagrant su Win10-Ubuntu è abbastanza semplice ma vuole anche installare Virtualbox per qualche motivo, cosa che preferirei non fare.

NB Ho provato con il ssh default -F vagrant-ssh-configmetodo, ma ho appena capito

Autorizzazione negata (chiave pubblica, password).

Immagino che questo sia perché il IdentityFilepercorso è un percorso di Windows, mentre in Bash dovrebbe iniziare con /mnt/c/. Suppongo che potresti semplicemente scrivere il file e poi modificarlo se funziona meglio per te.


4

È possibile aggiungere la configurazione host vagrant alla configurazione ssh locale.

  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

3

C'è un modo che replica come un utente remoto potrebbe accedere al sistema

  1. Modifica il Vagrantfile per l'aggiunta della tua istanza

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

Questo aggiunge un IP privato per l'host (rendilo ciò che desideri nell'intervallo 192.168 purché non sia già utilizzato

  1. Riavvia l'istanza con ricaricamento vagabondo dalla riga di comando
  2. Copia il file vagrant private_key in qualche equivalente di Linux che dovresti avere in esecuzione sulla tua scatola (ad esempio Cygwin se su Windows, io uso Windows 10) nella tua home directory di Cygwin, rinominandolo lungo il percorso in qualcosa che descriva l'host che la chiave deve essere usata per es

your_virtual_host_name.pem

  1. La chiave si trova in .vagrant \ machines \ default \ virtualbox \ private_key

  2. Vai alla tua home directory e fai il tuo solito Unix ssh, quindi

ssh -i your_virtual_hostname.pem username@192.168.33.10

dove username, potrebbe anche essere vagabondo se si dispone di una scatola standard, guardare l'output di vagrant ssh-config per i dettagli standard ssh per la scatola.

Questo è tutto


Grazie, grazie alla tua idea di copiare il file chiave da vagabondi altrove, ho capito quale problema avevo: ho usato il provider libvirt su Linux. Questo è importante perché con il provider libvirt è necessario inizializzare Vagrant con sudo e tutti i file all'interno della .vagrantcartella sono quindi di proprietà di root. E i permessi sul file erano rw ------- quindi solo root aveva i permessi per leggere il file chiave. Forse questo potrebbe essere utile a chiunque.
TomasH,

2

Vagrant memorizza la chiave privata ~/.vagrant.d/insecure_private_keye la usa per connettersi a ogni macchina ssh, considerando che è configurata per connettersi sulla porta 2200 (impostazione predefinita) sarebbe qualcosa del tipo:

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

Nota: assicurarsi che la chiave privata sia di proprietà dell'utente in esecuzioneVagrant .

Tuttavia, se il tuo obiettivo è avere un ambiente multi-macchina, puoi farlo utilizzando config.vm.define.

Ecco un esempio che illustra un ambiente con 2 macchine, una chiamata webe l'altra è 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

Quindi avrai tutti i comandi di Vagrant disponibili per macchina, cioè vagrant ssh webe vagrant provision databases.


Posso cambiare la configurazione di una macchina in una configurazione di 2 macchine, se rendo la vecchia macchina "primaria"?
chiuso il

2

ssh vagrant@<host> parola d'ordine: vagrant

Esempi:

  • ssh vagrant@vagrant.local

  • o dopo aver verificato l'IP (dall'interno, usando vagrant ssh)ssh vagrant@172.28.128.3


2

Puoi aggiungere ssh config per il tuo host vagabondo a ssh config.

  1. Ottieni la configurazione di ssh per la macchina vagabonda nella cartella vagabonda: vagrant ssh-config

  2. Apri {UserDir}/.ssh/confige aggiungi lì il risultato del comando precedente. Nota : la prima riga Host defaultindica l'alias che verrà utilizzato in seguito per il sshcomando. Chiamalo come il tuo vagabondo o dir. Se hai solo un dir vagabondo, puoi nominarloHost vagrant

  3. SSH per Vagrant: ssh vagrant. Il cognome è alias del passaggio precedente.


1

Puoi prendere uno qualsiasi degli ssh-configargomenti e passarli a ssh sulla riga di comando come -o Key=value. Quindi, per una semplice configurazione del vagabondo a un host (potresti dover fare un po 'più di lavoro con grepo perlper una configurazione multihost), puoi fare qualcosa di simile al seguente (o sostituire perlcon sedse lo desideri):

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

0

Mio Env. è Win7 + Centos. La risposta con maggior accordo non funziona per me. Dopo aver fallito dopo aver provato ssh -p [port] [usrname]@127.0.01, utilizzo XShell per aggiungere una nuova sessione con la porta e il nome utente vagabondi.

Funziona.

Forse Xshell è un candinato.

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.