호스트에서 Vagrant guest로 단일 파일을 복사하는 가장 쉬운 방법은 무엇입니까?


241

호스트 시스템에서 Vagrant 게스트로 단일 파일을 복사하려는 경우가 있습니다.

전통적인 프로 비져 (Puppet / Chef)를 통해 그렇게하고 싶지는 않습니다. 왜냐하면 이것은 일회성이기 때문입니다. Vagrantfile에 빠르게 추가 할 수 있기를 원합니다.

게스트의 전체 디렉토리를 압축하지 않고 기존 파일을 덮어 쓰려고하므로 전체 디렉토리를 공유하고 싶지 않습니다.

또한 셸 프로비저닝 스크립트를 작성하고 잠재적 탈출을 처리하는 것은 약간의 과도한 노력 인 것처럼 보입니다. 파일을 복사하는 것이 전부입니다.

그렇다면 단일 파일을 호스트에서 게스트로 복사하는 가장 쉬운 방법은 무엇입니까?


허용 된 답변은 Vagrant 1.x 기반으로 합니다. 파일 제공자를 사용하는 것이 표준 Vagrant 2 방식 이지만 /vagrant 여기에 언급 된대로 마운트 포인트를 변경하는 것도 좋은 옵션이 될 수 있습니다.
STW

3
@jouell의 답변은 단일 파일의 일회성 사본의 간단한 유스 케이스에 대해 더 많은 투표를 할 가치가 있습니다. vagrant upload /path/to/my/file...
dat

vagrant scp file.txt :~/.
AlikElzin-kilaka 5

답변:


107

쉘 프로 비저 너를 사용하여 파일을 복사하는 대신 Vagrant file provisioner를 사용할 수도 있습니다 .

제공자 이름 : "file"

파일 제공자를 사용하면 호스트 시스템에서 게스트 시스템으로 파일을 업로드 할 수 있습니다.

Vagrant.configure("2") do |config|
  # ... other configuration

  config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end

3
이것이 Vagrant 2에서 이것을 수행하는 가장 좋은 방법입니다! 그러나이 작업을 수행 할 당시 Vagrant 2를 사용할 수 없었습니다 ... :)
LeeXGreen

4
이 솔루션은 훌륭하게 들리지만 권한 오류로 인해 파일을 복사 할 수 없습니다.
orbatschow

@orbatschow 나는 같은 문제를 겪었지만 그것을 복사하면 안된다/tmp
Ben

6
이것은 OP가 요구 한 것이 아닙니다. 문제는 때때로 파일을 전송 하는 방법이었습니다 . 프로비저닝을 실행해야하는 것은 과잉입니다.
axd

253

가장 쉬운 방법을 요청하므로 vagrant-scp를 사용 하는 것이 좋습니다 . scp 명령을 vagrant에 추가하므로 일반적으로 scp와 마찬가지로 파일을 VM에 복사 할 수 있습니다.

다음을 통해 설치하십시오.

vagrant plugin install vagrant-scp

다음과 같이 사용하십시오.

vagrant scp <some_local_file_or_dir> [vm_name]:<somewhere_on_the_vm>

1
이것은 나를 위해 작동하지 않았습니다. 플러그인을 설치했지만 "vagrant-scp"플러그인을 찾을 수 없습니다.라는 오류 메시지가 계속 표시됩니다.를 통해 제대로 설치되었는지 확인하십시오 vagrant plugin. "
rockerston

6
안녕하세요, vagrant-scp는 Vagrant 1.7 이상에서 작동합니다. 연 버그에서 1.4.3을 실행 중입니다. 이 플러그인이 필요하다면 업그레이드해야 할 것 같습니다 (빠르고 고통스럽지 않습니다).
Luca Invernizzi

1
파일을 복사하기 위해이 명령을 시도했지만 작동하지 않아 오류가 발생했습니다 vagrant scp /vagrant/www/koushik.php ubuntu/trusty64:/usr/share/nginx/html. 파일을 nginx 루트 디렉토리에 복사하려고합니다. The machine with the name 'C' was not found configured for this Vagrant environment. 디렉토리와 모든 것이 정상 이라고 말합니다 .
Koushik Das

3
한 가지 추가해야 할 사항 : 첫 번째 열에서 방랑 전역 상태를 얻을 수있는 컴퓨터의 ID를 사용해야합니다. 그럼에도 불구하고 이것은 최고의 솔루션 imho입니다.
min hundje

1
@KoushikDas Windows에서 기본적으로 작동하지 않습니다. Windows 10에서 Ubuntu 하위 시스템을 활성화 한 다음 파일 경로에 C : / ..를 넣는 대신 / mnt / c / ...를 입력하십시오. hooray! 또한 다른 의견에 주목하십시오. 방랑 전 세계 상태를 사용하여 방랑자 컴퓨터의 ID를 얻으십시오.
Andrew

