Jak ssh włóczyć się bez uruchamiania „vagrant ssh”?

149

Chciałbym odtworzyć sposób, w jaki Vagrant loguje się do mojej maszyny wirtualnej w skrypcie powłoki za pomocą sshpolecenia, więc tworzę alias do mojej instancji Vagrant.

Jaka jest składnia polecenia, aby użyć zwykłego sshpolecenia, aby uzyskać do niego dostęp?

Kevin Burke
źródło
O co właściwie pytasz? Widzę trzy różne pytania, może mógłbyś rozwinąć pytanie, a następnie zaznaczyć, aby przeprowadzić migrację. Dzięki.
Kev,
3
Domyślnie port ssh maszyny wirtualnej, który jest -22, zostanie przekierowany do 2222 na maszynie hosta. Wpuściłem na 127.0.0.1 i port 2222 z SSH i zadziałało!
Vishal Biyani
8
Jeśli używasz więcej niż jednego urządzenia, ten numer portu zmieni się automatycznie. Możesz zdobyć właściwy, biegając vagrant ssh-config.
Stefano Palazzo

Odpowiedzi:

108

Musiałem ponownie zaimplementować "vagrant ssh", ponieważ ta -copcja nie przekazywała poprawnie argumentów. To w zasadzie to, co robi (może być więcej, ale w ten sposób działa dobrze)

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

W wersji jednowarstwowej (dzięki kgadek):

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

Aby uwzględnić, gdy masz więcej niż jednego hosta włóczęgi, wybierze żądanego hosta, a także puste wiersze z konfiguracji (używając seda):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
źródło
3
Ta odpowiedź nie pozwala ci sshdotrzeć do twojego Vagranta spoza Vagrantfilekatalogu ("używając zwykłej sshkomendy"), tak jak zinterpretowałem pytanie.
sjy
Możesz ustawić port samodzielnie. Dzięki temu skrypt będzie możliwy do wykonania z dowolnego katalogu.
Yser
Więc co sprawia, że ​​ten port jest sposobem na dostanie się do maszyny? Gdzie jest konfiguracja tego portu?
nroose
1
Vagrant wybiera nieużywany z auto_correct: trueustawieniem. Oto więcej informacji na temat ręcznej zmiany
Stefano Palazzo
1
Musiałem pominąć pierwszą linię, tj. Hostwpis. Zmodyfikowane polecenie to:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
148

Jest już wiele odpowiedzi, ale wszystkie wydają się zbyt skomplikowane lub rozwiązują problemy, których pytający nie miał.

po prostu:

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

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
źródło
2
To jest niesamowite. Pamiętaj, aby dodać vagrant-sshplik .gitignore.
sashaegorov
5
Z niektórymi muszlami (np. zsh) Działa następująca ssh -F =(vagrant ssh-config) default
jednolinijka
4
Możesz chcieć powtórzyć ten wynik w sshpliku konfiguracyjnym vagrant ssh-config >> ~/.ssh/configssh defaultdefault
:,
Dzięki @adamczi jest to uproszczony sposób, który działa również w przypadku zautomatyzowanych rozwiązań, w których dodanie dodatkowego parametru ssh -Fnie jest proste
laimison
3
Dodając wpis ~/.ssh/configw sposób sugerowany przez @adamczi, możesz następnie użyć rozszerzenia Visual Studio Code Remote - SSH do ssh na Vagrant VM i edytować pliki i wykonywać zdalne programowanie. Po prostu CMD-SHIFT-P, a następnie "Remote-SSH: Połącz z hostem ...", a właśnie dodany wpis ssh .config jest automatycznie wyświetlany - po prostu go wybierz i voila, vscode łączy się ze zdalnym vagrantem vm! Bez podejścia do wprowadzania konfiguracji nie jestem pewien, jak inaczej zrobiłbym to z vscode.
abulka
52

W biegu terminala

vagrant ssh

W innym oknie / karcie terminala uruchom

ps aux | grep ssh

Tam zobaczysz rzeczywiste polecenie wykonane przez Vagranta, coś takiego:

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
źródło
Świetna sztuczka, jeśli potrzebujesz hosta swojego włóczęgi do ssh z innych powodów, takich jak połączenie GUI SQL, takie jak Sequel Pro. Ten ocal mnie!
Atomox
19

Po prostu przekaż całość vagrant ssh-configjako plik konfiguracyjny sshz -F configfileparametrem. Alias ​​hosta do połączenia jest zdefiniowany w pierwszym wierszu vagrant ssh-config; Host defaultoznacza, że ​​możesz się połączyć ssh default.

