วิธีการใช้ sshpass


28

ฉันจำเป็นต้องใช้sshpassเพื่อเปิดใช้คำสั่งระยะไกลผ่าน SSH จากรหัส Java

ถ้าฉันพิมพ์ด้วยตนเองในคอนโซล:

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นิ่งบนแป้นโฮสต์ที่ไม่ถูกต้อง (output ไม่มีค่าstderrมิได้stdout) 6และอยู่กับสถานะรหัส ในช่วงเวลาของการเขียนนี้นี่คือการแก้ไข 50 และค่าคงที่การจับคู่ในรหัสคือRETURN_HOST_KEY_UNKNOWNซึ่งบ่งบอกถึงข้อผิดพลาดที่

รหัสข้อผิดพลาดของคุณอาจแตกต่างกันและการดูรหัสที่ลิงก์ด้านบนอาจให้ข้อมูลเชิงลึกบางอย่างแก่คุณ

หากปัญหาของคุณเป็นรหัสโฮสต์ที่ไม่ถูกต้องคุณควรคิดสองครั้งเกี่ยวกับการแทนที่ข้อผิดพลาดด้วยตัวเลือก CLI เครื่องของคุณอาจถูกบุกรุกหรือคุณอาจถูกโจมตีจาก MITM! หากคุณมั่นใจ 100% ว่าไม่ใช่กรณีนี้และหากคุณไม่มีวิธีที่จะทำให้คีย์โฮสต์ที่ผ่านการตรวจสอบเป็นปัจจุบันคุณสามารถใช้คำสั่งดังนี้:

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

2
ด้วยการติดตั้งชงจำเป็นต้องมีพื้นที่ว่างหลังจาก -p github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

ข้อสังเกต: ทุกคนควรจำไว้ว่าการใช้คีย์โฮสต์ SSH แบบไม่มีรหัสผ่านนั้นปลอดภัยกว่าทุกครั้งที่ทำได้! ตามคำจำกัดความการใช้ SSHPass มีความปลอดภัยน้อยกว่า
เครื่องหมายคำถาม

@Questionmark ในขณะที่เป็นจริงมีกรณีขอบที่ปลายทางระยะไกลไม่สนับสนุนการรับรองความถูกต้องผ่านทางคีย์ ซึ่งเป็นที่ที่ sshpass มีประโยชน์
exhuma

ใช่ฉันรู้. นั่นคือเหตุผลที่ฉันพูดว่า "เมื่อใดก็ตามที่เป็นไปได้" ...
เครื่องหมายคำถาม

1
ด้วย SSH StrictHostKeyChecking=accept-newใหม่พอมี
muru

5

sshpassassword:ทำงานเฉพาะถ้ารหัสผ่านปลายพรอมต์ใน

หากพรอมต์รหัสผ่านของคุณแตกต่างกันคุณอาจต้องปรับซอร์สโค้ดของsshpassให้รู้จักการแจ้งเตือนที่คุณมี

ฉันเคยเห็นรหัสผ่านแจ้งเหมือนกับ Password for user@host:ในบางระบบบางทีนี่อาจเป็นปัญหาของคุณ


1
ขอโทษ? -P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
ตัวเลือกใหม่นี้ (ต้องการอย่างน้อย V1.0.6 ของ sshpass) แก้ปัญหาได้
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-administrator.org/articles/152


ฉันอยากจะลอง sshpass เนื่องจากความไม่สะดวกในการเปิดใช้งานการเข้าสู่ระบบโดยไม่ใช้รหัสผ่านในองค์กร
Roman Rdgz

คุณได้ลองสิ่งนี้แล้ว: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

ฉันทำได้ไม่สำคัญว่าฉันจะใช้ 'mypass' หรือ mypass มันเริ่มต้นตลอดไป
Roman Rdgz

sshpass -V ทำงานอย่างไร
koni_raid

มันพิมพ์: "โปรแกรมนี้เป็นซอฟต์แวร์เสรีและสามารถแจกจ่ายได้ภายใต้เงื่อนไขของ GPL ดูไฟล์ COPYING สำหรับข้อมูลเพิ่มเติม" และจบการทำงานและไม่ทำอะไรเลย (ฉันลองเพิ่ม -V ไปยังจุดเริ่มต้นของคำสั่งที่ฉันจัดการไม่ใช่แค่พิมพ์ sshpass -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 อย่างน้อยหนึ่งครั้งด้วยตนเองเพื่อรับรหัส RSA ของเครื่องที่คุณกำลังเชื่อมต่อเพื่อไปที่~/.ssh/known_hostsไฟล์ก่อน sshpass จะช่วยให้คุณเชื่อมต่อได้

ดังนั้นหลังจากที่ได้รับรายการในไฟล์ 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

นอกจากนี้คุณอาจต้องลบ "requiretty" จาก sudo config (/ etc / sudoers) บนเครื่องระยะไกล


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.