Sudo ผ่าน SSH ผ่านรหัสผ่านไม่ต้องใช้ tty:
คุณสามารถใช้ sudo บน ssh โดยไม่บังคับให้ ssh มี pseudo-tty (โดยไม่ใช้สวิตช์ ssh "-t") โดยบอก sudo ว่าไม่ต้องใช้รหัสผ่านแบบโต้ตอบและเพียงแค่ดึงรหัสผ่านออกจาก stdin คุณทำได้โดยใช้สวิตช์ "-S" บน sudo ทำให้ sudo ฟังรหัสผ่านบน stdin และหยุดฟังเมื่อเห็นบรรทัดใหม่
ตัวอย่างที่ 1 - คำสั่งระยะไกลแบบง่าย
ในตัวอย่างนี้เราส่งwhoami
คำสั่งง่ายๆ:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
เรากำลังบอกให้ sudo ไม่ให้พรอมต์และรับข้อมูลจาก stdin นี้จะทำให้รหัสผ่าน sudo whoami
ผ่านเงียบสนิทเพื่อให้การตอบสนองที่เดียวที่คุณจะได้รับกลับเป็นเอาท์พุทจาก
เทคนิคนี้มีประโยชน์ในการอนุญาตให้คุณเรียกใช้โปรแกรมผ่าน sudo ผ่าน ssh ที่ตัวเองต้องการอินพุต stdin นี่เป็นเพราะ sudo ใช้รหัสผ่านที่บรรทัดแรกของ stdin จากนั้นปล่อยให้โปรแกรมใดก็ตามที่มันรันต่อไปเพื่อเรียกใช้ stdin
ตัวอย่างที่ 2 - คำสั่งระยะไกลที่ต้องใช้ stdin ของตัวเอง
ในตัวอย่างต่อไปนี้คำสั่งรีโมต "cat" ถูกเรียกใช้ผ่าน sudo และเราจัดเตรียมบรรทัดพิเศษบางส่วนผ่าน stdin เพื่อให้รีโมต cat แสดง
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
ผลลัพธ์แสดงให้เห็นว่า<remote_sudo_password>
บรรทัดนั้นถูกใช้งานโดย sudo และแมวที่ดำเนินการจากระยะไกลนั้นจะแสดงบรรทัดพิเศษ
ตัวอย่างของสิ่งที่เป็นประโยชน์คือถ้าคุณต้องการใช้ ssh ส่งรหัสผ่านไปยังคำสั่งที่มีสิทธิพิเศษโดยไม่ต้องใช้บรรทัดคำสั่ง พูดถ้าคุณต้องการติดตั้งภาชนะเข้ารหัสระยะไกลผ่าน ssh
ตัวอย่างที่ 3 - การติดตั้งคอนเทนเนอร์เวราคริปต์ระยะไกล
ในสคริปต์ตัวอย่างนี้เรากำลังติดตั้งคอนเทนเนอร์ VeraCrypt จากระยะไกลผ่าน sudo โดยไม่มีข้อความแจ้งเตือนเพิ่มเติม:
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
ควรสังเกตว่าในตัวอย่างบรรทัดคำสั่งทั้งหมดข้างต้น (ทุกอย่างยกเว้นสคริปต์) การ<< EOF
สร้างบนบรรทัดคำสั่งจะทำให้ทุกอย่างที่พิมพ์รวมถึงรหัสผ่านถูกบันทึกไว้ใน. bash_history ของเครื่องโลคัล ดังนั้นจึงขอแนะนำอย่างสูงว่าสำหรับการใช้งานจริงคุณสามารถใช้งานได้อย่างสมบูรณ์ผ่านสคริปต์เช่นตัวอย่าง veracrypt ด้านบนหรือถ้าในบรรทัดคำสั่งให้ใส่รหัสผ่านในไฟล์และเปลี่ยนเส้นทางไฟล์ผ่าน ssh
ตัวอย่าง 1a - ตัวอย่างที่ 1 ที่ไม่มีรหัสผ่าน Command-Line ในพื้นที่
ตัวอย่างแรกจะกลายเป็น:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
ตัวอย่าง 2a - ตัวอย่างที่ 2 ไม่มีรหัสผ่าน Command-Line ในพื้นที่
และตัวอย่างที่สองจะกลายเป็น:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
การใส่รหัสผ่านในไฟล์แยกต่างหากนั้นไม่จำเป็นหากคุณใส่ทุกอย่างไว้ในสคริปต์เนื่องจากเนื้อหาของสคริปต์ไม่ได้อยู่ในประวัติของคุณ มันอาจจะมีประโยชน์แม้ว่าในกรณีที่คุณต้องการอนุญาตให้ผู้ใช้ที่ไม่ควรเห็นรหัสผ่านเพื่อเรียกใช้งานสคริปต์
ssh <user@server> sudo <script>
ฉันได้รับข้อผิดพลาดsudo: no tty present and no askpass program specified