Làm thế nào để sử dụng sshpass?


28

Tôi cần sử dụng sshpassđể khởi chạy một lệnh từ xa thông qua SSH từ mã Java.

Nếu tôi nhập thủ công trong bảng điều khiển:

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

hoạt động hoàn hảo, nhưng yêu cầu mật khẩu. Vì vậy, tôi đã cố gắng chạy 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'

và không ai trong số họ làm việc.

Câu trả lời:


28

Điều này có thể được gây ra bởi các kiểm tra khóa máy chủ được thực hiện bởi ssh. Dường như sshpassgiữ im lặng trên các khóa máy chủ không hợp lệ (không có đầu ra stderrcũng không stdout) và tồn tại với mã trạng thái 6. Tại thời điểm viết bài này, đây là bản sửa đổi 50 và hằng số khớp trong mã là RETURN_HOST_KEY_UNKNOWN, gợi ý cho lỗi đó.

Mã lỗi của bạn có thể khác nhau và nhìn vào mã được liên kết ở trên có thể cung cấp cho bạn một số thông tin chi tiết.

Nếu sự cố của bạn là khóa máy chủ không hợp lệ, bạn nên suy nghĩ kỹ về việc ghi đè lỗi bằng tùy chọn CLI. Máy của bạn có thể bị xâm nhập hoặc bạn có thể bị tấn công MITM! Nếu bạn chắc chắn 100% rằng đây không phải là trường hợp và nếu bạn không có cách nào để giữ các khóa máy chủ được xác minh cập nhật, bạn có thể sử dụng một lệnh như thế này:

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

2
Với cài đặt brew, một không gian là cần thiết sau -p. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

THÔNG BÁO: Mọi người nên nhớ rằng an toàn hơn khi sử dụng Khóa máy chủ SSH không mật khẩu bất cứ khi nào có thể! Theo định nghĩa, sử dụng SSHPass là kém an toàn.
hỏi

@Questionmark trong khi đó là sự thật, có những trường hợp cạnh trong đó điểm cuối từ xa không hỗ trợ xác thực qua khóa. Đó là nơi mà sshpass có ích
shoutuma

Vâng tôi biết. Đó là lý do tại sao tôi nói "bất cứ khi nào có thể" ...
Câu hỏi

1
Với SSH đủ mới, có StrictHostKeyChecking=accept-new.
muru

5

sshpasschỉ hoạt động nếu dấu nhắc mật khẩu kết thúc bằng assword:.

Nếu lời nhắc mật khẩu của bạn khác, bạn có thể phải điều chỉnh mã nguồn của sshpassđể nhận ra lời nhắc bạn có.

Tôi đã thấy lời nhắc mật khẩu như Password for user@host:trên một số hệ thống, có thể đây là vấn đề của bạn.


1
lấy làm tiếc? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
Tùy chọn mới này (cần ít nhất V1.0.6 của sshpass) giải quyết vấn đề đó.
rjs

Ồ xin lỗi. Loại vấn đề này (giải pháp?) Xảy ra rất thường xuyên, những câu hỏi cũ đã được sửa ở các phiên bản mới. Cảm ơn.
m3nda

2

Tôi nghĩ bạn muốn một cái gì đó như:

sshpass -p yourpassword ssh user@ipaddress somecommand

Ví dụ, điều này làm việc cho tôi:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Bạn đã thiết lập đăng nhập mật khẩu?

Đăng nhập không cần mật khẩu với OpenSSH http: //www.debian-adftime.org/articles/152


Tôi thà dính vào sshpass, do sự bất tiện của việc cho phép đăng nhập không cần mật khẩu trong một doanh nghiệp
Roman Rdgz

Bạn đã thử chưa: sshpass -p 'mypass' ssh username@server.example.com
koni_ston

Tôi đã làm, không quan trọng nếu tôi sử dụng 'mypass' hoặc mypass. Nó bắt đầu chờ đợi mãi mãi
Roman Rdgz

sshpass -V hoạt động?
koni_ ngại

