วิธีการใช้ ssh และ sudo ด้วยกันในทุบตี?


10

ฉันไม่สามารถค้นหาคำถามที่อธิบายสถานการณ์เฉพาะนี้ได้

ฉันพยายามเรียกใช้สคริปต์ทุบตีพื้นฐานเพื่อดึงการบันทึกจากเครื่องหลายเครื่อง ฉันกำลังเรียกใช้สคริปต์ภายในเครื่อง แต่จำเป็นต้องเข้าถึงเครื่องภายนอกผ่านทาง ssh รวมถึง sudo เป็นผู้ใช้ที่มีสิทธิ์เพียงครั้งเดียวบนเครื่องนั้น ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

การรันด้วย sh -x จะเผยให้เห็นว่า bash กำลังติดอยู่บนบรรทัด 'ssh' ดังนั้นฉันจึงพยายามแก้ไขเป็น:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

เรื่องนี้ก็ดูเหมือนจะหยุดไปเรื่อย ๆ มีวิธีแก้ไขปัญหานี้ได้ดีกว่าหรือไม่? ฉันไม่เห็นวิธีการใช้ sudo su จากสิ่งที่ฉันสามารถบอกได้ ...

ขอบคุณสำหรับความช่วยเหลือใด ๆ !


ทำไมการโหวตอย่างใกล้ชิด? คำถามนี้อยู่ในหัวข้อ: การจัดการฮาร์ดแวร์หรือซอฟต์แวร์ของเซิร์ฟเวอร์เวิร์คสเตชั่นการจัดเก็บหรือเครือข่ายเครื่องมือที่ใช้สำหรับการดูแลการตรวจสอบหรือการทำให้เป็นอัตโนมัติ
jlliagre

คำตอบ:


5

วิธีที่ฉันประสบความสำเร็จในสภาพแวดล้อมปัจจุบันของฉันคือการรัน ssh ด้วย-tแฟล็กซึ่งบังคับให้มีการจัดสรร tty จากนั้นจึงรัน sudo -u root ภายในดังต่อไปนี้:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

ฉันมีบัญชีของฉันใน sudoers ทางด้านระยะไกลเพื่อไม่ต้องใช้รหัสผ่าน

ตัวอย่างนี้แสดงให้คุณเห็นวิธีที่แตกต่างในการทำเช่นนี้ภายในเซสชัน ssh เดียวรวมถึงการรันหลายคำสั่งด้วย bash หรือภายใน subshell โปรดทราบด้วยว่าหากคุณใส่รหัสด้านบนลงในสคริปต์ที่สามารถเรียกทำงานได้คุณสามารถส่งอาร์กิวเมนต์บรรทัดคำสั่ง ($ 1 และ $ 2) ไปที่ ssh และสิ่งเหล่านี้จะถูกขยายและอ้างอิงจากด้านไกล


น่าเสียดายเพราะฉันไม่ได้จัดการเซิร์ฟเวอร์ระยะไกลฉันเชื่อว่าฉันติดกับ sudo su ที่นี่ จะยังคงใช้งานได้ในรูปแบบนี้หรือไม่?
Matt124234

ใช่มันจะทำงานด้วย คุณสามารถป้อนรหัสผ่านเมื่อได้รับแจ้ง
Michael Martinez

ฉันได้ลองแล้ว: ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / บันทึก / * / * EOF แต่ฉันได้รับ: "Pseudo -terminal จะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล "
Matt124234

ตกลงอย่างสมบูรณ์แบบ ไม่สนใจคำเตือนนั้นและดำเนินการต่อ ถ้าคุณต้องการคุณสามารถปิดการใช้งาน "RequireTty" ใน / etc / sudoers ในปลายระยะไกล
Michael Martinez

5

หากคุณไม่ต้องการหรือไม่สามารถหยุด sudo ไม่ให้ถามรหัสผ่านเคล็ดลับง่ายๆอย่างหนึ่งคือการอ่านในเครื่องและเก็บไว้ในตัวแปรท้องถิ่น:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

หาก sudo ได้รับการกำหนดค่าให้อนุญาตคำสั่งที่ไม่มีรหัสผ่านสิ่งนี้ควรทำตามที่คุณต้องการ:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

หรือ

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

ขึ้นอยู่กับว่าคุณต้องการfile.txtสร้างไฟล์ในเครื่องหรือจากระยะไกล

มิฉะนั้นนี่คือวิธีการส่งรหัสผ่านของผู้ใช้ระยะไกลไปที่sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

น่าสนใจมาก. อย่างไรก็ตามการใช้ ssh โดยไม่มี -t บอกฉันว่า "ไม่มี tty ปัจจุบัน" การเพิ่มใน -t ลบข้อผิดพลาดนี้ แต่ดูเหมือนจะไม่ให้เกียรติ 'sudo su' เนื่องจากจะแจ้งให้ฉันใส่รหัสผ่าน นี่คือสิ่งที่ฉันทำโดยเฉพาะ: ssh -t mrhyner@test-server.net "sudo su - adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" นี่ทำให้ฉัน: bash : WARN: ไม่พบคำสั่ง [sudo] รหัสผ่านสำหรับ mrhyner:
Matt124234

ขออภัยดูเหมือนว่าฉันไม่ทราบวิธีจัดรูปแบบความคิดเห็นของฉันในสิ่งนี้
Matt124234

ฉันสมมติว่า sudo ได้รับการกำหนดค่าให้ไม่มีรหัสผ่านสำหรับบัญชีระยะไกลของคุณ
jlliagre

และคุณไม่มีเครื่องหมายอัญประกาศพิเศษเพิ่มเติม
jlliagre

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