Ich möchte die Art und Weise reproduzieren, wie Vagrant sich mit einem ssh
-Befehl in meinem VM innerhalb eines Shell-Skripts anmeldet, also erstelle ich einen Alias für meine Vagrant-Instanz.
Wie lautet die Befehlssyntax, um mit dem regulären Befehl ssh
darauf zuzugreifen?
Ich musste "vagrant ssh" erneut implementieren, da die -c
-Option die Argumente nicht ordnungsgemäß weitergegeben hat. Dies ist im Grunde was es tut (es könnte mehr sein, aber es funktioniert gut so)
#!/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 \
[email protected] \
-p $PORT \
"[email protected]"
Als One-Liner (Dank an kgadek):
ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
Um zu berücksichtigen, ob Sie über mehr als einen Host-Host verfügen, wird der gewünschte Host ausgewählt und leere Zeilen aus der Konfiguration entfernt (mithilfe von sed):
Host=name-of-my-Host
ssh $(vagrant ssh-config $Host | sed '/^[[:space:]]*$/d' | awk 'NR>1 {print " -o "$1"="$2}') localhost
Es gibt bereits viele Antworten, aber alle erscheinen zu kompliziert oder lösen Probleme, 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
Im Terminallauf
vagrant ssh
In einem anderen Terminal Fenster/Tab ausführen
ps aux | grep ssh
Dort sehen Sie den eigentlichen Befehl, der von Vagrant ausgeführt wird, etwa so:
ssh [email protected] -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
Übergeben Sie einfach den gesamten vagrant ssh-config
als Konfigurationsdatei mit dem Parameter -F configfile
an ssh
. Der Host-Alias, zu dem eine Verbindung hergestellt werden soll, wird in der ersten Zeile in vagrant ssh-config
definiert. Host default
bedeutet, dass Sie sich mit ssh default
verbinden können.
Ich konnte keine Option zum Lesen der Konfigurationsdatei aus der Standardeingabe sehen, also mit der temporären Dateiroute. Hier ist ein Einzeiler, der anschließend auch die temporäre $TMPDIR.vagrant-ssh-config
-Datei bereinigt. Es muss in demselben Verzeichnis wie Ihr Vagrantfile
ausgeführt werden, 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 erweitert sich $TMPDIR
auf /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/
(jetzt). Verwenden Sie eine andereVariable oder einen anderen Ordner, falls dies nicht in Ihrem System festgelegt ist.
Ich habe das auf sehr einfache Weise gelöst: Wenn Sie die Vagrant-Box starten, wird die SSH-Adresse so angezeigt
SSH address: 127.0.0.1:2222
dann können Sie eine Verbindung zur Box herstellen, indem Sie den Vagabunden-Benutzer, den Host und den Port verwenden, den Sie erhalten
ssh [email protected] -p 2222
Wenn Sie stdin nicht mit ssh
verwenden müssen (beispielsweise 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 groups vorgeschlagen.
Leider funktioniert auch die bash-Prozessersetzung nicht (siehe diese Frage unter unix.stackexchange für weitere Details).
Wenn Sie eine interaktive Shell benötigen, können Sie am besten eine temporäre Datei erstellen und diese mit ssh -F
verwenden oder awk
verwenden, wie in den anderen Antworten vorgeschlagen.
Wenn Sie es nur so einrichten möchten, dass Sie die normale ssh-Befehlszeile sowie scp und andere verwenden können, können Sie vagrant ssh-config
ausführen und die Ausgabe an Ihre standardmäßige ssh-Konfiguration anhängen. Wenn Sie die Zeile "Host-Standard" durch einen aussagekräftigeren Hostnamen ersetzen, sollten Sie sich auf den Weg machen.
vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Viele andere Antworten setzen voraus, dass Sie Vagrant installiert haben.
Ich habe Vagrant unter Windows 10 installiert, kann aber keinen vagrant ssh
, da ich PuTTY als meinen SSH-Client verwende, den der Vagrant nicht akzeptiert.
Die
ssh
-Programmdatei im PATH 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 [email protected] -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal
Es ist leicht genug, Vagrant unter Win10-Ubuntu zu installieren, aber Sie möchten Virtualbox aus irgendeinem Grund installieren, was ich lieber nicht tun möchte.
N.B. Ich habe es mit der ssh default -F vagrant-ssh-config
-Methode versucht, bekomme es aber einfach
Erlaubnis verweigert (Publickey, Passwort).
Ich vermute, das liegt daran, dass der IdentityFile
-Pfad ein Windows-Pfad ist, während er in Bash mit /mnt/c/
beginnen sollte. Ich denke, Sie könnten die Datei einfach ausschreiben und dann ändern, wenn dies für Sie besser ist.
ssh [email protected]<Host>
passwort: vagrant
Beispiele:
oder nach Überprüfung der IP-Adresse (von innen mit vagrant ssh
) ssh [email protected]
Wenn Sie möchten, dass der Befehl "Bare Minimum" eine Verbindung zu Ihrer Box herstellt, müssen Sie den verwendeten Port kennen (gedruckt, wenn Sie vagrant up
ausführen, oder sichtbar, wenn Sie vagrant ssh-config
ausführen) und wo Ihr privater SSH-Schlüssel ist (auch sichtbar, wenn Sie vagrant ssh-config
ausführen
Dann müssen Sie nur den Schlüssel und den Port angeben:
ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key [email protected]
Es gibt eine Möglichkeit, zu replizieren, wie sich ein entfernter Benutzer beim System anmelden kann
config.vm.network "private_network", ip: "192.168.33.10"
Dies fügt eine private IP-Adresse für den Host hinzu (machen Sie es im 192.168-Bereich so, wie Sie es wünschen, solange es noch nicht verwendet wird
your_virtual_Host_name.pem
Sie finden den Schlüssel unter .vagrant\machines\default\virtualbox\private_key
Gehen Sie in Ihr Home-Verzeichnis und führen Sie Ihre gewohnte Unix-SSH aus
ssh -i your_virtual_hostname.pem [email protected]
wo Benutzername, möglicherweise Vagrant, wenn Sie eine Standardbox haben, sehen Sie sich die Ausgabe von Vagrant ssh-config für SSH-Standarddetails für die Box an.
Das ist es
Sie können der lokalen SSH-Konfiguration die Vagrant-Host-Konfiguration hinzufügen.
Vagabund ssh-config >> ~/.ssh/config
ssh vagrant @ {Host}
ex. cat ~/.ssh/config
Host kmaster
HostName 127.0.0.1
User vagrant
Port 2222..
....
Vagrant speichert den privaten Schlüssel in ~/.vagrant.d/insecure_private_key
und verwendet ihn, um über ssh
eine Verbindung zu jedem Rechner herzustellen. Dabei wird davon ausgegangen, dass er für den Anschluss an Port 2200 konfiguriert ist (Standardeinstellung).
ssh [email protected] -p 2200 -i ~/.vagrant.d/insecure_private_key
Hinweis: Stellen Sie sicher, dass der private Schlüssel dem Benutzer gehört, der Vagrant
ausführt.
Wenn Sie jedoch eine Multi-Machine-Umgebung haben möchten, können Sie dies mit config.vm.define
tun.
Hier ist ein Beispiel, das eine Umgebung mit zwei Maschinen veranschaulicht, eine heißt web
und die andere ist 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 für jede Maschine zur Verfügung, d. H. vagrant ssh web
und vagrant provision databases
.
Sie können ssh config für Ihren vagrant Host zu ssh config hinzufügen.
Holen Sie sich die ssh config für den vagrant machine in den vagrant Ordner: vagrant ssh-config
Öffnen Sie {UserDir}/.ssh/config
und hängen Sie das Ergebnis aus dem vorherigen Befehl an. Hinweis : Die erste Zeile Host default
bezeichnet den Alias, den Sie später für den Befehl ssh
verwenden. Nennen Sie es als Ihre Landmaschine oder Ihr Verzeichnis. Wenn Sie nur ein Vagrant-Verzeichnis haben, können Sie es Host vagrant
nennen.
Ssh an vagrant: ssh vagrant
. Der Nachname ist ein Alias aus dem vorherigen Schritt.
Mein Env. ist Win7 + Centos. Die Antwort mit den meisten Übereinstimmungen funktioniert für mich nicht. Nach dem Versuch, ssh -p [port] [usrname]@127.0.01
auszuprobieren, verwende ich einfach XShell, um eine neue Sitzung mit dem vagrant-Port und dem Benutzernamen hinzuzufügen.
Es klappt.
Vielleicht ist Xshell ein Kandidat.
Sie können jedes der ssh-config
-Argumente verwenden und als -o Key=value
an die Befehlszeile von ssh übergeben. Für ein einfaches Ein-Host-Vagrant-Setup (für ein Multihost-Setup müssen Sie möglicherweise etwas mehr mit grep
oder Perl
arbeiten), können Sie Folgendes tun (oder Perl
durch sed
ersetzen, wenn Sie möchten):
ssh `vagrant ssh-config | tail -8 | Perl -pe 's/^\s+/[email protected]/; s/\s/\=/;s/@/ /;s/\n/ /'` [email protected]