scp에 비밀번호를 전달하는 방법?


297

권장하지는 않지만 사용자 암호를 scp에 전달하는 것이 가능합니까?

배치 작업의 일부로 scp를 통해 파일을 복사하고 싶습니다. 수신 서버는 물론 암호가 필요합니다. 아니요. 키 기반 인증으로 쉽게 변경할 수는 없습니다.


2
또한 (나중에) 질문 : stackoverflow.com/questions/1462284/…를 참조하십시오. 여기서 하나의 답변은 다른 가능한 방법을 언급합니다. (NB : 이것은 중복 된 질문이 아닙니다. 다른 것이 복제 한 것이 아닙니다.)
— Jonathan Leffler

답변:


35

expect 와 같은 도구로 스크립트를 작성할 수 있습니다 ( Pexpect for Python 과 같은 편리한 바인딩도 있습니다 ).


1
expect.nist.gov에 대한 링크 가 깨졌습니다. 어쩌면 이것? : expect.sourceforge.net
— Katapofatico

sudo apt-get 설치 예상
— SDsolar

>> brew info sshpass 오류 : 이름이 "sshpass"인 사용 가능한 수식이 없습니다. SSH 사용자가 SSH 보안을 망칠 수 없기 때문에 sshpass를 추가하지 않습니다. ;)
— Lukas NP Egger

528

sshpass를 사용하십시오 .

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

암호가 bash 기록에 표시되지 않습니다.

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

위의 내용은 원격 호스트에서 로컬로의 경로 내용을 복사합니다.

설치 :

  • 우분투 / 데비안
    • apt install sshpass
  • 센 토스 / 페도라
    • yum install sshpass
  • 맥 포트가있는 맥
    • port install sshpass
  • 양조 한 맥
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
Ubuntu 12.04에서는 암호를 작은 따옴표로만 처리했습니다 (예 : "password"대신 'password').
— odedfos

6
@odedfos, 그렇습니다. 암호로 생성 된 일부 문자는 큰 따옴표로 묶인 문자열 보간에서 특별한 해석을 할 수 있기 때문에 작은 따옴표를 사용해야합니다
— TerryE

7
sshpass를 설치하는 방법apt-get install sshpass
— Jan-Terje Sørensen

6
CentOS에서는yum -y install sshpass
— jgritty

