Shell Script สำหรับการเข้าสู่เซิร์ฟเวอร์ ssh


29

ฉันพยายามเขียนเชลล์สคริปต์ซึ่งสามารถล็อกอินอัตโนมัติไปยังเซิร์ฟเวอร์ ssh โดยใช้รหัสผ่านที่กล่าวถึงในสคริปต์ ฉันได้เขียนรหัสต่อไปนี้:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

รหัสนี้ทำงานไม่ถูกต้อง แต่จะขอรหัสผ่าน ใครช่วยได้โปรดช่วยฉันแก้ปัญหานี้ด้วย



คำตอบ:


36

ฉันเคยเขียนexpectสคริปต์เพื่อเข้าสู่เซิร์ฟเวอร์ ssh (เช่นกรณีของคุณ) และสคริปต์ของฉันเป็นอะไรเช่นนี้:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

ฉันคิดว่าบางทีinteractสคริปต์ของคุณอาจหายไป


นี้เป็นอย่างดีทำงานสำหรับฉันและฉันติดอยู่ในสถานที่แห่งนี้โต้ตอบให้ขั้วแบบโต้ตอบกับพรอมต์ แต่ฉันกำลังพยายามที่จะทำให้ขั้นตอนต่อไปมากขึ้นเช่นทำcdและlsและอ่านเนื้อหาของแฟ้มได้เป็นอย่างดี เป็นไปได้ไหมที่จะทำหลังจากทำปฏิกิริยา? โปรดตอบกลับ
Hansiemithun

@Hansie คุณสามารถส่งlsคำสั่งหลังจากเข้าสู่ระบบ ตัวอย่างเช่นหลังจากส่งรหัสผ่านให้ทำexpectด้วยข้อความพร้อมท์คำสั่ง (เพื่อให้แน่ใจว่าคุณเข้าสู่ระบบแล้วsend "ls\r") interactทั้งหมดเหล่านี้ไปก่อน
saeedn

คำถามไม่ถูกต้องเล็กน้อยและฉันขอโทษหลังจากทำ ls และอ่านเนื้อหาฉันสามารถพิมพ์ได้เหมือนกัน แต่วิธีรับเซสชันนั้นออกจาก ssh ให้เป็นตัวแปรเพื่อเข้าถึงจากเครื่องโลคัล Ref: stackoverflow.com/questions/32341234/expect-script-return-value แต่ผลลัพธ์ไม่ทำงานสำหรับฉัน คำถามของฉันโพสต์: stackoverflow.com/questions/51628465/… . ฉันต้องการfile_listหลังจากออกจากการเข้าถึงจากพรอมต์คำสั่งในท้องถิ่น
Hansiemithun

31

คุณกำลังทำผิดวิธี สิ่งที่คุณต้องการทำคือสร้างคู่ ssh-key ที่ไม่มีรหัสผ่านจากนั้น (ตราบใดที่เซิร์ฟเวอร์รองรับการตรวจสอบความถูกต้องของคีย์ RSA) คุณสามารถเข้าใช้งานได้โดยไม่ต้องพิมพ์รหัสผ่านสำหรับทุกคน นี่เป็นความเสี่ยงด้านความปลอดภัยหากรหัสส่วนตัวของคุณถูกเก็บไว้ที่ไหนสักแห่งที่อาจถูกขโมยได้

ทำตามขั้นตอนเหล่านี้:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. กดReturnเมื่อได้รับแจ้งให้ใส่ข้อความรหัสผ่าน
  5. กดReturnครั้งที่สองเพื่อยืนยัน

ขณะนี้จะมีสองไฟล์ของคุณใน~/.sshไดเรกทอรีและmysshkey.pub เป็นกุญแจสาธารณะของคุณอันนี้ปลอดภัยที่จะวางบนเซิร์ฟเวอร์ระยะไกล เป็นรหัสผ่านส่วนตัวของคุณซึ่งไม่ปลอดภัยที่จะนำไปวางบนเซิร์ฟเวอร์ระยะไกลmysshkeymysshkey.pubmysshkey

บนเซิร์ฟเวอร์ที่คุณต้องการ SSH เป็น:

  1. ลงชื่อเข้าใช้เซิร์ฟเวอร์ระยะไกล
  2. mkdir -p ~/.ssh
  3. คัดลอกและวางเนื้อหาของmysshkey.pubลงใน~/.ssh/authorized_keys
  4. ตรวจสอบให้แน่ใจว่า~/.ssh/authorized_keysมีchmod'd เพื่อ600

