วิธีที่เหมาะสมในการ sudo มากกว่า ssh


150

ฉันมีสคริปต์ที่รันสคริปต์อื่นผ่าน SSH บนเซิร์ฟเวอร์ระยะไกลโดยใช้ sudo อย่างไรก็ตามเมื่อฉันพิมพ์รหัสผ่านมันจะปรากฏขึ้นบน terminal (มิฉะนั้นมันจะทำงานได้ดี)

ssh user@server "sudo script"

วิธีที่เหมาะสมในการทำเช่นนี้คือฉันสามารถพิมพ์รหัสผ่านสำหรับ sudo ผ่าน SSH โดยไม่ต้องใช้รหัสผ่านปรากฏขึ้นในขณะที่พิมพ์


2
สำหรับฉันเหตุผลที่จะมองหาวิธีการ sudoing ผ่าน ssh ก็คือมันไม่ได้ทำงานเมื่อพยายามบางสิ่งบางอย่างเช่นssh <user@server> sudo <script>ฉันได้รับข้อผิดพลาดsudo: no tty present and no askpass program specified
knocte

คำตอบ:


244

อีกวิธีคือใช้-tสวิตช์เพื่อssh:

ssh -t user@server "sudo script"

ดูman ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
ดีฉันรู้ของตัวเลือก -t เพียงแค่ไม่รู้ว่ามันใช้งานได้กับ sudo prompt

3
ตัวเลือก t คืออะไร
วินซ์


3
มันไม่ทำงานที่นี่: ssh -t localhost <<< "sudo touch file;"แก้ไขเห็นได้ชัดว่าเป็นสิ่งสำคัญที่คุณต้องให้คำสั่งเป็นพารามิเตอร์ไม่ใช่ผ่านมาตรฐานใน
การชดเชย จำกัด

-tวิธีนี้จะแสดงการส่งออกสีของคำสั่งซึ่งปกติจะทำเช่นนั้น
karmakaze

24

ฉันสามารถอัตโนมัติด้วยคำสั่งต่อไปนี้:

echo pass | ssh -tt user@server "sudo script"

ข้อดี:

  • ไม่มีพรอมต์รหัสผ่าน
  • จะไม่แสดงรหัสผ่านในประวัติทุบตีของเครื่องระยะไกล

เกี่ยวกับความปลอดภัย:ตามที่Kurtกล่าวการรันคำสั่งนี้จะแสดงรหัสผ่านของคุณในประวัติทุบตีท้องถิ่นของคุณและเป็นการดีกว่าที่จะบันทึกรหัสผ่านในไฟล์อื่นหรือบันทึกคำสั่งทั้งหมดในไฟล์. sh และเรียกใช้งาน หมายเหตุ: ไฟล์นั้นต้องมีการอนุญาตที่ถูกต้องเพื่อให้ผู้ใช้ที่ได้รับอนุญาตเท่านั้นที่สามารถเข้าถึงได้


8
มันจะปรากฏขึ้นในประวัติทุบตีของระบบท้องถิ่นรวมถึงรหัสผ่าน ดีกว่าที่จะเก็บรหัสผ่านในไฟล์และแมวไฟล์
Kurt Fitzner

4
ชายฉันรู้-tแต่ฉันไม่ได้อ่านคู่มืออย่างละเอียดพอที่จะเห็นว่าคุณสามารถผ่านมันได้สองครั้ง! นี่คือสิ่งที่ฉันกำลังมองหาเป็นเวลาหลายเดือน! ขณะที่การรักษาความปลอดภัยนอกจากนี้ผมก็ตั้งค่าตัวแปรรหัสผ่านก่อนที่จะทำงานด้วยแล้วได้read -s -p "Password: " pw echo "$pw" | ....ตอนนี้ฉันได้นำสคริปต์นี้ไปใช้เพื่อตัวฉันเองแล้ว :)
kael

ทำงานเหมือนมีเสน่ห์สำหรับฉัน!
MiKr13

ทำไมคุณไม่ตั้งค่า sudo ที่ไม่มีรหัสผ่านสำหรับผู้ใช้และคำสั่งที่คุณต้องการเรียกใช้ นี่ไม่ใช่ปัญหา SSH ...
ผู้หญิง

@nnn แก้ปัญหาของคุณยังใช้ได้ แต่ต้องมีขั้นตอนเพิ่มเติม หากฉันมีอุปกรณ์จำนวนมากที่ไม่มีผู้ใช้ sudo โดยไม่ใช้รหัสผ่านฉันสามารถสร้างสคริปต์อัตโนมัติโดยใช้โซลูชันนี้ บางครั้งคุณทำงานบนระบบที่คุณไม่ได้เป็นเจ้าของและคุณไม่ต้องการหรือไม่สามารถเปลี่ยนแปลงได้บางครั้งก็มีข้อควรพิจารณาอื่น ๆ
ofirule

6

สมมติว่าคุณไม่ต้องการรหัสผ่านแจ้ง :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