141

실제로 훨씬 간단한 해결책이 있습니다. https://gist.github.com/colindean/5213685/#comment-882885를 참조 하십시오 .

"특정 이유로 scp를 원하지 않는 한 파일을 호스트에서 VM으로 전송하는 가장 쉬운 방법은 Vagrantfile과 동일한 디렉토리에 파일을 저장하는 것입니다. 해당 디렉토리는 VM의 / vagrant에 자동으로 마운트되므로 VM에서 직접 복사하거나 사용할 수 있습니다. "


3
이것은 내 대답이 정확히하는 것입니다 ... 쉘 제공자를 실행하여 / vagrant /에서 파일을 복사합니다.
LeeXGreen

2
LeexGreen이 사용한 것처럼 프로 비전 프로비저닝을 사용하는 것이 좋습니다.
tokhi

4
을 확인 config.vm.synced_folder ".", "/vagrant", disabled: false후와vagrant reload
크리스토퍼 Markieta에게

역 작업을 수행하려는 경우 (가상 상자를 로컬 컴퓨터로)이 작업은 상자 에서 작동 하지 않습니다centos/7 .
ryantuck

내 우분투 14 방랑 VM에서 호스트로 파일을 복사 할 때 완벽하게 작동합니다. 감사!!
XtraSimplicity

98

기본적으로 첫 번째 인스턴스 인스턴스는 ssh 포트를 2222로 사용하고 해당 IP 주소는 127.0.0.1입니다 (실제 가상 호스트로 포트를 조정해야 할 수도 있음)

==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)

따라서 아래 명령을 실행하여 로컬 파일을 방랑 인스턴스에 복사 할 수 있습니다. 비밀번호는 사용자 이름과 동일 vagrant합니다.

scp -P 2222 your_file vagrant@127.0.0.1:.

파일을 로컬 호스트로 다시 복사 할 수도 있습니다.

scp -P 2222 vagrant@127.0.0.1:/PATH/filename .

3
이 작업을 수행하고 엄격한 키 검사를 비활성화해야했습니다.scp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no my-file.txt matt@127.0.0.1:/tmp
Matt

이 ssh 옵션을 ~/.ssh/config기본값 으로 추가하는 것이 좋습니다 . 내 환경에서 수행했습니다.StrictHostKeyChecking no
BMW

1
하나 + 하나는 포트의 값은 오라클 VM 버추얼 Manager의 UI에서주의해야 하나 개 이상의 가상 머신이있는 경우 - 선택 왼쪽에있는 VM, 설정, 네트워크, 포트 포워딩
Yordan 게오르기을

1
이것은 받아 들인 대답보다 낫습니다. / vagrant 디렉토리가 항상있는 것은 아닙니다.
jimm101

rsync가 "rcp를보다 빠르고 유연하게 대체"한다고 설명 rsync하면이 경우에 비해 작업 이 훨씬 더 어려워 scp집니다.
와일드 카드

56

문제에 대한 나의 접근 방식은 다음과 같습니다.

1 단계-개인 키, ssh 포트 및 IP를 찾습니다.

root@vivi:/opt/boxes/jessie# vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /root/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

2 단계-포트 및 개인 키를 scp의 매개 변수로 사용하여 파일 전송 :

  scp -P 2222 -i /root/.vagrant.d/insecure_private_key \
  someFileName.txt vagrant@127.0.0.1:~

도움이 되길 바랍니다.


4
이것이 가장 간단한 방법입니다. 감사합니다.
elmonkeylp

2
키를 사용하여 파일을 전송할 수있었습니다. 이 정보가없는 높은 답변은 효과가 없었으므로 감사합니다!
inostia 2016 년

1
쉽고 완벽한 솔루션.
Tao Starbow

27

내가 한 일은 내 파일을 내 vagrant 디렉토리 (자동으로 / vagrant /로 마운트) 내에 유지하고 쉘 프로 비져로 복사하는 것입니다.

command = "cp #{File.join('/vagrant/', path_within_repo)} #{remote_file}"
config.vm.provision :shell, :inline => command

4
src dest와 install같은 coreutils를 사용하는 것이 좋습니다 install -D -m644 -C .... cp 대신에 권한, 소유권 지정, 자동으로 주요 디렉토리 생성, 파일 업데이트가 필요한 경우에만 복사 등의 작업을 수행 할 수 있기 때문에 cp 대신에 간단합니다. 할 필요가.
xenoterracide 2016 년

@LeeXGreen. 나는 당신이하려고했던 것과 똑같은 일을하려고 노력하고 있지만 대답을 얻지 못했습니다. 터미널에 해당 코드 줄을 입력 했습니까? 정확히 어디에 두었습니까?
Dan Rubio