Nie widziałem opcji odczytu pliku konfiguracyjnego ze standardowego wejścia, więc poszedłem z trasą pliku tymczasowego. Oto jedna linijka, która $TMPDIR.vagrant-ssh-configpóźniej czyści również plik tymczasowy . Musi być wykonany w tym samym katalogu, co twój Vagrantfile, zakładając, że twój włóczęga działa i działa.

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

Uwaga: w moim systemie Mac OSX $TMPDIRrozszerza się do /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(w tej chwili). Użyj innej zmiennej lub innego folderu, jeśli nie jest ustawiony w systemie.

Joel Purra
źródło
3
Jeśli używasz bash lub zsh, podstawianie procesów jest prostszym sposobem przekazywania wyników jednego polecenia do drugiego. bash: ssh -F <(vagrant ssh-config) zsh: zsh zastępowanie procesu ssh -F =(vagrant ssh-config)
myeeshen
@myshen: zgodnie z odpowiedzią przez @tyrion podstawianie procesu nie działa ssh -Fw bash - sposób, w jaki wspomniałeś, powinien jednak działać w zsh.
Joel Purra,
Cholera, naprawdę muszę się nauczyć, jak właściwie używać włóczęgi, nie wspominając o bash.
Spencer Williams,
14

Rozwiązałem to w bardzo prosty sposób: kiedy uruchamiasz pudełko włóczęgów, pokazuje on adres ssh w ten sposób

SSH address: 127.0.0.1:2222

następnie możesz połączyć się ze skrzynką, używając użytkownika włóczęgi, hosta i otrzymanego portu

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
źródło
1
miły! i zauważ, że zazwyczaj hasło użytkownika włóczęgi tovagrant
Brad Parks,
7

Jeśli nie potrzebujesz używać stdin z ssh(na przykład chcesz wykonać tylko polecenie i wylogować się), możesz użyć:

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

Ta metoda została zasugerowana w odpowiedzi na podobne pytanie w grupach google .

Niestety podstawianie procesów bash również nie działa (zobacz to pytanie na unix.stackexchange, aby uzyskać więcej informacji).

Najlepsze opcje, jakie masz, jeśli chcesz mieć interaktywną powłokę, to utworzenie pliku tymczasowego i użycie go z innymi odpowiedziami ssh -Flub użycie go awkzgodnie z sugestiami innych odpowiedzi.

tyrion
źródło
5

Jeśli chcesz tylko ustawić to tak, aby móc używać normalnego wiersza poleceń ssh, a także scp i tym podobnych, możesz uruchomić vagrant ssh-configi dołączyć dane wyjściowe do domyślnej konfiguracji ssh. Jeśli zamienisz wiersz „Host default” na bardziej opisową nazwę hosta, wszystko będzie dobrze.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
źródło
Dokładnie to, co zalecił lekarz ... Dzięki.
xenoid
4

Jeśli chcesz, aby minimalne polecenie łączyło się z twoim urządzeniem, musisz znać port, którego używa (drukowany podczas wykonywania vagrant uplub widoczny vagrant ssh-config) i gdzie jest twój prywatny klucz SSH (widoczny również podczas wykonywania vagrant ssh-config)

Wtedy wystarczy podać klucz i port:

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

Nico Villanueva
źródło
4

Wiele innych odpowiedzi zakłada, że ​​masz zainstalowany Vagrant.

Mam Vagrant zainstalowany na Windows 10, ale nie mogę, vagrant sshponieważ używam PuTTy jako mojego klienta SSH, którego włóczęga nie zaakceptuje.

Plik sshwykonywalny znajdujący się w PATH jest klientem PuTTY Link SSH. Vagrant jest kompatybilny tylko z klientami OpenSSH SSH.

Jednak w Windows 10 mamy również Bash na Ubuntu na Windowsie. Więc po prostu używam tego z następującym poleceniem:

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

Wystarczająco łatwo jest zainstalować Vagrant na Win10-Ubuntu, ale z jakiegoś powodu chce również, abyś zainstalował Virtualbox, czego wolałbym nie robić.

NB próbowałem z tą ssh default -F vagrant-ssh-configmetodą, ale po prostu otrzymałem

Odmowa dostępu (klucz publiczny, hasło).

Domyślam się, że dzieje się tak, ponieważ IdentityFileścieżka jest ścieżką systemu Windows, podczas gdy w Bash powinna zaczynać się od /mnt/c/. Przypuszczam, że możesz po prostu zapisać plik, a następnie zmodyfikować go, jeśli to działa lepiej.

mpen
źródło
4

