하나의 명령으로 scp 파일을 여러 로컬 디렉터리에서 여러 원격 디렉터리로 복사합니다.

하나의 명령으로 scp 파일을 여러 로컬 디렉터리에서 여러 원격 디렉터리로 복사합니다.

여러 로컬 디렉터리의 일부 파일을 여러 원격 디렉터리로 복사해야 합니다.

주문하다:

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

  1. 반복되는 비밀번호 프롬프트를 피하려면 비밀번호 기반 인증 대신 키 기반 인증을 사용하십시오.

    ssh-keygen예를 들어 로컬 시스템에서 실행한 다음 ssh-copy-id user@remotehost각 원격 호스트에 대해 실행합니다. 이번이 이 컴퓨터에 비밀번호를 입력해야 하는 마지막 시간입니다 ssh.scp

    키에 좋은 비밀번호를 사용하고 실행 ssh-agent하거나 이와 유사합니다. 이렇게 하면 로그인 세션에서 처음 사용할 때만 개인 키의 비밀번호를 입력하면 됩니다.

  2. 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호스트에는 외부 루프가 필요하고 scps에는 내부 루프가 필요합니다. 또한 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

관련 정보