จะทำการล็อกอิน SSH อัตโนมัติด้วยรหัสผ่านได้อย่างไร?


419

จะทำการล็อกอิน SSH อัตโนมัติด้วยรหัสผ่านได้อย่างไร? ฉันกำลังกำหนดค่าการทดสอบ VM ของฉันดังนั้นความปลอดภัยจึงไม่ได้รับการพิจารณา เลือก SSH เพื่อความปลอดภัยที่ยอมรับได้โดยมีการกำหนดค่าน้อยที่สุด

อดีต)

echo password | ssh id@server

มันใช้งานไม่ได้

ฉันจำได้ว่าฉันทำสิ่งนี้ด้วยลูกเล่นบางคนชี้นำฉัน แต่ตอนนี้ฉันจำไม่ได้ว่าเคล็ดลับที่ฉันใช้ ...


2
FreeBSD ไม่ยอมรับกุญแจที่ไม่มีรหัสผ่าน อย่าถูกล่อลวง อย่างไรก็ตามเซิร์ฟเวอร์ Linux บางตัวก็ยอมรับ ฉันเชื่อว่าเซิร์ฟเวอร์ Linux ได้รับการกำหนดค่าผิดพลาด
Eonil

16
นี่เป็นคำถามที่ถูกต้อง ตัวอย่างเช่นฉันต้องการอนุญาตให้ผู้ใช้ป้อนรหัสผ่านจากนั้นลงชื่อเข้าใช้ในเครื่องอื่นที่ใช้รหัสผ่าน ฉันไม่สามารถสรุปได้ว่าจะมีปุ่ม ssh กระจายอยู่ทั่วทุกเครื่องของเรา คำตอบด้านล่างนี้ไม่ช่วยสถานการณ์นี้
dfrankow


คำถามที่สำคัญมาก ฉันต้องการคำตอบด้วยเช่นกันผู้ให้บริการพื้นที่เว็บของฉันบล็อกเพื่อวางคีย์ไฟล์บนเซิร์ฟเวอร์ดังนั้นฉันต้องผ่าน passwort โดยไม่ใช้คีย์ไฟล์
Radon8472

คำตอบ:


382

อย่าใช้รหัสผ่าน สร้างคีย์ SSH แบบไม่มี passphraseless และส่งไปยัง VM ของคุณ

หากคุณมีคีย์ SSH แล้วคุณสามารถข้ามขั้นตอนนี้ ... เพียงกดEnterปุ่มและข้อความรหัสผ่านทั้งสองนี้:

$ 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.

คัดลอกกุญแจของคุณไปยังเซิร์ฟเวอร์เป้าหมาย:

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

ตอนนี้ลองเข้าสู่ระบบด้วยด้วยssh 'id@server'และเช็คอิน:

.ssh/authorized_keys

เพื่อให้แน่ใจว่าเราไม่ได้เพิ่มคีย์พิเศษที่คุณไม่ได้คาดหวัง

ในที่สุดตรวจสอบการเข้าสู่ระบบ ...

$ ssh id@server

id@server:~$ 

คุณอาจต้องการใช้ssh-agentถ้าคุณต้องการที่จะพยายามป้องกันกุญแจด้วยข้อความรหัสผ่าน


14
ในที่สุดฉันก็ตัดสินใจใช้คู่กุญแจ เพราะฉันรู้ว่านั่นเป็นวิธีที่ง่ายที่สุด
Eonil

9
@Eonil: อย่าถูกล่อลวงให้ใช้กุญแจโดยไม่มีวลีรหัสผ่าน เรียนรู้วิธีใช้ ssh-agent หรือการประกวด
user619714

119
นี่เป็นคำตอบที่ดี แต่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม
John Hunt

74
คำตอบประเภทนี้จริงๆรบกวนฉันจริงๆ นั่นไม่ใช่คำถาม ไม่มีใครถามวิธีใช้คู่คีย์
Matt Fletcher

16
นี่ไม่ได้ตอบคำถาม มันเป็นคำตอบที่ดีสำหรับคำถามที่แตกต่างอย่างสิ้นเชิง แต่มันแย่มากสำหรับคำถามที่ถาม
srchulo

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

51
ใช่บางครั้งคุณไม่สามารถใช้การรับรองความถูกต้องของคีย์ด้วยเหตุผลต่าง ๆ เช่นตอนนี้ฉันไม่สามารถใช้ keyauth บนเซิร์ฟเวอร์ plesk ได้เพราะไม่ได้เปิดใช้งานกล่องและฉันไม่มีรูท
John Hunt

17
+1! ในฐานะที่เป็นบันทึกด้านข้างคุณจะต้องเรียกใช้ธรรมดาsshหนึ่งครั้งก่อนที่จะใช้sshpassเพื่อยืนยันลายนิ้วมือ RSA
user123444555621

21
-1 สำหรับการใช้รหัสผ่านในคำสั่ง บันทึกรหัสผ่านที่.bash_historyเป็นข้อความธรรมดาบนเครื่องของคุณ

15
@MisterDood คุณสามารถเรียกใช้history -rหลังจากคำสั่งเพื่อลบประวัติของคุณ จุดที่ดีแม้ว่า
NuclearPeon