내 답변의 코드 스 니펫은 Vagrantfile다른 프로비저닝과 함께 제공됩니다. 당신은 교체해야 path_within_repo하고 remote_file:) 물론, 응용 프로그램, 이해가 가지로
LeeXGreen

오류 ": 표준 입력 터미날 아닌 기본"작품하지만 난 얻을
radtek


20

디렉토리에 파일이없는 경우 호스트 시스템의 스크립트 파일에서이 코드를 실행할 수 있습니다.

#!/bin/sh
OPTIONS=`vagrant ssh-config | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`

scp ${OPTIONS} /File/To/Copy vagrant@YourServer:/Where/To/Put/File

이 설정에서는 /File/To/Copy복사하려는 파일 로만 변경 하면되며 파일을 복사 /Where/To/Put/File할 VM의 위치입니다.

이 파일을 작성하고 호출 copyToServer.sh하면 sh명령을 실행하여 해당 파일을 푸시 할 수 있습니다.

sh ./copyToServer.sh

마지막으로이 코드 provisioner는 게스트 서버에서 실행되고이 코드는 호스트에서 실행되므로이 코드를 실행할 수 없습니다 .


1
이것은 아마도 vagrant-scp 플러그인을 설치하는 것 이외의 최상의 솔루션 일 것입니다. Vagrant가 사용하는 SSH 구성을 사용하므로 다른 공급자가 제공하는 다른 네트워크 설정을 처리 할 수 ​​있습니다.
Sandy Chapman

1
좋은! 또한 사람들은 출력을 가져 와서 vagrant ssh-config~ / .ssh / config 파일에 붙여 넣어 나중에 더 쉽게 만들 수 있습니다. 즉 chf의 답변과 이것을 결합
nealmcb

2
ssh-config 섹션의 헤더 인 "Host default"로 인해 "명령 줄 옵션으로 지원되지 않는 호스트 지시문"오류를 피하기 위해 ssh-config 출력의 첫 번째 줄을 건너 뛸 필요가 있음을 발견했습니다. 따라서 내 스크립트는 OPTIONS=`vagrant ssh-config | tail -n +2 | awk -v ORS=' ' '{print "-o " $1 "=" $2}'`ssh-config 출력의 첫 번째 줄을 사용하지 않아야합니다.
troyfolger

1
또는 "호스트 지시문이 지원되지 않음"오류를 제거하려면 OPTIONS=`vagrant ssh-config | grep -v '^Host ' | awk -v ORS=' ' 'NF{print "-o " $1 "=" $2}'`여기에 설명 된대로 사용할 수 있습니다 . gist.github.com/geedew/11289350
user783836

10

Vagrant는 로그인하는 대신 ssh를 통해 명령을 실행하는 방법을 제공하므로 Linux 호스트 및 게스트의 경우 다음을 사용할 수 있습니다.

  • 호스트에서 게스트로 :

cat ~/file_on_host.txt | vagrant ssh -c 'cat - > ~/file_on_guest.txt'

  • 게스트에서 호스트로 :

vagrant ssh -c 'cat ~/file_on_guest.txt' > ~/file_on_host.txt

플러그인이나 게스트를 다시로드 할 필요가 없습니다. Vagrantfile과 동일한 디렉토리에 있지 않은 경우 'vagrant ssh'에 vagrant box ID를 제공하십시오. Vagrant v1.8.1에서 테스트되었습니다.


게스트에서 호스트로 접근 할 때 파일에 특수 기호가 보존되지 않음
Dr.X

9

에 항목을 추가 할 수 있습니다 ~/.ssh/config:

Host vagrant
    User vagrant
    HostName localhost
    Port 2222
    IdentityFile /home/user_name/.vagrant.d/insecure_private_key

간단한 scp file vagrant:/path/. vagrant ssh-config명령을 사용하여 ID 파일의 경로를 찾을 수 있습니다 .


1
매우 유용하며 진행중인 작업을 명확하게합니다. 이를 통해 양방향 복사, 재귀 복사 등을 수행하고 scp / ssh에 대한 기존 지식을 훌륭하게 활용할 수 있습니다.
nealmcb

1
위의 답변을 다시 읽고 vagrant ssh-config~ / .ssh / config에 넣을 수있는 훨씬 더 완전하고 편리한 구성 을 제공 하는 geedew의 답변을 재생하여 발견했습니다 . 그러나 다시 감사합니다!
nealmcb

7

가지고있는 디렉토리로 이동하여 Vagrantfile
편집 한 후 Vagrantfile다음을 추가하십시오.

config.vm.synced_folder ".", "/vagrant", :mount_options => ['dmode=774','fmode=775']

"." " 현재 호스트 컴퓨터 에있는 디렉토리
"/ vagrant "게스트 컴퓨터 (Vagrant machine)의 "/ home / vagrant "를 나타냅니다 .