19
이를 수행하는 가장 안전한 방법은 다음과 같이 비밀번호 파일 을 사용하는 것입니다 : sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps` 목록 등 파일 비밀번호를 사용하여 비밀번호를 보호 할 수 있습니다.
— Christopher Schultz

50

다음과 같이 ssh 키를 생성하십시오.

ssh-keygen -t rsa -C "your_email@youremail.com"

내용을 복사하여 ~/.ssh/id_rsa.pub 마지막으로 원격 시스템에 추가~/.ssh/authorized_keys

원격 시스템에 권한이 있는지 확인 0700 for ~./ssh folder하고0600 for ~/.ssh/authorized_keys


35
내가 쓴 것처럼 : 아니요, 키 기반 인증으로 쉽게 전환 할 수 없습니다.
— Argelbargel

3
.authorized_keys보다는을 의미합니까? authorization_keys?
— HelloWorld

2
이것에 대한 올바른 사용은 원격 서버의 암호를 사용자에게 요청하려는 서버에 대해 여러 scp / ssh 호출을 수행하는 bash 스크립트입니다. 그러면 비밀번호가 기록에 표시되지 않으며 여전히 비밀번호에 도전 할 수 있지만 한 번만 가능합니다. 스크립트 사용자를 여전히 인증하고 싶어서 키 파일을 사용하고 싶지 않습니다.
— 웨스 그랜트

2
대상에서 키 기반 인증을 쉽게 활성화 할 수없는 경우 다른 유효한 용도가 있습니다. 예 : 주요 NAS 제작자 중 하나 인 DSM 6.0이 포함 된 Synology는 2016 년에도이를 지원하지 않습니다. 물론 구성 파일이 엉망이되어 업데이트가 다시 덮어 쓰지 않을 것으로 기대할 수 있습니다 (DSM을 자주 업데이트하면 사용자 지정 수정이 자주 중단됨) ). 때로는-특히 OP가 명시 적으로 작성했을 때 이미 최적이 아니라는 것을 사람들이 알고 있으면 사람들은 해결책이 필요합니다.
— Aaa

3
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>원격 서버에서 키를 복사하는 데 사용해야 합니다
— RousseauAlexandre

39

Windows에서 서버에 연결하는 경우 Putty 버전의 scp ( "pscp")를 사용하면 -pw매개 변수 와 함께 비밀번호를 전달할 수 있습니다 .

이것은 여기 문서에 언급되어 있습니다.


1
예를 보여주세요.
— SDsolar

또한 이러한 명령을 사용하기 위해 C : \ Program Files (x86) \ PuTTY를 경로에 추가 할 수 있습니다.
— SDsolar

1
@SDsolar 여기 구문 예제 : pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(나는이 같은 퍼티를 사용하여 싫어,하지만 작동)
— geneorama

29

curl은 파일을 복사하기 위해 scp 대신 사용할 수 있으며 명령 행에서 비밀번호를 지원합니다.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

'scp'보다 상당히 느리지 만 잘 작동합니다.
— Victor

대상이 큰 암호 프롬프트 지연으로 구성되면이 속도가 더 빠릅니다. scp암호를 입력하려면 30 초 이상 기다려야하지만 curl즉시 작동했습니다.
— Ghost8472

@ Ghost8472가 yes로 구성되었지만 때때로이 지연으로 인해 호스트 이름이 해결되고 sftp에서도 발생합니다.
— mckenzm 2016 년

1
"curl : (1) 프로토콜"sftp "가 libcurl에서 지원되지 않거나 비활성화되었습니다"
— kronuus

21

유닉스 / 터미널에서 'expect'스크립트를 사용할 수 있습니다

예를 들어 'test.exp'를 작성하십시오.

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

스크립트를 실행

expect test.exp 

도움이 되길 바랍니다.


7
전제 조건 : sudo apt-get 설치 예상
— SDsolar

10

다음은 expect도구 를 사용 하여 수행하는 방법의 예입니다 .

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
이것은 펄입니다, 미안하지만 글을 쓰지 않았습니다. (5 년 전 :))
— Espo 2016 년


3

ssh-copy-idssh 키를 추가 하는 데 사용할 수 있습니다 .

$which ssh-copy-id #check whether it exists

존재하는 경우 :

ssh-copy-id  "user@remote-system"

3

ssh-keygen위에서 설명한대로 설정 하면 할 수 있습니다

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

매번 입력을 줄이려면 .bash_profile파일을 수정 하고

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

그런 다음 터미널에서 source ~/.bash_profile. 나중에 remote_scp터미널에 입력하면 scp암호없이 명령을 실행해야 합니다.


2
  1. 그렇지 않은 경우 수행하기 전에 "예상"도구가 있는지 확인하십시오.

    # apt-get install expect

  2. 다음 내용으로 스크립트 파일을 작성하십시오. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. "expect"도구로 스크립트 파일을 실행하십시오

    # expect /root/scriptfile


1

이 블로그 게시물을 기반으로 한 가난한 사람의 Linux / Python / Expect와 유사한 예는 다음과 같습니다. 간단한 쉘을 완전한 대화식 TTY로 업그레이드 . Expect를 설치하거나 모듈을 Python에 추가 할 수없는 오래된 컴퓨터에이 기능이 필요했습니다.

암호:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

산출:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

대안은 사용자 키의 공개 절반을 대상 시스템의 인증 된 키 파일에 추가하는 것입니다. 전송을 시작한 시스템에서 ssh-agent 데몬을 실행하고 키의 개인 절반을 에이전트에 추가 할 수 있습니다. 그런 다음 키 비밀번호를 묻지 않고 에이전트를 사용하여 개인 키를 가져 오도록 배치 작업을 구성 할 수 있습니다.

이것은 pageant 및 pscp를 사용하는 UNIX / Linux 시스템 또는 Windows 플랫폼에서 가능해야합니다.


4
이 질문에 따르면 키 기반 인증을 사용할 수 없습니다.
— Barmar

2
또한 그것이 나이라면 다른 서버를 변경할 수 없다고 가정합니다. 원하는 것은 파일을 복사하는 것입니다.
— SDsolar

-1

위에서 언급 한 모든 솔루션은 앱을 설치했거나 sshpass를 제외하고 설치할 관리자 권한이 있어야 작동합니다.

백그라운드에서 scp를 시작하는 데 매우 유용한 링크를 찾았습니다.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
백그라운드에서 scp를 실행하면 어떻게 암호가 입력됩니까?
— thomas.han


-9

이 답변이 정말 도움이 되었습니다 .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

비밀번호를 전달할 수있을뿐만 아니라 복사 할 때 진행률 표시 줄이 표시됩니다. 정말 대단합니다.


22
그리고 정확히 여기에 비밀번호를 제공하고 있습니까?
— infografnet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.