ตัวอย่าง

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
นี่เป็น / มาก / อันตรายเนื่องจากรหัสผ่านแบบธรรมดาจะสิ้นสุดที่บรรทัดคำสั่ง บรรทัดคำสั่งเป็นแบบสาธารณะและสามารถเห็นได้โดยผู้ใช้รายอื่นและกระบวนการในระบบ ตัวอย่างเช่น "ps auxwwwww" โดยผู้ใช้ที่ไม่มีสิทธิพิเศษจะแสดงทุกกระบวนการทำงานและบรรทัดคำสั่งที่ใช้งาน
Kurt Fitzner

3
ไม่ต้องพูดถึงการใส่รหัสผ่านของคุณ (เป็นข้อความธรรมดา) ลงในไฟล์ bash_history
Layne Bernardo

4

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 remote ทำไมคุณต้องดำเนินการcatและไพพ์ผลลัพธ์เป็น sudo คุณสามารถใช้sudoเป็นคำสั่ง ssh remote ได้หรือไม่?
joanpau

@joanpau เริ่มต้นcatใช้เพื่อไพพ์รหัสผ่านของผู้ใช้ไปยัง sudo ที่อีกด้านหนึ่ง หากผู้ใช้สามารถเรียกใช้ sudo โดยไม่ต้องใช้รหัสผ่านก็ไม่จำเป็นต้องใช้ แต่ฉันไม่แนะนำการกำหนดค่านี้ เหตุผลที่ถูกไพพ์คือการป้องกันไม่ให้รหัสผ่านปรากฏขึ้นที่บรรทัดคำสั่งของ sysrtem ระยะไกล ps auxwwwบรรทัดคำสั่งจะไม่ปลอดภัยผู้ใช้สามารถดูบรรทัดคำสั่งทุก
Kurt Fitzner

ผมขอให้สำหรับในคำสั่งcat SSH cat \| sudo --prompt="" -S...หาก-Sกองกำลังที่sudoจะอ่านรหัสผ่านจาก stdin แมวและท่อมีความจำเป็นหรือไม่? คำสั่ง ssh อาจเป็นเพียงแค่sudo --prompt="" -S...?
joanpau

@jonpau คำสั่ง cat นั้นใช้ stdin และทำการ pip ผ่าน sudo เพื่อส่งผ่าน sudo password มันแสดงให้เห็นว่าคุณสามารถไพพ์รหัสผ่าน sudo ผ่าน ssh ผ่าน stdin ได้อย่างปลอดภัยได้อย่างไร
Kurt Fitzner

1

วิธีที่ดีที่สุดคือการยกตัวอย่างเช่นssh -t user@server "sudo <scriptname>" ssh -t user@server "sudo reboot"มันจะพร้อมท์ให้ใส่รหัสผ่านสำหรับผู้ใช้ก่อนแล้วจึงรูท (เนื่องจากเรากำลังเรียกใช้สคริปต์หรือคำสั่งที่มีสิทธิ์ใช้งานรูท

ฉันหวังว่ามันจะช่วยและแก้ไขข้อสงสัยของคุณ


0

NOPASSในการกำหนดค่าบนเครื่องเป้าหมายของคุณคือทางออก อ่านต่อได้ที่http://maestric.com/doc/unix/ubuntu_sudo_without_password


6
ในกรณีนี้ฉันต้องการรหัสผ่านจริงและพิมพ์โดยตรงดังนั้นจึงใช้งานไม่ได้
darkfeline


-1

ฉันประสบปัญหา

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

จากนั้นฉันก็ลองด้วย

#1
vim /etc/sudoers
Defaults:user1    !requiretty

ไม่ทำงาน

#2
user1   ALL=(user2)         NOPASSWD: ALL

ที่ทำงานอย่างถูกต้อง!


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

-7

ขึ้นอยู่กับการใช้งานของคุณฉันประสบความสำเร็จกับสิ่งต่อไปนี้:

ssh root@server "script"

สิ่งนี้จะถามรหัสผ่านรูทแล้วดำเนินการคำสั่งอย่างถูกต้อง


26
Yikes, SSH เป็น root หรือไม่ นั่นเป็นแนวคิดที่ไม่ดีสำหรับเหตุผลทุกประเภท
darkfeline

12
จำไว้ว่า ssh ไม่ใช่ telnet ไม่เป็นอันตรายใด ๆ ต่อ ssh ในฐานะรูทมากกว่าที่จะเป็น ssh ในฐานะผู้ใช้รายอื่นและเรียกใช้ sudo รหัสผ่านของคุณถูกเข้ารหัสด้วยวิธีเดียวกันกับการเชื่อมต่อ ssh
Stéphane

22
Stéphaneนั้นถูกต้องอย่างแน่นอนตราบใดที่ความปลอดภัยของรหัสผ่านยังคงอยู่ อย่างไรก็ตามโดยการใช้รูทแทนที่จะเป็น sudo คุณจะสูญเสียหลักฐานการตรวจสอบที่เกิดขึ้นกับ sudo นอกจากนี้การเข้าถึงรูทอาจไม่สามารถใช้ได้
djeikyb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.