ตอนนี้เพื่อนำไปใช้กับเครื่องโลคัลของคุณให้คุณรันคำสั่งต่อไปนี้:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

และคุณจะเข้าสู่ระบบโดยไม่ต้องใส่รหัสผ่าน

นี่เป็นวิธีที่ดีกว่ามากในการจัดการการเข้าสู่ระบบอัตโนมัติในขณะที่คุณไม่ได้เข้ารหัสรหัสผ่านของคุณหลายแห่งซึ่งจำเป็นต้องได้รับการอัปเดตหากคุณเคยเปลี่ยน


2
ฉันจะใช้คีย์ RSA แทน DSA แต่นอกจากนั้นเห็นด้วยอย่างเต็มที่
glglgl

12
บางครั้งคุณไม่สามารถเพิ่มคีย์ไปยังโฮสต์ระยะไกลเช่นอุปกรณ์เครือข่าย
DarkHeart

1
ฉันลองสิ่งนี้ ssh ยังคงถามหารหัสผ่าน คุณต้องให้ที่อยู่ IP โดยเฉพาะหรือไม่? ฉันลองทั้ง <user> @ <domain-name> และชื่อโดเมน
Jay Bienvenu

คำสั่งนี้พูดว่ามีการโต้แย้งกันมากเกินไป? (สำหรับขั้นตอนที่ 3)
Joseph Astrahan

ฉันต้องเปลี่ยนเป็น ssh-keygen -t dsa และป้อนตำแหน่งไฟล์ด้วยตนเองแทน
Joseph Astrahan

20

บนดิสทริบิวชันที่ใช้ Debian sshpassแพ็คเกจจะให้วิธีที่ง่ายกว่าในการทำสิ่งที่คุณต้องการ แพ็คเกจนี้มีให้สำหรับการแจกจ่ายยอดนิยมอื่น ๆ อีกมากมาย คุณต้องตั้งค่าก่อน:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

จากนั้นเรียกใช้คำสั่ง SSH จากสคริปต์เช่นนี้:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

expectนี้ให้มีความยืดหยุ่นมากขึ้นเช่นถ้าคุณกำลังใช้สถานที่ที่แตกต่างกันหรือจำเป็นที่จะต้องเปลี่ยนรหัสผ่านกว่าการแก้ปัญหาโดยใช้


7

ก่อนติดตั้ง sshPass sudo apt-get install sshpass

จากนั้นสร้างนามแฝงในไฟล์. bashrc เป็น

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

ตอนนี้โหลดไฟล์. bashrc ที่โหลดใหม่ของคุณโดย source ~/.bashrc

คุณทำเสร็จแล้ว

ตอนนี้คุณสามารถเรียกใช้ ssh โดยใช้นามแฝงที่สร้างขึ้นข้างต้นsshLoginใน terminal



2

ทุกสิ่งที่คุณต้องการสำหรับสร้างคีย์แฮชและบันทึกไว้ในพีซีของคุณ

เพียงพิมพ์

ssh-keygen -t rsa -b 4096 # just press Enter till the end

จากนั้นป้อน

ssh-copy-id <user>@<server>

จากนั้นเข้าสู่ระบบตามปกติโดยใช้

ssh <user>@<server>

ตอนนี้คุณไม่จำเป็นต้องใช้รหัสผ่าน

หมายเหตุ: การบันทึกรหัสผ่านของคุณในรูปแบบข้อความล้วนอันตราย

วิธีนี้กำลังสร้างค่าแฮชของรหัสผ่านของคุณโดยใช้ RSA ด้วยรหัสสาธารณะที่มีความยาว 4096 ซึ่งมีความปลอดภัยมาก


1
สิ่งนี้ดูเหมือนจะซ้ำคำตอบนี้
roaima

#roaima ใช่ แต่มันก็แสดงให้เห็นถึงssh-copy-idคำสั่งที่มีประโยชน์อย่างไม่น่าเชื่อซึ่งไม่มีใครพูดถึงอีก ฉัน upvoting สำหรับสิ่งนั้น
Huw Walters

1

SSH Passwordless เข้าสู่ระบบโดยใช้ SSH Keygen ใน 5 ขั้นตอนง่าย ๆ :

