ไม่มี TTY ในขณะที่รันคำสั่งผ่าน SSH ในเอกสารนี้


10

ฉันพยายามเรียกใช้คำสั่ง SSH แบบนี้ในเอกสารที่นี่:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

ซึ่งทำงานได้ตามปกติยกเว้นเมื่อฉันพยายามเรียกใช้บางสิ่งที่ต้องการอินพุตเช่นรหัสผ่านสำหรับ sudo ในกรณีนั้นฉันได้รับข้อความต่อไปนี้:

sudo: no tty present and no askpass program specified

ฉันรู้ว่าฉันสามารถใช้การ-tตั้งค่าสถานะใน SSH เพื่อจัดสรรหลอกแบบนี้:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

และมันจะใช้งานได้ แต่เมื่อฉันลองแบบเดียวกันกับเอกสารที่นี่มันใช้งานไม่ได้และฉันจะได้รับข้อผิดพลาดเดียวกันเกี่ยวกับการไม่มี tty อยู่:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

มีความคิดใดบ้างที่ฉันสามารถทำงานนี้ได้?

นอกจากนี้ในกรณีที่คุณสงสัยว่าทำไมฉันต้องการให้มันทำงานกับเอกสารที่นี่แทนที่จะส่งมันผ่านบรรทัดเดียวกันมันเป็นเพราะคำสั่งอินพุต (อาจมีไม่กี่อัน) มาจากไฟล์การกำหนดค่าที่อ่านโดยสคริปต์ และฉันได้ยินว่ามันหลีกเลี่ยงปัญหาในการหลีกเลี่ยงคำสั่งสำหรับคำพูดคำพูดคู่ ฯลฯ

คำตอบ:


6

ใช้visudoเพื่อแก้ไขไฟล์ sudoers และแทรกบรรทัดด้านล่าง:

Defaults:<user>    !requiretty

ไม่ตอบว่าทำไมการใช้ssh -t "something" versus ssh -t <<STOP something STOPไม่ทำงาน สมมติว่าฉันไม่ได้ใช้ sudo แต่ฉันใช้ passwd สำหรับผู้ใช้ของฉันโดยตรงฉันยังไม่ได้รับ TTY โดยใช้ heredoc

พยายามssh -t -tบังคับการจัดสรรหลอกแม้ว่า stdin ไม่ใช่เทอร์มินัล


ขอบคุณฉันเคยเห็นการแก้ไขนี้ที่อื่น แต่มันจะไปรอบ ๆ ปัญหาสำหรับคำสั่งที่ใช้ sudo ไม่ตอบว่าทำไมการใช้ ssh -t "บางอย่าง" กับ ssh -t << STOP สิ่งที่ STOP ไม่ทำงาน สมมติว่าฉันไม่ได้ใช้ sudo แต่ฉันใช้ passwd สำหรับผู้ใช้ของฉันโดยตรงฉันยังไม่ได้รับ TTY โดยใช้ heredoc
lpfavreau

ฉันอัพเดตคำตอบแล้ว
ควอนตั้ม

1

ทำไมไม่เพียงเก็บเอกสารที่นี่ในตัวแปรที่จะได้รับssh -tเป็นอาร์กิวเมนต์คำสั่ง

บนบันทึกทั่วไปเพิ่มเติมให้ใช้ssh -Tหรือระบุรีโมตเชลล์เป็นอาร์กิวเมนต์คำสั่งหาก stdin ของรีโมตโฮสต์ถูกเปลี่ยนทิศทางจาก heredoc (เพื่อป้องกันไม่ให้sshพยายามจัดสรร pty)

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.