쉘 스크립트를 사용하여 scp 파일 전송 자동화


83

내 유닉스 시스템의 디렉토리에 n 개의 파일이 있습니다. scp를 통해 모든 파일을 지정된 원격 시스템으로 전송하는 쉘 스크립트를 작성하는 방법이 있습니까? 각 파일에 대해 입력 할 필요가 없도록 스크립트 내에 암호를 지정하겠습니다.


2
rsync와 함께 쉘 스크립트에서 암호를 사용했는지 또는 시도했는지 알려 주실 수 있습니까? 감사.

답변:


88

쉘 스크립트에서 비밀번호를 하드 코딩하는 대신 쉽고 안전한 SSH 키를 사용하십시오.

$ scp -i ~/.ssh/id_rsa *.derp devops@myserver.org:/path/to/target/directory/

개인 키가 ~/.ssh/id_rsa있고 보내려는 파일을 다음으로 필터링 할 수 있다고 가정합니다.*.derp

공개 / 개인 키 쌍을 생성하려면 :

$ ssh-keygen -t rsa

위는 ~/.ssh/id_rsa(개인 키) 및 ~/.ssh/id_rsa.pub(공개 키) 2 개의 파일을 생성합니다.

설정하려면 사용을위한 SSH 키 (한 번 작업) : 복사의 내용 ~/.ssh/id_rsa.pub과의 새로운 라인에 붙여 넣기 ~devops/.ssh/authorized_keysmyserver.org서버입니다. 만약~devops/.ssh/authorized_keys존재하지 않는 자유롭게 생성하십시오.

명쾌한 방법 가이드는 여기에서 사용할 수 있습니다 .


1
이 지침을 따른 후에도 여전히 암호를 입력하라는 메시지가 표시됩니다 ... 누락 한 다른 기준이 있습니까?
scottysseus

@ScottScooterWeidenkopf .ssh dir 또는 authorized_keys 파일에 올바른 권한이 없을 수 있습니다 (700)와 같이 잘못 될 수있는 몇 가지 사항이있을 수 있습니다.
Pradeep Pati 2015

2
@PradeepPati 내 문제를 알아 냈습니다. 맞습니다. 문제는 권한이었습니다. 제공하신 링크에서 저자가 몇 가지 권한 변경 사항을 언급했습니다. 나는 그러한 변경을했고 이제 모든 것이 작동합니다.
scottysseus

1
이 솔루션의 복사-붙여 넣기 사용과의 혼동을 피하기 위해 현재이 답변은 원격에서 로컬로 전송되는 것으로 보입니다. 이는 OP가 수행하려는 것과 반대입니다.
Ciabaros

@Ciabaros 좋은 캐치! 답변을 업데이트했습니다. 감사!
Pradeep Pati

42
#!/usr/bin/expect -f

# connect via scp
spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "PASSWORD\r"
  }
}
interact

http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command


Windows 사용자를위한 참고 사항 : expectMSYS2에 패키지 된 내용은 전체 출력과 일치하므로 첫 번째 규칙은 항상 일치합니다. 두 규칙의 순서를 바꾸면 원하는 동작을 얻을 수 있습니다.
fzbd

18

이걸 해보지 그래?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

1
#! 니스 대안은 / usr / 빈 / -f 기대
TH_

16

rsync를 사용할 수도 있습니다. scp IMHO보다 여러 파일에서 더 잘 작동하는 것 같습니다.

rsync -avzh / path / to / dir / user @ remote : / path / to / remote / dir /

최신 정보

'-e'스위치를 추가하여 ssh를 통해 rsync를 사용할 수 있습니다.

rsync -avzh -e ssh / path / do / dir / user @ remote : / path / to / remote / dir /

3
scp의 좋은 점은 보안 채널을 사용한다는 것입니다. rsync는 그렇지 않습니다.

3
rsync가 ssh를 사용하도록 강제 할 수 있습니다. 'rsync -avz -e ssh remoteuser @ remotehost : / remote / dir / this / dir /'

@flokra. 감사합니다. 업데이트를 추가하는 도중에 산만 해졌습니다.
bsisco

9
이것은 여전히 ​​대화 형 암호 프롬프트를 호출합니다. OP는 완전히 자동화 된 솔루션을 원했다고 생각합니다
Tom Auger 2011

@Dimitri scp -r은 파일을 재귀 적으로 복사합니다. 스크립트 내에 암호를 저장하고 bash 스크립트를 통해 scp 호출에 전달하는 것과는 아무 관련이 없습니다! 나는 당신의 의견을 정말로 이해하지 못합니다.
Tom Auger

9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

rsync에 사용할 수 있습니까? 뭔가를하려고하는데 RSA 키 방법이 작동하지 않습니다. 원격 컴퓨터의 암호를 계속 묻습니다.

5

와일드 카드 또는 여러 파일은 어떻습니까?

scp file1 file2 more-files* user@remote:/some/dir/

4

rsync는 rcp와 거의 동일한 방식으로 작동하지만 더 많은 옵션이 있으며 대상 파일이 업데이트 될 때 파일 전송 속도를 크게 높이기 위해 rsync 원격 업데이트 프로토콜을 사용하는 프로그램입니다.

rsync 원격 업데이트 프로토콜을 통해 rsync는이 패키지와 함께 제공되는 기술 보고서에 설명 된 효율적인 체크섬 검색 알고리즘을 사용하여 네트워크 연결을 통해 두 파일 세트 간의 차이점 만 전송할 수 있습니다.


한 위치에서 다른 위치로 폴더 복사

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  

3

스크립트를 실행할 때마다 비밀번호를 한 번 입력해도 괜찮다면 SSH 마스터 연결을 사용하여 쉽게 할 수 있습니다.

#!/usr/bin/env bash

USER_AT_HOST="user@host"  # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"

# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"

# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy

# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"

# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"


1

이것은 작동합니다 :

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact

1

다음은 .pem 키 파일이있는 SCP의 bash 코드입니다. script.sh 파일에 저장 한 다음 'sh script.sh'로 실행하십시오.

즐겨

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";

0

lftp 시도

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--

-1

이 명령 scp은 기존 UNIX처럼 사용할 수 있습니다 cp. 그래서 당신이 할 경우 :

scp -r myDirectory/ mylogin@host:TargetDirectory

작동 할 것이다


1
이것은 암호를 처리하는 것으로 보이지 않습니다.
Delicia Brummitt 2013-06-28
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.