Làm cách nào để tự động đăng nhập SSH bằng mật khẩu?


419

Làm cách nào để tự động đăng nhập SSH bằng mật khẩu? Tôi đang cấu hình VM thử nghiệm của mình, vì vậy bảo mật nặng không được xem xét. SSH được chọn để bảo mật chấp nhận được với cấu hình tối thiểu.

Ví dụ)

echo password | ssh id@server

Điều này không hoạt động.

Tôi nhớ tôi đã làm điều này với một số thủ thuật mà ai đó đã hướng dẫn tôi, nhưng tôi không thể nhớ bây giờ là mẹo tôi đã sử dụng ...


2
FreeBSD không chấp nhận các khóa không có mật khẩu. Đừng bị cám dỗ. Tuy nhiên, một số máy chủ Linux đã chấp nhận nó. Tôi tin rằng máy chủ Linux đã bị cấu hình sai.
Eonil

16
Đây là một câu hỏi hợp lệ. Ví dụ: tôi muốn cho phép người dùng nhập mật khẩu, sau đó đăng nhập vào máy khác bằng mật khẩu. Tôi không thể cho rằng sẽ có các khóa ssh được phân phối trên tất cả các máy của chúng tôi. Các câu trả lời dưới đây cho đến nay không giúp ích gì cho tình huống này.
dfrankow


Câu hỏi rất quan trọng. Tôi cũng cần một câu trả lời, nhà cung cấp không gian web của tôi chặn các keyfiles trên máy chủ, vì vậy tôi phải vượt qua passwort mà không có keyfiles.
Radon8472

Câu trả lời:


382

Đừng sử dụng mật khẩu. Tạo khóa SSH không mật khẩu và đẩy nó vào VM của bạn.

Nếu bạn đã có khóa SSH, bạn có thể bỏ qua bước này Chỉ cần nhấn Entercho khóa và cả cụm mật khẩu:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Sao chép khóa của bạn vào máy chủ mục tiêu:

$ ssh-copy-id id@server
id@server's password: 

Bây giờ hãy thử đăng nhập vào máy, với ssh 'id@server'và kiểm tra:

.ssh/authorized_keys

để đảm bảo chúng tôi chưa thêm các khóa bổ sung mà bạn không mong đợi.

Cuối cùng hãy kiểm tra đăng nhập vào Lọ

$ ssh id@server

id@server:~$ 

Bạn cũng có thể muốn xem xét sử dụng ssh-agentnếu bạn muốn thử giữ các khóa của mình được bảo vệ bằng cụm mật khẩu.


14
Cuối cùng tôi đã quyết định sử dụng các cặp chìa khóa. Bởi vì tôi nhận ra đó là cách đơn giản nhất.
Eonil

9
@Eonil: Đừng cố sử dụng các khóa mà không có cụm từ thông qua. Tìm hiểu làm thế nào để sử dụng ssh-agent hoặc pagete.
dùng619714

119
Đây là một câu trả lời tốt, nhưng không phải là câu trả lời chính xác cho câu hỏi.
John Hunt

74
Những loại câu trả lời thực sự, thực sự làm phiền tôi. Đó không phải là câu hỏi. Không ai hỏi làm thế nào để sử dụng các cặp chìa khóa.
Matt Fletcher

16
Điều này không trả lời câu hỏi. Đó là một câu trả lời tốt cho một câu hỏi hoàn toàn khác, nhưng nó là khủng khiếp cho người được hỏi.
srchulo

595
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
Vâng, đôi khi bạn không thể sử dụng auth dựa trên khóa vì nhiều lý do .. ví dụ ngay bây giờ tôi không thể sử dụng keyauth trên máy chủ plesk vì trong hộp không bật và tôi không có root.
John Hunt

17
+1! Là một lưu ý phụ, bạn cần chạy đơn giản sshmột lần trước khi sử dụng sshpass, để xác nhận dấu vân tay RSA
user123444555621

