SSH: รันคำสั่ง sudo


44

ฉันมีเชลล์สคริปต์แบบโต้ตอบที่หนึ่งต้อง ssh ไปยังเครื่องอื่น (ตาม Ubuntu) และดำเนินการบางอย่างเป็น root (ผู้ใช้ควรป้อนรหัสผ่านของเขา แต่คำสั่งระยะไกลควรทำงานตามที่ระบุไว้ในสคริปต์):

# ...
ssh remote-machine 'sudo ls'
# ...

อย่างไรก็ตามฉันได้รับข้อความแสดงข้อผิดพลาดนี้เสมอ:

sudo: no tty present and no askpass program specified

ตกลงนั่นค่อนข้างชัดเจน แต่ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร สิ่งนี้จะเกิดขึ้น:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

คำตอบ:


52

มหัศจรรย์sshมีการรักษาทุกอย่าง จุดคือการเพิ่มการ-tตั้งค่าสถานะเพื่อบังคับให้ ssh จัดสรร pseudo-tty:

ssh -t remote-server 'sudo ls'

1
อย่างไรก็ตาม PTY สามารถทำสิ่งต่างๆให้ยุ่งกับสคริปต์ได้ lsเอาต์พุตจะมี \ r \ n ตอนจบตัวอย่างเช่น
Tobu

1
วิธีง่ายๆในการบังคับให้ ls เข้าสู่โหมดที่ไม่ใช่ขั้ว ls | catจะทำ - จะเห็นว่า stdout เป็นท่อ ในคำถามที่เฉพาะเจาะจงนี้ไม่เกี่ยวข้องกันเนื่องจากเห็นได้ชัดว่าตั้งใจที่จะเรียกใช้แบบโต้ตอบจากเทอร์มินัลดังนั้นคุณอาจต้องการคอลัมน์และสีและอะไรก็ตาม
Gabe

0

วิธีนี้จะเรียกใช้สคริปต์เดียวโดยใช้ sudo หลังจาก ssh:

สมมติว่าเรามีผู้ใช้ "ทางไกล" ที่มีความสามารถใน sudo และเรามีสคริปต์ที่เราต้องการให้มันทำงานเป็นรูท

1) ตั้งค่าสคริปต์ใน/ etc / passwdเพื่อใช้ในการเข้าสู่ระบบ:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) ภายใน "login.sh" เราเรียกใช้งานสคริปต์ที่เราต้องการเรียกใช้เป็น "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

โดยปกติจะถามรหัสผ่านสองครั้ง: ssh login + sudo หากคุณต้องการป้อนเพียงครั้งเดียวลองsudo โดยไม่ใช้รหัสผ่าน (ไม่แนะนำ) <- โปรดอ่านความคิดเห็น Boldewyn

ข้อได้เปรียบหลักคือ "ssh" ไม่ต้องการพารามิเตอร์อื่น ๆ (เช่น -t) และ sudo ถูกบังคับทางฝั่งเซิร์ฟเวอร์ นอกจากนี้เมื่อออกจากสคริปต์ผู้ใช้จะถูกล็อกเอาต์เช่นกัน

มันอาจจะไม่สง่างาม แต่มันง่ายและใช้งานได้


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

@Boldewyn: ใช่การตั้งค่า "sudo ไม่มีรหัสผ่าน" มีความเสี่ยงด้านความปลอดภัยที่ ... มันเป็นขั้นตอนที่ไม่จำเป็น ฉันเห็นด้วยกับคุณถ้า SSH สามารถนำการตรวจสอบกลับมาใช้ใหม่ได้ไม่จำเป็นต้องมี "การแก้ปัญหา" ประเภทนี้ ขอบคุณสำหรับความคิดเห็นของคุณ
lepe

-1

คุณสามารถเรียกใช้คำสั่งต่อไปนี้รับการเข้าถึงรูทโดยไม่มีการโต้ตอบ:

ssh server " sudo command" < sudopassword.txt

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