20
เคล็ดลับสำหรับมืออาชีพ: หากคุณไม่ต้องการให้มีคำสั่งเฉพาะแสดงใน. bash_history ให้นำหน้าคำสั่งด้วยช่องว่าง มันใช้งานได้ อย่างไรก็ตามผู้ใช้ของคำสั่งนี้ควรกังวลมากกว่าว่าผู้ใช้ที่ไม่มีสิทธิพิเศษบนระบบสามารถดูบรรทัดคำสั่งแบบเต็มด้วย ps ซึ่งแน่นอนรวมถึงรหัสผ่าน เนื่องจากเซสชัน ssh มักจะมีอายุการใช้งานยาวนานนี่เป็นปัญหาด้านความปลอดภัย
CubicleSoft

71

ในขณะที่คำตอบที่ถูกต้องสำหรับคำถามของคุณคือsshkeyมีวิธีที่ปลอดภัยกว่าคือ - คีย์ SSH คุณเป็นเพียงสามขั้นตอนง่ายๆจากทางออก:

สร้างrsa keypair :

# ssh-keygen

จากนั้นคัดลอกบนเซิร์ฟเวอร์ด้วยคำสั่งง่ายๆ :

# ssh-copy-id userid@hostname

ตอนนี้คุณสามารถเข้าสู่ระบบโดยไม่มีรหัสผ่าน :

# ssh userid@hostname

1
ทำงานได้ดีกับค่าเริ่มต้น ใช้ ~ / rsa4live.pub ssh-copy-idไม่ทำงานสำหรับฉันเมื่อพยายาม
Cees Timmerman

1
หากคุณต้องการให้ขั้นตอนนี้ใช้งานได้กับผู้ใช้ที่แตกต่างกัน 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
สำหรับฉันมันเป็นssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
กาเบรียลแฟร์

21
นี่ไม่ใช่คำตอบสำหรับคำถาม
Steve Bennett

2
และ? คำตอบคือข้างต้น sshpass ...
lzap

40

ใช้ที่คาดหวัง:

#!/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

ตัวอย่าง:

# ./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
ใช้งานได้ แต่ไม่สามารถพิมพ์ stdout ของเครื่องระยะไกลได้
Eonil

มันทำงานได้ดีสำหรับเครื่องบางอย่างไม่สามารถใส่รหัสล่วงหน้าได้เนื่องจากมีการเปลี่ยนแปลงที่อยู่ IP ทุกครั้ง
larrycai

4
มันจะเป็นการดีถ้าจะเพิ่ม-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullคำสั่ง ssh เช่นกันเพื่อหลีกเลี่ยงการยอมรับเครื่องเข้าใน known_hosts
larrycai

B .. b แต่ muh ssh keys ...
Damien Ó Ceallaigh

ตัวอย่างรายละเอียดเพิ่มเติมของสคริปต์นี้คุณสามารถค้นหาได้ที่: linuxaria.com/howto/… ตัวอย่างนี้ที่นี่ควรทำงานกับคำสั่งระยะไกลด้วย
Radon8472

16

นี่อาจไม่เป็นประโยชน์กับคุณ แต่คุณสามารถทำได้ด้วย 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
ในทำนองเดียวกันคุณสามารถทำได้กับ Ruby github.com/net-ssh/net-ssh
EnabrenTane

15

ฉันประหลาดใจที่ไม่มีใครพูดถึงplinkจากputty-toolsแพ็คเกจใน Ubuntu:

plink user@domain -pw mypass  [cmd]

นอกจากนี้ยังมีใน Windows และไวยากรณ์ส่วนใหญ่เข้ากันได้กับไคลเอ็นต์ openssh


สำหรับ windows คำตอบของคุณเป็นสิ่งที่ดีผู้ใช้ linux / unix อย่างไม่ทันรู้ตัวมักจะไม่มีปัญหา
Radon8472

2
มันอยู่ในputty-toolsแพ็คเกจ
eadmaster

10

การลงชื่อเข้าใช้ครั้งเดียวของ SSH สามารถทำได้ด้วยการตรวจสอบกุญแจสาธารณะและตัวแทนการตรวจสอบความถูกต้อง คุณสามารถเพิ่มคีย์ทดสอบ VM ของคุณไปยังเอเจนต์รับรองความถูกต้องที่มีอยู่ได้ง่าย (ดูตัวอย่างด้านล่าง) วิธีการอื่น ๆ เช่น gssapi / kerberos มีอยู่ แต่มีความซับซ้อนมากขึ้น

sshpass

ในสถานการณ์ที่passwordมีวิธีการรับรองความถูกต้องเท่านั้นที่มีอยู่sshpassสามารถใช้เพื่อป้อนรหัสผ่านโดยอัตโนมัติ กรุณาให้ความสนใจโดยเฉพาะอย่างยิ่งกับการรักษาความปลอดภัยที่ต้องคำนึงถึงในส่วนของหน้าคน ในทั้งสามตัวเลือกรหัสผ่านสามารถมองเห็นหรือจัดเก็บในรูปแบบธรรมดาในบางจุด :