21
-1 vì phải sử dụng mật khẩu trong lệnh. Điều này sẽ ghi lại mật khẩu tại .bash_historyvăn bản đơn giản trên máy của bạn.

15
@MisterDood Bạn có thể chạy history -rtheo lệnh để xóa lịch sử của bạn. Điểm tốt mặc dù.
NuclePeon

20
Mẹo chuyên nghiệp: Nếu bạn không muốn có một lệnh cụ thể hiển thị trong .bash_history, hãy thêm tiền tố vào một khoảng trắng. Nó chỉ hoạt động. Tuy nhiên, người dùng lệnh này nên quan tâm hơn rằng người dùng không có đặc quyền trên hệ thống có thể thấy dòng lệnh đầy đủ với ps, tất nhiên, bao gồm cả mật khẩu. Vì các phiên ssh có xu hướng tồn tại lâu, đây là một vấn đề bảo mật.
CubicleSoft 16/07/2016

71

Mặc dù câu trả lời chính xác cho câu hỏi của bạn là sshkey , có một cách an toàn hơn - khóa SSH. Bạn chỉ cần ba bước dễ dàng từ giải pháp:

Tạo một cặp khóa rsa :

# ssh-keygen

sau đó sao chép nó trên máy chủ bằng một lệnh đơn giản :

# ssh-copy-id userid@hostname

bây giờ bạn có thể đăng nhập mà không cần mật khẩu :

# ssh userid@hostname

1
Hoạt động tốt với các giá trị mặc định. Sử dụng ~ / rsa4live.pub không hiệu quả với tôi khi thử ssh-copy-id.
Cees Timmerman

1
Nếu bạn muốn các bước này hoạt động cho những người dùng khác nhau, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
Đối với tôi đó làssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair

21
Đây không phải là một câu trả lời cho câu hỏi.
Steve Bennett

2
Và? Câu trả lời là ở trên, sshpass ...
lzap

40

Sử dụng mong đợi:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Thí dụ:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
Nó hoạt động nhưng nó không thể in ra thiết bị xuất chuẩn của máy từ xa.
Eonil

Nó hoạt động tốt đối với một số máy không thể đặt khóa trước vì địa chỉ IP được thay đổi mọi lúc.
larrycai

4
Sẽ rất tốt nếu thêm -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nulllệnh ssh để tránh chấp nhận máy vào được
biết đến_hosts

B .. b nhưng phím muh ssh ...
Damien Ó Ceallaigh

Ví dụ chi tiết hơn về tập lệnh này bạn có thể tìm thấy tại: linuxaria.com/howto/ Từ Ví dụ này ở đây cũng hoạt động với các lệnh từ xa
Radon8472

16

Điều này có thể không hữu dụng với bạn, nhưng bạn có thể làm điều đó với Perl:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

2
Tương tự như vậy, bạn có thể làm với Ruby github.com/net-ssh/net-ssh
EnabrenTane

15

Tôi ngạc nhiên không ai nhắc đến plinktừ putty-toolsgói trong Ubuntu:

plink user@domain -pw mypass  [cmd]

Nó cũng có sẵn trên Windows và cú pháp hầu hết tương thích với máy khách openssh.


Đối với các cửa sổ, câu trả lời của bạn là tốt, người dùng linux / unix không thường xuyên không có
nếp nhăn

2
nó nằm trong putty-toolsgói
eadmaster

10

Đăng nhập một lần SSH thường đạt được với xác thực khóa chung và tác nhân xác thực. Bạn có thể dễ dàng thêm khóa VM thử nghiệm của mình vào một tác nhân xác thực hiện có (xem ví dụ bên dưới). Các phương thức khác như gssapi / kerberos tồn tại nhưng phức tạp hơn.

sshpass

Trong trường hợp passwordphương thức xác thực duy nhất khả dụng, sshpass có thể được sử dụng để tự động nhập mật khẩu. Vui lòng chú ý đặc biệt đến phần TƯ VẤN BẢO MẬT của trang người đàn ông . Trong cả ba tùy chọn, mật khẩu được hiển thị hoặc được lưu trữ trong bản rõ tại một số điểm :