Możesz dodać konfigurację hosta vagrant do swojej lokalnej konfiguracji ssh.

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

  2. ssh vagrant @ {host}

dawny. cat ~ / .ssh / config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant @ kmaster
Vinay Kumar Gupta
źródło
3

Istnieje sposób, który powiela sposób, w jaki zdalny użytkownik może zalogować się do systemu

  1. Edytuj plik Vagrantfile dla dodanej instancji

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

Spowoduje to dodanie prywatnego adresu IP dla hosta (ustaw go tak, jak chcesz w zakresie 192.168, o ile nie jest już używany

  1. Zrestartuj instancję za pomocą funkcji Vagrant reload z wiersza poleceń
  2. Skopiuj plik vagrant private_key do jakiegoś odpowiednika Linuksa, który powinieneś mieć uruchomionego na swoim komputerze (np. Cygwin, jeśli w systemie Windows, używam systemu Windows 10) do katalogu domowego cygwin, zmieniając jego nazwę po drodze na coś opisującego hosta, którego klucz ma być używany np

your_virtual_host_name.pem

  1. Klucz znajdziesz w folderze .vagrant \ machines \ default \ virtualbox \ private_key

  2. Idź do swojego katalogu domowego i wykonaj swoje zwykłe uniksowe ssh, więc

ssh -i your_virtual_hostname.pem [email protected]

gdzie nazwa_użytkownika, może być włóczęgą, jeśli masz standardowe pudełko, spójrz na wyjście vagrant ssh-config dla standardowych szczegółów ssh dla tego pudełka.

Otóż ​​to

Jimbo
źródło
Dziękuję, dzięki twojemu pomysłowi skopiowania pliku klucza od włóczęgi gdzie indziej zdałem sobie sprawę, jaki mam problem - użyłem dostawcy libvirt w systemie Linux. Jest to ważne, ponieważ w przypadku dostawcy libvirt musisz zainicjować vagrant za pomocą sudo, a .vagrantzatem wszystkie pliki w folderze są własnością roota. A uprawnienia do pliku to rw -------, więc tylko root miał uprawnienia do odczytu pliku klucza. Może to mogłoby być pomocne dla każdego.
TomasH
2

Vagrant przechowuje klucz prywatny ~/.vagrant.d/insecure_private_keyi używa go do łączenia się z każdą maszyną ssh, biorąc pod uwagę, że jest skonfigurowany do łączenia się na porcie 2200 (domyślnie), wyglądałoby to tak:

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

Uwaga: upewnij się, że klucz prywatny należy do uruchomionego użytkownikaVagrant .

Chociaż jeśli Twoim celem jest stworzenie środowiska wielomaszynowego, możesz to zrobić za pomocą config.vm.define.

Oto przykład ilustrujący środowisko z 2 maszynami, jedną wywołaną, weba drugą 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

Wtedy będziesz mieć wszystkie polecenia Vagrant dostępne na urządzeniu, czyli vagrant ssh weba vagrant provision databases.

Mulkave
źródło
Czy mogę zmienić konfigurację jednego komputera na konfigurację z dwoma maszynami, jeśli uczynię stary komputer „podstawowym”?
nroose
2

Możesz dodać konfigurację ssh dla swojego hosta włóczęgi do konfiguracji ssh.

  1. Pobierz konfigurację ssh dla maszyny vagrant w folderze vagrant: vagrant ssh-config

  2. Otwórz {UserDir}/.ssh/configi dołącz tam wynik z poprzedniego polecenia. Uwaga : pierwsza linia Host defaultoznacza alias, którego będziesz używać później do sshpolecenia. Nazwij go swoją włóczęgą maszyną lub reż. Jeśli masz tylko jeden film włóczęgów - możesz go nazwaćHost vagrant

  3. Ssh do Vagrant: ssh vagrant. Nazwisko to alias z poprzedniego kroku.

FreeLightman
źródło
1

Możesz wziąć dowolny z ssh-configargumentów i przekazać go do ssh w wierszu poleceń jako -o Key=value. Tak więc, za prosta-gospodarza Vagrant konfiguracji (może trzeba zrobić trochę więcej pracować z greplub perldo multihost Setup), można zrobić coś jak następuje (lub wymienić perlw sedrazie potrzeby):

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

Moja kop. to Win7 + Centos. Odpowiedź, która jest najbardziej zgodna, nie działa dla mnie. Po niepowodzeniu po wypróbowaniu po ssh -p [port] [usrname]@127.0.01prostu używam XShell, aby dodać nową sesję z portem włóczęgi i nazwą użytkownika.

To działa.

Może Xshell jest kandydatem.

onebraveman
źródło