당신이 당신이 폴더에 게스트 컴퓨터에 전송하는 데 필요한 파일을 복사 Vagrantfile 한 다음 열기 힘내 배쉬cd당신의 가지고있는 디렉토리 Vagrantfile와 종류를 :

vagrant scp config.json XXXXXXX:/home/vagrant/

여기서 XXXXXXX는 vm 이름 입니다. 다음을 실행하여 VM 이름을 얻을 수 있습니다

vagrant global-status

7

어떤 이유로 든 사용 권한이없는 경우

vagrant plugin install vagrant-scp

다른 방법이 있습니다.

먼저 yourVagrantProject를 방랑 한 다음 터미널에 작성하십시오.

vagrant ssh-config

가상 머신의 "HostName"및 "Port"에 대한 정보가 있습니다.

어떤 경우에는 프로젝트에 가상 머신이있을 수 있습니다. 따라서 마스터 머신 (일반적 으로이 VM에는 포트 2222가 있음)을 찾으십시오. 다른 머신 정보에는주의를 기울이지 마십시오.

복사 명령을 작성하십시오.

scp -P xxPortxx  /Users/where/is/your/file.txt  vagrant@xxHostNamexx:/home/vagrant

이 가파른 곳에서는 방랑자 암호를 입력해야합니다. 기본적으로 "방랑자"입니다.

그 후에 가상 머신의 파일을 보면 :

vagrant ssh xxVirtualMachineNamexx
pwd
ls

가상 머신 디렉토리에 "file.txt"가 있습니다.


방랑자 암호를 입력 한 후 "권한이 거부되었습니다"
user2568374

2
그러나 이것은 대상 디렉토리에 대한 권한 때문이었습니다. 나는 / home / vagrant에 복사했고 그것은 효과가 있었다.
user2568374

4

당신의 vagrant box name을 알고 있다면 vagrant scp plugin이 작동합니다. 상자 이름을 제공하는 방랑 전 세계 상태를 확인하면 다음을 실행할 수 있습니다.

vagrant global-status
id       name    provider   state   directory
------------------------------------------------------------------------
13e680d  **default** virtualbox running /home/user

vagrant scp ~ / foobar "내 이름은 default": / home / "user"/


1
이것은 나를 위해 일했습니다. 편집도 도움이됩니다. 또한 vagrant scp 플러그인을 설치하는 명령도 포함합니다.
WhyAyala

1

이것을보십시오 .. 방랑 우분투 14.04 이것은 나를 위해 일했다.

scp -r -P 2222 vagrant@localhost:/home .

1

아무것도 설치하지 않고이 작업을 수행하는 다른 방법 vagrant-scp은 이름 default을 그대로 사용하므로 이름 을 그대로 사용해야 vagrant ssh-config합니다.

vg_scp() {
  tmpfile=$(mktemp /tmp/vagrant-ssh-config.XXXX)
  vagrant ssh-config > $tmpfile
  scp -F $tmpfile "$@"
  rm $tmpfile
}

# Copy from local to remote
vg_scp somefile default:/tmp

# Copy from remote to local
vg_scp default:/tmp/somefile ./

# Copy a directory from remote to local
vg_scp -r default:/tmp ./tmp

scp -F =(vagrant ssh-config) ...쉘에서 작동 했을 경우이 기능은 필요하지 않습니다 . 그러나 이것은 Bash에서 지원하지 않기 때문에이 해결 방법을 사용해야합니다.


1

누군가 Windows 호스트에서 방랑자로 파일을 옮기고 싶다면이 솔루션이 효과적이었습니다.

1. Make sure to install **winscp** on your windows system
2. run **vagrant up** command
3. run **vagrant ssh-config** command and note down below details
4. Enter Hostname, Port, Username: vagrant, Password: vagrant in winscp and select **SCP**, file protocol 
5. In most cases, hostname: 127.0.0.1, port: 2222, username: vagrant, password: vagrant.

유랑 시스템에서 디렉토리를 볼 수 있어야합니다.


-3

로컬에서 파일을 파일을 복사하는 가장 좋은 방법, 코드를 작성하거나 구성을 변경할 필요가 없습니다. 1- 먼저 방랑자 ( vagrant up ) 2- open cygwin 3- cygwin : 방랑자 파일이있는 폴더로 이동하거나 방랑자 4 ssh vagrant 5를 시작하는 곳으로 이동하십시오. 이제 일반 시스템처럼 작동합니다.


이 접근 방식에서 발견 한 한 가지 문제 : 방랑자가 Guest Additions를 구성해야하는 경우 파일 제공자가 실행될 때 / vagrant 디렉토리가 실제로 마운트되지 않을 수 있습니다.
Torenware Networks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.