Wie kann man zu Vagabund ssh, ohne tatsächlich "vagrant ssh" auszuführen?

149

Ich möchte die Art und Weise reproduzieren, wie Vagrant innerhalb eines Shell-Skripts mit einem sshBefehl auf meiner VM protokolliert. Daher erstelle ich einen Alias ​​für meine Vagrant-Instanz.

Wie lautet die Befehlssyntax, um mit dem regulären sshBefehl darauf zuzugreifen?

Kevin Burke
quelle
Was fragst du eigentlich? Ich sehe drei verschiedene Dinge, die gefragt werden. Vielleicht könntest du die Frage erweitern und dann markieren, um zu migrieren. Vielen Dank.
Kev
3
Standardmäßig wird der SSH-Port der VM mit -22 auf dem Hostcomputer an 2222 weitergeleitet. Ich habe auf 127.0.0.1 und Port 2222 mit SSH geputtet und es hat funktioniert!
Vishal Biyani
8
Wenn Sie mehr als eine Box ausführen, ändert sich diese Portnummer automatisch. Sie können das richtige finden, indem Sie laufen vagrant ssh-config.
Stefano Palazzo

Antworten:

108

Ich musste "vagrant ssh" erneut implementieren, da die -cOption die Argumente nicht richtig weitergab. Dies ist im Grunde das, was es tut (es könnte mehr geben, aber es funktioniert gut auf diese Weise)

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

Als Einzeiler (danke an kgadek):

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