ท่อไม่ระบุชื่อ (แนะนำโดย 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>&-

มันค่อนข้างยุ่งยากในการทุบตีเนื้อหาภาษาเขียนโปรแกรมง่ายขึ้น กระบวนการอื่นสามารถแนบกับไพพ์ / fd ของคุณก่อนที่จะเขียนรหัสผ่าน หน้าต่างแห่งโอกาสค่อนข้างสั้นและ จำกัด อยู่ที่กระบวนการหรือรูทของคุณ

ตัวแปรสภาพแวดล้อม

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

คุณและรูทสามารถอ่านตัวแปรสภาพแวดล้อมของกระบวนการ (เช่นรหัสผ่านของคุณ) ขณะที่ sshpass กำลังทำงาน ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=) หน้าต่างแห่งโอกาสนั้นยาวกว่า แต่ยัง จำกัด อยู่เฉพาะกระบวนการหรือรูทของคุณไม่ใช่ผู้ใช้รายอื่น

อาร์กิวเมนต์บรรทัดคำสั่ง (ปลอดภัยน้อยที่สุด)

 sshpass -p my_secret_password ssh user@host

สะดวกและปลอดภัยน้อยกว่าที่อธิบายไว้ในหน้า man ผู้ใช้ทุกคนสามารถเห็นอาร์กิวเมนต์บรรทัดคำสั่งได้ (เช่นps -ef | grep sshpass) sshpass พยายามซ่อนอาร์กิวเมนต์ แต่ยังคงมีหน้าต่างที่ผู้ใช้ทุกคนสามารถเห็นรหัสผ่านของคุณผ่านการโต้แย้ง

ข้อความด้านข้าง

ตั้งค่าตัวแปร bash HISTCONTROLของคุณเป็นignorespaceหรือignorebothและนำหน้าคำสั่งที่ละเอียดอ่อนของคุณด้วยช่องว่าง พวกเขาจะไม่ถูกบันทึกไว้ในประวัติศาสตร์


การพิสูจน์ตัวตนคีย์สาธารณะ 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

วลีรหัสผ่านมีความสำคัญมาก ใครก็ตามที่ได้รับไฟล์กุญแจส่วนตัวจะไม่สามารถใช้งานได้หากไม่มีข้อความรหัสผ่าน

ติดตั้งเอเจนต์การพิสูจน์ตัวตน 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)

เชื่อมต่อตามปกติ

ssh user@host

ข้อดีคือกุญแจส่วนตัวของคุณจะถูกเข้ารหัสและคุณจะต้องป้อนข้อความรหัสผ่านเพียงครั้งเดียว (ผ่านวิธีการป้อนข้อมูลที่ปลอดภัยยิ่งขึ้น)


8

แน่ใจหรือว่าคุณไม่ต้องการใช้กุญแจ SSH แทนรหัสผ่าน? ด้วยวิธีนี้ทั้งความปลอดภัยและอัตโนมัติ


3
การใช้คีย์ SSH ที่ไม่มีรหัสผ่านจะปลอดภัยกว่าการใช้รหัสผ่านในไฟล์เพียงเล็กน้อยเท่านั้น
yunzen

10
@yunzen ไม่ถูกต้อง การรับรองความถูกต้องของคีย์จะช่วยปกป้องคุณจากการโจมตีด้วย mitm แม้ว่าคุณจะไม่รู้จักรหัสโฮสต์ ผู้โจมตีสามารถแอบอ้างเป็นเซิร์ฟเวอร์ได้ แต่อย่าเชื่อมต่อกับเซิร์ฟเวอร์จริง ด้วยการตรวจสอบรหัสผ่านเซิร์ฟเวอร์ใด ๆ ที่คุณเชื่อมต่อ (ถูกต้องหรือไม่) จะเห็นรหัสผ่าน ด้วยเหตุผลเหล่านั้นคีย์ ssh ที่ไม่มีรหัสผ่านจะปลอดภัยกว่าการเก็บรหัสผ่านไว้ในไฟล์
kasperd

14
นี่ไม่ใช่คำตอบ
Steve Bennett

@SteveBennett มันเหมือนกับคำตอบที่ยอมรับและโพสต์ไว้ก่อนหน้าแม้ว่าจะมีรายละเอียดน้อยกว่า
Michael Hampton

3
ฉันจะบอกว่าคำตอบที่ยอมรับคือคำตอบที่ดีสำหรับคำถามที่ไม่ได้ถาม นี่ไม่ใช่อะไรเลย
Steve Bennett

4

ขึ้นอยู่กับความต้องการระบบอัตโนมัติของคุณบางที Ansible น่าจะเหมาะกับคุณ มันสามารถจัดการสิ่งต่าง ๆ เช่นการขอรหัสผ่านการขอรหัสผ่าน sudo วิธีการเปลี่ยนการใช้งานต่าง ๆ อย่างปลอดภัยโดยใช้ความลับที่เข้ารหัสไว้ (vault)

หากไม่เหมาะสมฉันขอแนะนำให้คาดหวังตามที่แนะนำในคำตอบอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.