여러 로컬 디렉터리의 일부 파일을 여러 원격 디렉터리로 복사해야 합니다.
주문하다:
scp -v /file/source1/* username@host_server:/file/destination1
scp -v /file/source2/* username@host_server:/file/destination2
scp -v /file/source3/* username@host_server:/file/destination3
비밀번호를 계속해서 묻습니다.
주문하다:
scp file1 file2 ... fileN user@host:/destination/directory/
모든 파일을 대상 디렉토리에 배치합니다.
하지만 내 모든 파일의 대상은 다릅니다.
답변1
한 명령에 여러 대상을 지정할 수 없습니다 scp
. 단일 SSH 연결을 설정하려면 다른 도구를 사용해야 합니다.
가장 간단한 해결책은 원격 파일 시스템을 다음에 마운트하는 것입니다.SSHFScp
그런 다음 명령을 사용하십시오 . 이를 위해서는 SFTP 액세스가 필요합니다.
mkdir host_server
sshfs username@host_server:/file host_server
cp /file/source1/* host_server/destination1
cp /file/source2/* host_server/destination2
cp /file/source3/* host_server/destination3
fusermount -u host_server
rmdir host_server
또 다른 해결 방법은 먼저 파일을 로컬로 구성한 다음 계층 구조를 복사하는 것입니다. 이를 위해서는 rsync가 필요합니다.
mkdir destination1 destination2 destination3
ln -s /file/source1/* destination1
ln -s /file/source2/* destination2
ln -s /file/source3/* destination3
rsync -a --copy-unsafe-links destination1 destination2 destination3 username@host_server:/file
rm -r destination1 destination2 destination3
또 다른 해결책은 계속 사용하는 것입니다 scp
. 하지만 먼저 서버에 대한 기본 연결을 엽니다. 이에 대한 설명은 다음과 같습니다.설정된 SSH 채널 사용
아니면 그냥 빨아들여 세 개의 scp
연결을 만들어보세요. 하지만 로그인할 때 비밀번호를 사용하지 마세요. 대신 키 쌍을 만들고 개인 키를 키 에이전트( ssh-add ~/.ssh/id_rsa
)에 로드하면 연결될 때마다 아무 것도 입력할 필요가 없습니다.
답변2
반복되는 비밀번호 프롬프트를 피하려면 비밀번호 기반 인증 대신 키 기반 인증을 사용하십시오.
ssh-keygen
예를 들어 로컬 시스템에서 실행한 다음ssh-copy-id user@remotehost
각 원격 호스트에 대해 실행합니다. 이번이 이 컴퓨터에 비밀번호를 입력해야 하는 마지막 시간입니다ssh
.scp
키에 좋은 비밀번호를 사용하고 실행
ssh-agent
하거나 이와 유사합니다. 이렇게 하면 로그인 세션에서 처음 사용할 때만 개인 키의 비밀번호를 입력하면 됩니다.pdcp
포장을 제거하고 사용하세요pdsh
. 예를 들어:pdcp -w host1,host2,host3 /path/to/source/file /path/on/destination/
또는 호스트 이름이 패턴과 일치하는 경우:
pdcp -w host[1-3] /path/to/source/file /path/on/destination/
여러 대상을 가질 수는 없지만 소스는 여러 개 가질 수 있습니다. 예를 들어
pdcp -w h1,h2,h3 file1 file2 file3 /remote-path/
각 시스템의 /remote-path/ 디렉토리에 복사합니다(이 디렉토리가 없는 모든 대상 시스템은 오류 메시지를 출력합니다).여러 소스 파일을 여러 호스트의 서로 다른 디렉터리에 복사해야 하는 경우 for 루프 래퍼를 사용할 수 있습니다. 일반 오래된 장치에서도 동일한 작업을 수행할 수 있지만
scp
호스트에는 외부 루프가 필요하고scp
s에는 내부 루프가 필요합니다. 또한pdcp
한 번에 하나씩 복사하는 대신 여러 시스템에 병렬로 복사하십시오.pdsh
( 및 )를 사용하면pdcp
머신 그룹에 대한 임의의 이름을 구성할 수 있습니다. 예를 들어 모든 컴퓨팅 노드가 그룹에 있고compute-nodes
, 모든 웹 서버가web
그룹에 있고, 데이터베이스 서버가 그룹에 있고db
, 모든 호스트가 그룹에 있습니다all
.그런 다음 다음과 같이 할 수 있습니다.
pdsh -g web 'uname -a ; uptime'
또는pdcp -g web,db /etc/motd /etc/
답변3
SCP사용SSH데이터 전송을 위해 동일한 인증을 사용하고 동일한 보안을 제공합니다.SSH. 같지 않은원격 제어 프로토콜,SCP인증이 필요한 경우 비밀번호나 패스프레이즈를 입력하라는 메시지가 표시됩니다. 따라서 다음을 수행할 수 있습니다.
1. 해결SSH리모컨을 편집하여 공개 키를 통해 연결하세요 sshd_config
.
# Should we allow Identity (SSH version 1) authentication?
RSAAuthentication yes
# Should we allow Pubkey (SSH version 2) authentication?
PubkeyAuthentication yes
# Where do we look for authorized public keys?
# If it doesn't start with a slash, then it is
# relative to the user's home directory
AuthorizedKeysFile .ssh/authorized_keys
키 쌍 생성
localhost$ ssh-keygen -t rsa
그리고 그것을 원격 호스트로 보내세요.
localhost$ scp ~/.ssh/id_rsa.pub [email protected]
localhost$ ssh [email protected]
remote.server.host$ [ -d ~/.ssh ] || (mkdir ~/.ssh; chmod 700 ~/.ssh)
remote.server.host$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
remote.server.host$ chmod 600 ~/.ssh/authorized_keys
또는
2. [안전하지 않음] 설정비밀번호 없음원격 호스트 사용자
또는
3. 스크립트 사용expect
#!/usr/bin/expect
stty -echo
send_user -- "Enter Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set PASS $expect_out(1,string)
…
spawn scp -v /file/source1/* username@host_server:/file/destination1
expect "assword:"
send $PASS"\r"
expect eof
답변4
명령을 아주 약간만 수정하면 다음과 같은 결과를 얻을 수 있습니다.
Files 폴더에 .. 폴더가 있다고 가정하면 source1, source2
다음과 같이 실행하여 이러한 폴더를 모두 source1, source2 ..
대상 서버에 복사할 수 있습니다.
scp -r /source/file username@host_server:/file/destination1
이렇게 하면 폴더가 생성되고 해당 내용이 source1, source2
대상 서버의 대상 경로에 있는 적절한 폴더에 복사됩니다./file/destination1