sshpass를 사용하는 방법?


28

sshpassJava 코드에서 SSH를 통해 원격 명령을 시작하는 데 사용해야 합니다.

콘솔에 수동으로 입력하면 :

ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'

완벽하게 작동하지만 암호를 요구합니다. 그래서 나는 달리기를 시도했다 sshpass.

sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'

그리고 그들 중 누구도 일하지 않습니다.

답변:


28

이 수행 한 호스트 키 검사로 인해 발생할 수 있습니다 ssh. sshpass유효하지 않은 호스트 키 (자동 stderr또는 출력 없음)에서 자동으로 유지되는 것처럼 보이고 stdoutstatus-code와 함께 존재합니다 6. 이 글을 쓰는 시점에서 이것은 개정 50이며 코드에서 일치하는 상수는입니다 RETURN_HOST_KEY_UNKNOWN. 이는 오류를 암시합니다.

오류 코드가 다를 수 있으며 위에 링크 된 코드를 보면 약간의 통찰력이있을 수 있습니다.

경우 문제가 잘못된 호스트 키 당신은 CLI 옵션을 사용하여 오류를 오버라이드 (override)에 대해 두 번 생각해야한다. 컴퓨터가 손상되었거나 MITM 공격을받을 수 있습니다! 그렇지 않다는 것을 100 % 확신하고 확인 된 호스트 키를 최신 상태로 유지할 수단이 없으면 다음과 같은 명령을 사용할 수 있습니다.

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

2
BREW 설치의 경우 -p 뒤에 공백이 필요합니다. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

주의 사항 : 가능하면 암호가없는 SSH 호스트 키를 사용하는 것이 더 안전하다는 것을 누구나 기억하십시오! 정의상 SSHPass 사용은 덜 안전합니다.
Questionmark

@Questionmark는 사실이지만 원격 엔드 포인트가 키를 통한 인증을 지원하지 않는 경우가 있습니다. sshpass가 유용한 곳
exhuma

예, 알아요 그래서 내가 "언제든지"라고 ​​말한 이유는 ...
Questionmark

1
새롭고 충분한 SSH를 통해 StrictHostKeyChecking=accept-new.
muru

5

sshpass비밀번호 프롬프트가로 끝나는 경우에만 작동합니다 assword:.

비밀번호 프롬프트가 다른 경우 프롬프트 sshpass를 인식하도록 소스 코드를 조정해야 할 수도 있습니다.

Password for user@host:일부 시스템에서 와 같은 비밀번호 프롬프트가 표시됩니다 . 이것이 귀하의 문제 일 수 있습니다.


1
죄송합니다? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
이 새로운 옵션 (sshpass의 V1.0.6 이상 필요)은이 문제를 해결합니다.
rjs

미안 이런 종류의 문제 (해결책?)는 종종 새 버전으로 수정 된 오래된 질문입니다. 감사.
m3nda

2

나는 당신이 다음과 같은 것을 원한다고 생각합니다 :

sshpass -p yourpassword ssh user@ipaddress somecommand

예를 들어, 이것은 나를 위해 작동합니다 :

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

비밀번호없는 로그인을 설정 했습니까?

OpenSSH를 통한 비밀번호없는 로그인 http://www.debian-administration.org/articles/152


기업에서 암호없이 로그인 할 수 없다는 불편 때문에 sshpass를 고수하고 싶습니다
Roman Rdgz

이것을 시도 했습니까 : sshpass -p '
mypass'ssh

'mypass'또는 mypass를 사용하더라도 중요하지 않습니다. 그것은 영원히 대기 시작
로마 Rdgz

sshpass -V 작동합니까?
koni_raid

"이 프로그램은 무료 소프트웨어이며 GPL의 조항에 따라 배포 할 수 있습니다. 자세한 내용은 COPYING 파일을 참조하십시오." 그런 다음 실행을 끝내고 다른 작업을 수행하지 않습니다 (sshpass -V를 입력하는 것이 아니라 처리하는 명령의 시작 부분에 -V를 추가하려고 시도했습니다)
Roman Rdgz

1

그렇게 할 수있는 방법이 많이 있습니다. 제 제안 된 해결책은 다음과 같습니다.

우선, 암호 를 변수에 저장 하면보다 유연한 명령이 제공됩니다. sshpass옵션이 있습니다.

-e:이 옵션을 사용하면 $SSHPASS환경 변수 에서 비밀번호를 읽을 수 있습니다

이 변수를 설정하는 두 가지 방법이 있습니다.

  1. 코드에서 직접 설정하십시오.

    export SSHPASS='your_pass'
    
  2. 또는 요청하십시오 :

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

당신의 명령을 실행하는 것보다;

  1. 명령이 정적이면 직접 실행하십시오.

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. 명령이 다음과 같이 동적으로 사용되는 경우 :

    DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
    
    eval 'sshpass -e ssh user@host << EOF
    mplayer "$DYN_FILE_LOC"
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF'
    

이것이 누군가를 돕기를 바랍니다.


readPassword 함수에서 SSHPASS를 내보낼 수는 없습니까?
kutschkem

@ kutschkem, 나는 여기에서 생각하는 내 생각을 신뢰하지만; 나는 정적 파일에 패스를 쓰고 싶지 않지만 많은 서버 (7 +)에 대해 암호를 반복해서 쓰는 대신 한 번 쓴다 :) readPassword함수 를 사용할 필요가 없습니다. 암호를 쓸 수 있습니다. 작동해야합니다 :) 만 sshpass동적 명령에 사용하는 예제를 보여주는 코드를 공유하고 싶습니다 : D
veysiertekin

아니요, 읽기 후에 eval이 필요하지 않으며 내보내기에는 할당이 필요하지 않습니다. ss64.com/bash/export.html
kutschkem

-e의 문제점은 수출이 귀하의 이력에 표시된다는 것입니다.
ejaenv

0

sshpass의사 터미널을 사용하며 man페이지에 때때로 중단에 대한 사과가 포함되어 있습니다. 시도해 볼 수도 있습니다 fd0ssh. stdin원격 시스템의 프로세스 로 보낼 필요가없는 경우 작동합니다 . 명령을 실행하고 결과를 캡처하면 작동합니다.


0

sshpass 구문은

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

-p와 비밀번호 사이에는 공백이 없습니다.

또한 ~/.ssh/known_hostssshpass가 연결을 허용하기 전에 파일 로 이동하려면 연결하려는 시스템의 RSA 키를 얻기 위해 적어도 한 번 수동으로 ssh에 연결해야한다는 것을 알았습니다 .

known_hosts 파일에서 항목을 얻은 후 다음과 같은 명령을 실행할 수 있습니다.

sshpass -ffilename_with_password_in_it ssh user@server uname -a

uname -a원격 서버 에서 명령 을 실행하고 결과를 로컬 시스템의 표준 출력으로 출력합니다.


0

필요한 것은 -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

또한 원격 시스템의 sudo 구성 (/ etc / sudoers)에서 "requiretty"를 제거해야 할 수도 있습니다.


0
  1. 열쇠를 만들다

    ssh-keygen -t rsa

  2. 원격 서버에 .ssh 폴더를 만들어 비밀번호를 요구합니다.

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. 키를 원격 서버에 복사

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'


작동하지 않으면 암호를 요청하는지 확인하십시오.

ssh $USER@SEVERNAME 'command'

0

@exhuma는 나를 위해 일하는 예제가 있습니다.

비밀번호 -pPassword는 공백없이 형식이어야합니다.

따옴표가 필요할 수도 있습니다. sshpass -p'Password&0' user@hostname

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.