การตั้งค่าสภาพแวดล้อม: ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 1: การ รับรองความถูกต้อง SSH-Kegen Keys on - (192.168.0.12)
ครั้งแรกที่เข้าสู่เซิร์ฟเวอร์ 192.168.0.12 กับผู้ใช้และสร้างคู่ของกุญแจสาธารณะโดยใช้คำสั่งต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2: สร้าง. ssh Directory บน - 192.168.0.11
ใช้ SSH จากเซิร์ฟเวอร์ 192.168.0.12 เพื่อเชื่อมต่อเซิร์ฟเวอร์ 192.168.0.11 เพื่อสร้างไดเรกทอรี. ssh ภายใต้โดยใช้คำสั่งต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3: อัปโหลดคีย์สาธารณะที่สร้างไปที่ - 192.168.0.11
ใช้ SSH จากเซิร์ฟเวอร์ 192.168.0.12 และอัปโหลดคีย์สาธารณะที่สร้างขึ้นใหม่ (id_rsa.pub) บนเซิร์ฟเวอร์ 192.168.0.11 ภายใต้.sshไดเรกทอรีของผู้ใช้ในชื่อไฟล์

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 4: ตั้งค่าการอนุญาต - 192.168.0.11
เนื่องจากรุ่น SSH ที่แตกต่างกันบนเซิร์ฟเวอร์เราจำเป็นต้องตั้งค่าการอนุญาตใน.sshไดเรกทอรีและauthorized_keysไฟล์

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 5: เข้าสู่ระบบจาก 192.168.0.12 ถึง 192.168.0.11 เซิร์ฟเวอร์ที่ไม่มีรหัสผ่าน
จากนี้เป็นต้นไปเราสามารถเข้าสู่ระบบ 192.168.0.11 ในฐานะผู้ใช้ sheena จากเซิร์ฟเวอร์ 192.168.0.12 ในฐานะผู้ใช้ tecmint โดยไม่ต้องใช้รหัสผ่าน

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ ... มันใช้งานได้สำหรับฉันยกเว้นในขั้นตอนที่ 4 ฉันได้รับ "คำเตือน" ที่น่าทึ่ง: "ไฟล์ลับส่วนตัวแบบไม่มีการป้องกัน! ... ... /. ssh / id_rsa 'เปิดอยู่เกินไป ... รหัสส่วนตัวจะเป็น เพิกเฉย ... สิทธิ์ที่ไม่เหมาะสม " ฉันทำchmod 700 id_rsaในไดเรกทอรี. ssh ในเครื่อง (ไคลเอนต์คือ 192.168.0.12 ในตัวอย่างของคุณ) เซิร์ฟเวอร์: การแก้ไขปัญหา
ไมค์สัตว์ฟันแทะ

2
กรุณาอย่าโพสต์ภาพของข้อความ
roaima

1

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

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

หลังจากนั้นคุณต้องป้อนรหัสผ่าน (ไม่มีสิ่งใดปรากฏบนหน้าจอ) จากนั้นกด Enter จะเปิดการเชื่อมต่อ


0

ฉันเพิ่งทำสิ่งนี้สิ่งนี้อาจช่วยคุณได้:

sshpass -p 'password' username@ipaddress

หากวิธีนี้ใช้ไม่ได้ผลคุณจะต้องสร้างรหัสในเครื่องอื่นที่คุณต้องการเชื่อมต่อด้วย

ssh-keygen

มันจะสร้างกุญแจส่วนตัวและกุญแจสาธารณะและถามหาสถานที่ทิ้งไว้ที่ว่างมันจะบันทึกกุญแจไว้ในโฟลเดอร์. ssh ตามค่าเริ่มต้นมันจะขอให้คุณใส่ข้อความรหัสผ่านคุณยังสามารถปล่อยว่างไว้ในโฟลเดอร์. ssh และเปลี่ยน ชื่อกุญแจสาธารณะเป็น 'authorized_keys'

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

สิ่งนี้จะเพิ่มผู้ใช้ในรายการตอนนี้ไปที่โฮมไดเร็กตอรี่และให้สิทธิ์และรีสตาร์ทบริการ sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

ตอนนี้คุณจะต้องย้ายกุญแจส่วนตัวไปยังระบบที่ตำแหน่งนั้นจากที่ที่คุณจะเรียกใช้คำสั่ง ssh จากนั้นคุณสามารถเชื่อมต่อกับ

sshpass -p 'password' ssh -i id_rsa username@ip

หากแม้ไม่ได้ผลให้ไปที่ / etc / ssh open sshd_config ด้วย vim editor check หาก pubkeyAuthenticatoin เปลี่ยนเป็นใช่หรือไม่ถ้าไม่เปลี่ยนเป็นใช่ให้เริ่มบริการ sshd ใหม่แล้วลองใช้งาน .


0

อาร์กิวเมนต์แรกคือชื่อโฮสต์และที่สองคือรหัสผ่าน

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

การดำเนินการ: ./script.expect

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