Nó in: "Chương trình này là phần mềm miễn phí và có thể được phân phối theo các điều khoản của GPL. Xem tệp SAO CHÉP để biết thêm thông tin". Và sau đó kết thúc việc thực hiện và không làm gì khác (Tôi đã thử thêm -V vào đầu lệnh tôi đang xử lý, không chỉ gõ sshpass -V)
Roman Rdgz

1

Có rất nhiều cách để làm điều đó, đây là giải pháp được đề xuất của tôi:

Trước hết, lưu trữ mật khẩu của bạn trong một biến sẽ cung cấp cho bạn các lệnh linh hoạt hơn. sshpasscó một tùy chọn cho điều đó:

-e: tùy chọn này cho phép đọc mật khẩu từ $SSHPASSbiến môi trường

Bạn có hai cách để đặt biến này:

  1. Đặt trực tiếp trong mã của bạn:

    export SSHPASS='your_pass'
    
  2. Hoặc yêu cầu nó:

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

Hơn thực hiện lệnh của bạn;

  1. Nếu lệnh của bạn là tĩnh, hãy chạy trực tiếp:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Nếu lệnh của bạn sẽ được sử dụng động như thế này:

    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'
    

hy vọng điều này sẽ giúp ai đó.


Trong chức năng readPassword của bạn, bạn không thể xuất SSHPASS?
kutschkem

@kutschkem, tôi tin tưởng nhưng ý tưởng của tôi mà tôi nghĩ ở đây; Tôi không muốn viết pass của mình trong một tệp tĩnh nhưng thay vì viết mật khẩu nhiều lần cho nhiều máy chủ (7+), tôi viết một lần :) Bạn không phải sử dụng readPasswordchức năng, bạn chỉ cần viết mật khẩu của mình, nó nên hoạt động :) Chỉ tôi muốn chia sẻ mã của mình, đây là ví dụ sử dụng sshpasscho các lệnh động: D
veysiertekin

Không, tôi chỉ có nghĩa là không cần thiết sau khi đọc, xuất không cần chuyển nhượng. ss64.com/bash/export.html
kutschkem

vấn đề với -e là việc xuất khẩu sẽ được liệt kê trong lịch sử của bạn
ejaenv

0

sshpasssử dụng thiết bị đầu cuối giả và mantrang bao gồm lời xin lỗi vì thỉnh thoảng phá vỡ. Bạn cũng có thể thử fd0ssh. Nó hoạt động nếu bạn không cần gửi stdinđến một quy trình trên máy từ xa. Điều đó hoạt động nếu bạn chỉ cần ra lệnh và nắm bắt kết quả.


0

cú pháp sshpass là

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

Lưu ý rằng không có khoảng trắng giữa -p và mật khẩu.

Ngoài ra, tôi nhận thấy rằng bạn phải kết nối với ssh ít nhất một lần theo cách thủ công để lấy khóa RSA của máy bạn đang kết nối, để vào ~/.ssh/known_hoststệp trước khi sshpass cho phép bạn kết nối.

vì vậy sau khi có được mục trong tệp know_hosts, tôi có thể chạy một lệnh như

sshpass -ffilename_with_password_in_it ssh user@server uname -a

và nó sẽ thực thi lệnh uname -atrên máy chủ từ xa và đưa kết quả ra tiêu chuẩn trên máy cục bộ.


0

Những gì bạn cần là -f -t -t -t

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

Ngoài ra, bạn có thể phải xóa "Yêu cầu" khỏi cấu hình sudo (/ etc / sudoers) trên máy từ xa.


0
  1. làm chìa khóa

    ssh-keygen -t rsa

  2. tạo một thư mục .ssh trên máy chủ từ xa, nó sẽ hỏi mật khẩu

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. sao chép khóa vào máy chủ từ xa

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


Kiểm tra nếu nó yêu cầu mật khẩu, nếu không nó sẽ hoạt động.

ssh $USER@SEVERNAME 'command'

0

@exhuma đã có một ví dụ dẫn đến nó hoạt động với tôi.

Mật khẩu cần phải ở dạng -pPassword(không có dấu cách)

cũng có thể cần trích dẫn: sshpass -p'Password&0' user@hostname

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.