Đường ống ẩn danh (được đề xuất bởi sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

Nó khá cồng kềnh trong bash, dễ dàng hơn với các ngôn ngữ lập trình. Một quy trình khác có thể đính kèm vào ống / fd của bạn trước khi mật khẩu được viết. Cửa sổ cơ hội khá ngắn và giới hạn trong các quy trình hoặc root của bạn.

Biến môi trường

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Bạn và root có thể đọc các biến môi trường của quy trình (ví dụ mật khẩu của bạn) trong khi sshpass đang chạy ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). Cửa sổ cơ hội dài hơn nhiều nhưng vẫn giới hạn trong các quy trình hoặc root của riêng bạn chứ không phải người dùng khác.

Đối số dòng lệnh (ít an toàn nhất)

 sshpass -p my_secret_password ssh user@host

Điều này là thuận tiện nhưng kém an toàn như được mô tả trong trang người đàn ông. Đối số dòng lệnh được hiển thị cho tất cả người dùng (ví dụ ps -ef | grep sshpass). sshpass cố gắng ẩn đối số, nhưng vẫn có một cửa sổ trong đó tất cả người dùng có thể thấy mật khẩu của bạn được truyền bằng đối số.

Lưu ý bên

Đặt biến bash HISTCONTROL của bạn thành ignorespacehoặc ignorebothvà tiền tố các lệnh nhạy cảm của bạn với một khoảng trắng . Họ sẽ không được cứu trong lịch sử.


Xác thực khóa công khai SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

Cụm mật khẩu rất quan trọng. Bất cứ ai bằng cách nào đó có được tệp khóa riêng sẽ không thể sử dụng tệp mà không có cụm mật khẩu.

Thiết lập tác nhân xác thực SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Kết nối như bình thường

ssh user@host

Ưu điểm là khóa riêng của bạn được mã hóa và bạn chỉ cần nhập cụm mật khẩu của nó một lần (thông qua phương thức nhập an toàn hơn).


8

Chắc chắn bạn không muốn sử dụng khóa SSH hơn là mật khẩu? Bằng cách đó, nó an toàn và tự động.


3
Sử dụng khóa SSH không có mật khẩu chỉ an toàn hơn một chút so với sử dụng mật khẩu trong tệp.
yunzen

10
@yunzen Không đúng. Xác thực khóa bảo vệ bạn khỏi các cuộc tấn công giảm nhẹ ngay cả khi bạn không biết khóa máy chủ. Kẻ tấn công có thể mạo danh máy chủ, nhưng không bao giờ kết nối với máy chủ thực. Với xác thực mật khẩu, bất kỳ máy chủ nào bạn kết nối (hợp pháp hay không) sẽ thấy mật khẩu. Vì những lý do đó, khóa ssh không có mật khẩu sẽ an toàn hơn rất nhiều so với việc chỉ lưu trữ mật khẩu trong một tệp.
kasperd

14
Đây không phải là một câu trả lời.
Steve Bennett

@SteveBennett Nó giống như câu trả lời được chấp nhận và đã được đăng trước đó, mặc dù nó có ít chi tiết hơn.
Michael Hampton

3
Chà, tôi muốn nói câu trả lời được chấp nhận là một câu trả lời đàng hoàng cho một câu hỏi chưa được hỏi. Đây không phải là bất cứ điều gì.
Steve Bennett

4

Tùy thuộc vào nhu cầu tự động hóa của bạn, có lẽ Ansible sẽ phù hợp với bạn. Nó có thể quản lý độc đáo những thứ như nhắc mật khẩu, nhắc mật khẩu sudo, nhiều cách thay đổi sử dụng, sử dụng an toàn các bí mật được mã hóa (vault).

Nếu điều đó không phù hợp, tôi sẽ đề xuất Mong đợi, như được đề xuất trong câu trả lời khác.

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.