Vagrant가 ssh
명령을 사용하여 쉘 스크립트 내에서 VM에 로그하는 방식을 재현하여 Vagrant 인스턴스에 별명을 작성합니다.
일반 ssh
명령을 사용하여 액세스 하는 명령 구문은 무엇입니까 ?
vagrant ssh-config
.
Vagrant가 ssh
명령을 사용하여 쉘 스크립트 내에서 VM에 로그하는 방식을 재현하여 Vagrant 인스턴스에 별명을 작성합니다.
일반 ssh
명령을 사용하여 액세스 하는 명령 구문은 무엇입니까 ?
vagrant ssh-config
.
답변:
-c
옵션 인 인수가 제대로 전달되지 않았기 때문에 "vagrant ssh"를 다시 구현 해야했습니다. 이것이 기본적으로 하는 일입니다 (더 많을 수도 있지만이 방법으로 잘 작동합니다)
#!/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 \
"$@"
단일 라이너로 (kgadek 덕분에) :
ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
여러 개의 유랑 호스트가있는 경우를 고려하여 원하는 호스트를 선택하고 구성에서 빈 줄을 sed를 사용하여 선택합니다 (sed 사용).
HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' | awk 'NR>1 {print " -o "$1"="$2}') localhost
ssh
외부에서 Vagrantfile
( "일반 ssh
명령을 사용하여 ") Vagrant에게 당신 을 허락하지 않습니다 . 이것이 제가 질문을 해석 한 방법입니다.
auto_correct: true
설정 과 함께 사용하지 않는 것을 선택 합니다. 다음은 수동으로 변경하는 방법에 대한 자세한 정보입니다.
Host
항목. 수정 된 명령은 다음과 같습니다.ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
이미 많은 답변이 있지만 모두 지나치게 복잡해 보였거나 질문자가 가지고 있지 않은 문제를 해결했습니다.
간단히:
# save the config to a file
vagrant ssh-config > vagrant-ssh
# run ssh with the file.
ssh -F vagrant-ssh default
vagrant-ssh
파일을 추가하는 중 .gitignore
입니다.
zsh
ssh -F =(vagrant ssh-config) default
-F
간단하지 않습니다
~/.ssh/config
@adamczi가 제안한 방식으로 항목을 추가하면 Visual Studio Code Remote-SSH 확장을 사용하여 Vagrant VM에 ssh하고 파일을 편집하고 원격 개발을 수행 할 수 있습니다. 간단히 CMD-SHIFT-P를 누른 다음 "Remote-SSH : Connect to Host ..."와 방금 추가 한 ssh .config 항목이 자동으로 나열됩니다. 간단히 선택하면 vocode, vscode가 원격 vagrant vm에 연결됩니다! 구성 항목 접근 방식이 없으면 vscode로 어떻게 다른 작업을 수행했는지 잘 모르겠습니다.
터미널 런
vagrant ssh
다른 터미널 창 / 탭 실행
ps aux | grep ssh
여기 Vagrant가 실행 한 실제 명령이 표시됩니다.
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
매개 변수 vagrant ssh-config
를 ssh
사용 하여 전체 를 구성 파일로 전달하십시오 -F configfile
. 연결할 호스트 별명은의 첫 번째 행에 정의되어 있습니다 vagrant ssh-config
. Host default
에 연결할 수 있음을 의미합니다 ssh default
.
표준 입력에서 구성 파일을 읽는 옵션을 볼 수 없으므로 임시 파일 경로를 사용했습니다. 다음은 임시 $TMPDIR.vagrant-ssh-config
파일을 정리하는 하나의 라이너입니다 . Vagrantfile
방랑 상자가 실행 중이라고 가정 하고와 동일한 디렉토리에서 실행해야합니다 .
vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config
참고 : Mac OSX 시스템에서는 (현재)로 $TMPDIR
확장됩니다 /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/
. 시스템에 설정되지 않은 경우 다른 변수 또는 다른 폴더를 사용하십시오 .
ssh -F <(vagrant ssh-config)
zsh : zsh 프로세스 대체 ssh -F =(vagrant ssh-config)
ssh -F
bash에서 작동하지 않습니다 -언급 한 방식은 zsh에서 작동해야합니다.
나는 이것을 매우 간단한 방법으로 해결했습니다 : 당신이 방랑 상자를 시작할 때 다음과 같은 ssh 주소를 보여줍니다
SSH address: 127.0.0.1:2222
그런 다음 방랑자, 호스트 및 포트를 사용하여 상자에 연결할 수 있습니다
ssh vagrant@127.0.0.1 -p 2222
vagrant
당신이 사용하는 표준 입력 할 필요가없는 경우 에 ssh
사용할 수있다 (예를 들어, 당신은 단지 명령 및 로그 아웃을 실행하려는) :
vagrant ssh-config --host default | ssh -F /dev/stdin default
이 방법은 Google 그룹 과 유사한 질문에 대한 응답으로 제안되었습니다 .
불행히도 bash 프로세스 대체 는 작동하지 않습니다 ( 자세한 내용 은 unix.stackexchange 에서이 질문 을 참조하십시오).
대화식 쉘을 원한다면 가장 좋은 옵션은 임시 파일을 만들고 다른 답변에서 제안한대로 ssh -F
사용하거나 사용 awk
하는 것입니다.
다른 답변은 Vagrant가 설치되었다고 가정합니다.
Windows 10에 Vagrant가 설치되어 있지만 vagrant ssh
PuTTy를 SSH 클라이언트로 사용하고 있기 때문에 수 없습니다 .
ssh
는 PATH에 실행 파일이 발견되었습니다 퍼티 링크 SSH 클라이언트입니다. Vagrant는 OpenSSH SSH 클라이언트와 만 호환됩니다.
그러나 Windows 10에서는 Windows의 Ubuntu에 Bash가 있습니다. 그래서 나는 그것을 다음 명령과 함께 사용합니다 :
ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal
Win10-Ubuntu에 Vagrant를 설치하는 것은 쉽지만 어떤 이유로 든 Virtualbox를 설치하기를 원합니다.
NB 나는 ssh default -F vagrant-ssh-config
방법으로 시도했지만 , 나는 단지 얻는다.
권한이 거부되었습니다 (공개 키, 암호).
IdentityFile
경로가 Windows 경로 이기 때문에 Bash에서는로 시작해야하기 때문에 이것이 추측 됩니다 /mnt/c/
. 파일을 작성한 다음 더 잘 작동하면 수정할 수 있다고 가정합니다.
원격 사용자가 시스템에 로그인하는 방법을 복제하는 방법이 있습니다
config.vm.network "private_network", ip: "192.168.33.10"
이렇게하면 호스트에 개인 IP가 추가됩니다 (아직 사용하지 않는 한 192.168 범위에서 원하는 것을 확인하십시오)
your_virtual_host_name.pem
.vagrant \ machines \ default \ virtualbox \ private_key 아래에 키가 있습니다.
홈 디렉토리로 이동하여 일반적인 Unix ssh를 수행하십시오.
ssh -i your_virtual_hostname.pem username@192.168.33.10
표준 상자가있는 경우 사용자 이름이 유용 할 수 있습니다. 상자에 대한 ssh 표준 세부 사항은 vagrant ssh-config 출력을보십시오.
그게 다야
.vagrant
폴더 내의 모든 파일 은 root가 소유 하기 때문에 중요 합니다. 파일에 대한 권한은 rw -------이므로 루트 만 키 파일을 읽을 수있는 권한이있었습니다. 아마도 이것은 누구에게나 도움이 될 것입니다.
Vagrant 는 개인 키를 저장 하고을~/.vagrant.d/insecure_private_key
통해 모든 컴퓨터 ssh
에 연결하는 데 사용합니다. 포트 2200 (기본값)에 연결되도록 구성된 것을 고려하면 다음과 같습니다.
ssh vagrant@localhost -p 2200 -i ~/.vagrant.d/insecure_private_key
참고 :를 실행하는 사용자가 개인 키를 소유하고 있는지 확인하십시오Vagrant
.
다중 머신 환경 을 지향하는 것이 목표라면을 사용하여 수행 할 수 있습니다 config.vm.define
.
다음은이 기계라는 하나의 환경 보여주는 예입니다 web
, 다른됩니다 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
그러면 머신마다 모든 Vagrant 명령을 사용할 수 있습니다 (예 : vagrant ssh web
및) vagrant provision databases
.
vagrant 호스트에 대한 ssh config를 ssh config에 추가 할 수 있습니다.
vagrant 폴더에서 vagrant machine에 대한 ssh 구성을 가져옵니다. vagrant ssh-config
{UserDir}/.ssh/config
이전 명령의 결과를 열고 추가하십시오. 참고 : 첫 번째 줄 Host default
은 나중에 ssh
명령에 사용할 별칭을 의미합니다 . 당신의 이름을 당신의 vagrant machine 또는 dir로 지정하십시오. 방랑자 디렉토리가 하나 뿐인 경우 이름을 지정할 수 있습니다.Host vagrant
ssh to vagrant : ssh vagrant
. 성은 이전 단계의 별명입니다.
ssh-config
인수를 가져 와서 명령 행에서 ssh로 전달할 수 있습니다 -o Key=value
. 그래서, 간단한 하나의 호스트 방랑 설정에 (당신과 함께 조금 더 작업을 수행해야 할 수도 있습니다 grep
또는 perl
, 당신은 다음과 같은 일을 할 수있는 멀티 호스트 설정에 대한) (또는 교체 perl
와 함께 sed
당신이 원하는 경우)
ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost