Bash 스크립트의 비밀번호로 sftp 명령을 실행하는 방법은 무엇입니까?


173

Linux 호스트에서 sftp 를 사용하여 로그 파일을 원격 호스트로 전송해야 합니다. 운영 그룹에서 동일한 자격 증명을 제공 받았습니다. 그러나 다른 호스트를 제어 할 수 없으므로 RSA 키를 생성하고 다른 호스트와 공유 할 수 없습니다.

그렇다면 cron 작업을 sftp통해 Bash 스크립트 내부에서 명령 (사용자 이름 / 비밀번호 제공) 을 실행할 수 있습니까?

비슷한 Stack Overflow 질문 인 Bash 스크립트에서 sftp에 암호 지정을 찾았 지만 내 문제에 대한 만족스러운 답변이 없습니다.

답변:


178

공개 키 인증 이외의 몇 가지 옵션이 있습니다.

  1. 키 체인 사용
  2. sshpass 사용 (보안 수준은 낮지 만 요구 사항을 충족 할 수 있음)
  3. 예상 사용 (최소 보안 및 더 많은 코딩 필요)

sshpass에 기회를 주기로 결정한 경우 다음과 같이 작업하는 스크립트 스 니펫이 있습니다.

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!


18
수출 할 필요가 없습니다. SSHPASS=password sshpass -e ...해야 할 것.
Jens

9
: 나는 로그 파일 에디터를 이용해 한 번의 라이너를 할 수 있었다sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
클라우드 장인

6
@ gorus : One-liner는 매우 멋지지만 스누핑 위험이 높아져 명령 줄에 암호를 사용하고 싶지 않았습니다.
anubhava

8
-oBatchMode=no나를 위해 결정적으로 빠진 조각이었습니다.
richardkmiller

99

또 다른 방법은 lftp를 사용하는 것입니다.

lftp sftp://user:password@host  -e "put local-file.name; bye"

이 방법의 단점은 컴퓨터의 다른 사용자가 같은 도구에서 암호를 읽을 수 있고 암호 ps가 쉘 기록의 일부가 될 수 있다는 것입니다.

LFTP 4.5.0부터 사용할 수있는보다 안전한 대안은 LFTP_PASSWORD환경 변수를 설정하고로 lftp를 실행하는 것입니다 --env-password. 전체 예는 다음과 같습니다.

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP에는 멋진 미러링 기능도 포함되어 있습니다 (전송 확인 후 삭제 포함 --Remove-source-files).

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9
대안을 제안한 +1이지만 명령 행에 비밀번호를 제공하지 않아도 될까요?
anubhava

1
같은 컴퓨터에있는 모든 사람에게 암호를 보여 주도록 하향 투표
Aaron Digulla

10
lftp에 대한 스크립트 파일을 작성할 수 있으므로 명령 행에 비밀번호를 제공하지 않아도됩니다. 파일 작성 put-script: open sftp://user:password@host; put local-file.name; exit 실행보다이 lftp -f put-script 방법으로 명령 행에 사용자 이름과 비밀번호를 입력하지 않아도되고 스크립트 파일에 대한 제한 권한을 설정할 수 있습니다.
obaranovsky 1

@obaranovsky 좋은 생각입니다. 별칭 또는 함수로 환경 변수에 이것을 추가해야하는지 궁금합니다. 안전하고 다른 사용자로부터 숨길 수 있습니까?
sdkks

1
할 훨씬 더 쉽게 lftp와 주변 혼란보다 sftp하고 sshpass. 좋은 대답입니다.
MeanEYE

53

사용하기 좋은 프로그램입니다.

우분투에서 다음을 설치하십시오 :

sudo apt-get install expect

CentOS 머신에서 다음을 설치하십시오 :

yum install expect

sftp 서버에 연결 한 다음 로컬 시스템에서 원격 sftp 서버로 로컬 파일을 업로드한다고 가정합니다.

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

그러면 서버에 대한 비밀번호로 sftp 연결이 열립니다.

그런 다음 파일을 업로드 할 디렉토리 (이 경우 "logdirectory")로 이동합니다.

이는 / var / log /에있는 로컬 디렉토리에서 파일 이름이 file.log 인 로컬 디렉토리에서 원격 서버의 "logdirectory"로 로그 파일을 업로드합니다.


귀하의 답변에 감사드립니다, 나는이 작업을 수행하기위한 옵션 중 하나로서 기대했습니다.
anubhava

감사합니다. 검색을 통해 귀하의 답변을 찾았으며 사용하고 예상대로 스크립트를 성공적으로 작성했습니다. 그냥 poterity의 스크립트를 게시
rezizter을

답변 해 주셔서 감사합니다. 이미
찬성

이것을 사용하여 ssh 개인 키의 암호를 입력하고 있습니다. 모든 서버에 동일한 공개 키를 배치하고 개인 키 암호를 주기적으로 교체하는 것이 더 편리합니다.
sdkks

24

쉘 스크립트에서 lftp를 대화식으로 사용할 수 있으므로 다음을 수행하여 비밀번호가 .bash_history에 저장되지 않도록하십시오.

vi test_script.sh

파일에 다음을 추가하십시오.

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

put 파일 입력을 위해 호스트, 사용자, 패스 및 디렉토리를 편집 한 후 vi 편집기를 작성 / 종료 한 :wq다음 스크립트를 실행 가능하게 chmod +x test_script.sh만들고 실행하십시오 ./test_script.sh.


2
기존 파일을 덮어 쓰려면 lftp << END_SCRIPT
Balaji Natarajan 다음

17

최근 서버 간 파일 전송을 보호하기 위해 ftp에서 sftp로 전환하라는 요청을 받았습니다. --password명령 행에서 비밀번호를 전달 하는 옵션이있는 Tectia SSH 패키지를 사용하고 있습니다 .

예 : sftp --password="password" "userid"@"servername"

배치 예 :

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

help 명령 ( sftp -h)을 실행하기 전에 다양한 웹 사이트를보고 있었기 때문에이 정보를 공유해야한다고 생각 했고 비밀번호 옵션을보고 놀랐습니다.


9
좋은 제안을 +1합니다. 그러나 명령 행에서 암호를 전달해야하며 명령을 수행하는 시스템의 모든 ps사용자가 암호를 볼 수 있습니다.
anubhava

4
나는 그것을 시도했다unknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200

1
@ihue 아마 OpenSSH가 아닌 Techia SSH 가 필요하기 때문에
qris

17

보다 적은 비밀번호로 인증을 사용하여 대체 할 수 있습니다. 그러나 가기 전에 키 (pub, priv)를 설치해야합니다.

로컬 서버에서 다음 명령을 실행하십시오.

Local $> ssh-keygen -t rsa 

프롬프트되는 모든 옵션을 보려면 ENTER를 누르십시오. 값을 입력 할 필요가 없습니다.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

다음 명령을 사용하여 원격 서버에 연결

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

원격 서버에서 다음 명령을 실행하십시오.

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

암호가없는 인증을 테스트하려면 로컬 서버에서 다음 명령을 실행하십시오. 비밀번호없이 연결해야합니다.

$> ssh user@targetmachine

1
귀하의 답변에 +1했지만 공개 / 개인 키없이 수행하는 것에 대한 질문이었습니다.
anubhava

죄송합니다 .. 키 공유에 대한 제한 사항을 보았습니다 :)
SriniV

lftp -p ${port} -u ${login_id},${password} ${ip_number}셸 스크립트에서 호출했을 때이 명령이 호기심을 유발할 수 있습니까? sshpass와는 별도로 어떻게 해결 했습니까?
SriniV

나는 Mac과 Linux를 모두 가지고 있지 않고 lftp의존 sshpass합니다.
anubhava

순금. 감사! :)
Nikolay Tsenkov 2016 년

7

sshpass를 잠겨진 자격 증명 파일과 결합하면 실제로 아무 것도 안전합니다. 자격 증명 파일을 읽을 수있는 루트가있는 경우 모든 베팅은 종료됩니다.


5

sftp가 암호를 요구할 때까지 기다리는 Bash 프로그램은 다음과 같이 보내십시오.

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

expect를 설치해야 할 수도 있습니다. 프롬프트에서 수신하는 것과 일치하도록 'Password'의 문구를 소문자 'p'로 변경하십시오. 여기서 문제는 암호가 파일 및 명령 기록에 일반 텍스트로 표시된다는 것입니다. 처음에는 암호를 사용하려는 목적을 거의 상실합니다.


+1 그러나이 접근 방식의 문제점을 명확하게 밝힌다 고 생각합니다.
anubhava

5

sshpass를 사용할 수 있습니다. 단계는 다음과 같습니다

  1. 우분투 용 sshpass 설치- sudo apt-get install sshpass
  2. 원격 호스트를 알려진 호스트 파일에 처음 추가하는 경우 Ubuntu-> ssh user @ IP-> 'yes'를 입력하십시오.
  3. scp와 sshpass를 함께 사용하십시오. 아래는 원격 바람둥이에 대처하기위한 샘플 코드입니다. sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.