Um zu berücksichtigen, wenn Sie mehr als einen vagabundierenden Host haben, werden der gewünschte Host ausgewählt und leere Zeilen aus der Konfiguration entfernt (mit sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
quelle
3
Mit dieser Antwort können Sie nicht sshvon außerhalb des VagrantfileVerzeichnisses zu Ihrem Vagrant gelangen ("mit dem regulären sshBefehl"). So habe ich die Frage interpretiert.
sjy
Sie können den Port selbst einstellen. Somit kann das Skript aus jedem Verzeichnis ausgeführt werden.
Yser
Was macht diesen Port zu einem Weg, um in die Maschine zu gelangen? Wo ist die Konfiguration des Ports?
Nroose
1
Vagrant wählt eine unbenutzte mit der auto_correct: trueEinstellung. Hier ist mehr Info, wie man es manuell ändert
Stefano Palazzo
1
Ich musste die erste Zeile überspringen, dh. der HostEintrag. Der geänderte Befehl lautet:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
147

Es gibt bereits viele Antworten, aber alle scheinen zu kompliziert zu sein oder Probleme zu lösen, die der Fragesteller nicht hatte.

einfach:

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

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
quelle
2
Das ist großartig. Es macht etwas aus, eine vagrant-sshDatei hinzuzufügen .gitignore.
Sashaegorov
5
Mit einigen Muscheln (zB zsh) funktioniert der folgende ssh -F =(vagrant ssh-config) default
Einzeiler
4
Möglicherweise möchten Sie dieses Ergebnis in Ihre sshKonfigurationsdatei wiedergeben: vagrant ssh-config >> ~/.ssh/configSie führen es einfach ssh defaultvon einer beliebigen Stelle in Ihrem System aus. Hier finden Sie defaultden Namen der VM, die Sie wie hier
adamczi
Dank @adamczi ist dies die vereinfachte Methode, die auch für automatisierte Lösungen funktioniert, bei denen das Hinzufügen zusätzlicher ssh-Parameter -Fnicht einfach ist
Laimison
3
Durch Hinzufügen eines Eintrags zu dem, ~/.ssh/configwie @adamczi vorschlägt, können Sie dann die Visual Studio Code Remote - SSH-Erweiterung verwenden, um in die Vagrant-VM zu ssh und Dateien zu bearbeiten und Remote-Entwicklung durchzuführen. Einfach CMD-SHIFT-P, dann "Remote-SSH: Verbindung zum Host herstellen ..." und der soeben hinzugefügte Eintrag ssh .config wird automatisch aufgelistet - Sie wählen ihn einfach aus und voila, vscode stellt eine Verbindung zu Ihrem Remote-Vagrant-VM her! Ohne den Konfigurationseintrag bin ich mir nicht sicher, wie ich es sonst mit vscode gemacht hätte.
Abulka
52

Im Terminallauf

vagrant ssh

In einem anderen Terminalfenster / Tab ausführen

ps aux | grep ssh

Dort sehen Sie den tatsächlichen Befehl, der von Vagrant ausgeführt wird, ungefähr so:

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
quelle
Ein großartiger Trick, wenn Sie den Host Ihres Vagabunden aus anderen Gründen für ssh benötigen, z. B. für eine SQL-GUI-Verbindung wie Sequel Pro. Dieser rette mich!
Atomox
19

vagrant ssh-configÜbergeben Sie einfach die gesamte Datei als Konfigurationsdatei sshmit dem -F configfileParameter. Der Host-Alias, zu dem eine Verbindung hergestellt werden soll, wird in der ersten Zeile in definiert vagrant ssh-config. Host defaultbedeutet, dass Sie mit verbinden können ssh default.

Ich konnte keine Option zum Lesen der Konfigurationsdatei von der Standardeingabe sehen, also ging ich zur Route der temporären Datei. Hier ist ein Einzeiler, der auch die temporäre $TMPDIR.vagrant-ssh-configDatei anschließend bereinigt . Es muss im selben Verzeichnis wie Ihr ausgeführt werden Vagrantfile, vorausgesetzt, Ihre Vagrant-Box ist in Betrieb.

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

Hinweis: auf meinem Mac OSX - System, $TMPDIRerweitert zu /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(jetzt). Verwenden Sie eine andere Variable oder einen anderen Ordner, wenn dieser nicht auf Ihrem System festgelegt ist.

Joel Purra
quelle
3
Wenn Sie bash oder zsh verwenden, ist die Prozessersetzung eine einfachere Möglichkeit, die Ausgabe eines Befehls an einen anderen zu übergeben. bash: ssh -F <(vagrant ssh-config) zsh: zsh Prozesssubstitution ssh -F =(vagrant ssh-config)
myeeshen
@myshen: Laut der Antwort von @tyrion funktioniert die Prozessersetzung ssh -Fin bash nicht - die Art und Weise, wie Sie sie erwähnen, sollte jedoch in zsh funktionieren.
Joel Purra
Dang, ich muss wirklich lernen, wie man Vagabunden benutzt, ganz zu schweigen von Bash.
Spencer Williams
14

Ich habe das auf sehr einfache Weise gelöst: Wenn Sie die Vagrant-Box starten, wird die SSH-Adresse wie folgt angezeigt

SSH address: 127.0.0.1:2222

Anschließend können Sie eine Verbindung zur Box herstellen, indem Sie den vagabundierenden Benutzer, den Host und den Port verwenden, den Sie erhalten

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
quelle
1
nett! und beachten Sie, dass normalerweise das Passwort für den vagabundierenden Benutzer lautetvagrant
Brad Parks
7

Wenn Sie stdin nicht mit verwenden müssen ssh(zum Beispiel möchten Sie nur einen Befehl ausführen und sich abmelden), können Sie Folgendes verwenden:

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

Diese Methode wurde als Antwort auf eine ähnliche Frage in Google-Gruppen vorgeschlagen .

Leider funktioniert die Ersetzung von Bash-Prozessen auch nicht ( weitere Informationen finden Sie in dieser Frage unter unix.stackexchange ).

Wenn Sie eine interaktive Shell wünschen, können Sie am besten eine temporäre Datei erstellen und diese mit ssh -Foder verwenden, awkwie in den anderen Antworten vorgeschlagen.

Tyrion
quelle
5

Wenn Sie es nur so einrichten möchten, dass Sie die normale ssh-Befehlszeile sowie scp und dergleichen normal verwenden können, können Sie vagrant ssh-configdie Ausgabe ausführen und an Ihre Standard-ssh-Konfiguration anhängen. Wenn Sie die Zeile "Host-Standard" durch einen aussagekräftigeren Hostnamen ersetzen, sollten Sie bereit sein.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
quelle
Genau das, was der Arzt bestellt hat ... Danke.
Xenoid
4

Wenn Sie nur möchten, dass der Befehl "Minimum" eine Verbindung zu Ihrer Box herstellt, müssen Sie den verwendeten Port kennen (gedruckt, wenn Sie dies tun vagrant upoder sichtbar tun vagrant ssh-config) und wo sich Ihr privater SSH-Schlüssel befindet (auch sichtbar, wenn Sie dies tun vagrant ssh-config).

Dann müssen Sie nur noch den Schlüssel und den Port bereitstellen:

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

Nico Villanueva
quelle
4

Bei vielen anderen Antworten wird davon ausgegangen, dass Sie Vagrant installiert haben.

Ich habe Vagrant unter Windows 10 installiert, kann es aber nicht, vagrant sshweil ich PuTTy als meinen SSH-Client verwende, den Vagrant nicht akzeptiert.

Die sshim PATH gefundene ausführbare Datei ist ein PuTTY Link SSH-Client. Vagrant ist nur mit OpenSSH SSH-Clients kompatibel.

In Windows 10 haben wir jedoch auch Bash unter Ubuntu unter Windows. Also benutze ich das einfach mit dem folgenden Befehl:

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

Es ist einfach genug, Vagrant unter Win10-Ubuntu zu installieren, aber es möchte auch, dass Sie Virtualbox aus irgendeinem Grund installieren, was ich lieber nicht tun würde.

NB Ich habe es mit der ssh default -F vagrant-ssh-configMethode versucht , aber ich verstehe es einfach

Berechtigung verweigert (publickey, Passwort).

Ich vermute, das liegt daran, dass der IdentityFilePfad ein Windows-Pfad ist, während er in Bash mit beginnen sollte /mnt/c/. Ich nehme an, Sie könnten die Datei einfach ausschreiben und dann ändern, wenn dies für Sie besser funktioniert.

mpen
quelle
4

Sie können Ihrer lokalen SSH-Konfiguration eine vagabundierende Hostkonfiguration hinzufügen.

  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
quelle
3

Es gibt eine Möglichkeit, die repliziert, wie sich ein Remotebenutzer beim System anmelden kann

  1. Bearbeiten Sie die Vagrant-Datei für Ihre Instanz und fügen Sie sie hinzu

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

Dies fügt eine private IP für den Host hinzu (machen Sie es im Bereich 192.168 so, wie Sie es wünschen, solange es nicht bereits verwendet wird

  1. Starten Sie die Instanz mit vagrantem Neuladen über die Befehlszeile neu
  2. Kopieren Sie die vagabundierende Datei private_key in ein Linux-Äquivalent, das auf Ihrer Box ausgeführt werden sollte (z. B. Cygwin, wenn ich unter Windows Windows 10 verwende), in Ihr Cygwin-Ausgangsverzeichnis und benennen Sie sie auf dem Weg in etwas um, das den Host beschreibt, für den der Schlüssel verwendet werden soll für z

your_virtual_host_name.pem

  1. Sie finden den Schlüssel unter .vagrant \ machine \ default \ virtualbox \ private_key

  2. Gehen Sie in Ihr Home-Verzeichnis und führen Sie Ihr übliches Unix-SSH aus

ssh -i your_virtual_hostname.pem [email protected]

Wo Benutzername, kann vagrant sein, wenn Sie eine Standard-Box haben, schauen Sie sich die Ausgabe von vagrant ssh-config für ssh Standarddetails für die Box.

Das ist es

Jimbo
quelle
Vielen Dank, dank Ihrer Idee, die Schlüsseldatei von Vagrant an eine andere Stelle zu kopieren, wurde mir klar, welches Problem ich hatte - ich habe den libvirt- Anbieter unter Linux verwendet. Dies ist wichtig, da Sie mit libvirt provider vagrant mit sudo initialisieren müssen und daher alle Dateien im .vagrantOrdner im Besitz von root sind. Und die Berechtigungen für die Datei waren rw -------, sodass nur root Berechtigungen zum Lesen der Schlüsseldatei hatte. Vielleicht könnte dies für jeden hilfreich sein.
TomasH
2

Vagrant speichert den privaten Schlüssel ~/.vagrant.d/insecure_private_keyund verwendet ihn, um eine Verbindung zu jedem Computer herzustellen ssh, wenn man bedenkt, dass er für die Verbindung über Port 2200 konfiguriert ist (Standard).

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

Hinweis: Stellen Sie sicher, dass der private Schlüssel dem ausgeführten Benutzer gehörtVagrant .

Wenn Sie jedoch eine Umgebung mit mehreren Maschinen anstreben , können Sie dies verwenden config.vm.define.

Hier ist ein Beispiel für eine Umgebung mit zwei Maschinen, von denen eine aufgerufen wird webund die andere 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

Dann stehen Ihnen alle Vagrant-Befehle pro Maschine zur Verfügung, dh vagrant ssh webund vagrant provision databases.

Mulkave
quelle
Kann ich eine Konfiguration mit einer Maschine in eine Konfiguration mit zwei Maschinen ändern, wenn ich die alte Maschine "primär" mache?
Nroose
2

Sie können ssh config zu ssh config für Ihren vagabundierenden Host hinzufügen.

  1. Holen Sie sich die SSH-Konfiguration für die Vagrant-Maschine im Vagrant-Ordner: vagrant ssh-config

  2. Öffnen {UserDir}/.ssh/configund anhängen Sie das Ergebnis des vorherigen Befehls. Hinweis : Die erste Zeile bezeichnet Host defaultden Alias, den Sie später für den sshBefehl verwenden werden. Nennen Sie es als Ihre Vagabundmaschine oder Dir. Wenn Sie nur ein Vagabund-Verzeichnis haben, können Sie es benennenHost vagrant

  3. Ssh zum Landstreicher : ssh vagrant. Der Nachname ist ein Alias ​​aus dem vorherigen Schritt.

FreeLightman
quelle
1

Sie können jedes der ssh-configArgumente nehmen und sie in der Befehlszeile als an ssh übergeben -o Key=value. Also, für einen einfachen Ein-Host - Vagabund - Setup (Sie vielleicht eine wenig mehr Arbeit mit zu tun haben , grepoder perlfür einen Multihost - Setup), können Sie so etwas wie die folgenden Aktionen durchführen (oder ersetzen Sie perlmit , sedwenn Sie wollen):

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

Mein Env. ist Win7 + Centos. Die Antwort mit der größten Übereinstimmung funktioniert bei mir nicht. Nach dem Scheitern nach dem Versuchssh -p [port] [usrname]@127.0.01 ich bin, verwende ich einfach XShell, um eine neue Sitzung mit dem vagabundierenden Port und dem Benutzernamen hinzuzufügen.

Es klappt.

Vielleicht ist Xshell ein Kandidat.

onebraveman
quelle