เอาท์พุท SSH ไม่บัฟเฟอร์บรรทัด?


35

ฉันกำลังเรียกใช้สคริปต์บนเครื่องระยะไกลเช่นนี้:

ssh $host "pip install -r /path/to/requirements.txt"

แต่ผลลัพธ์ไม่ใช่บรรทัดที่บัฟเฟอร์ แทนที่จะเห็นการส่งคืนครั้งละหนึ่งบรรทัดทุกบรรทัด (~ 10) จะถูกพิมพ์ทั้งหมดพร้อมกันเมื่อการเชื่อมต่อสิ้นสุดลง

เกิดอะไรขึ้นกับสิ่งนี้? มีวิธีใดที่จะบังคับให้พวกเขาเป็นบัฟเฟอร์บรรทัด?

(เช่นในการระบุชัดเจน: เมื่อฉัน ssh เข้า$hostและเรียกใช้คำสั่ง“ ด้วยตนเอง” ผลลัพธ์จะถูกบัฟเฟอร์บรรทัดตามที่คาดไว้

คำตอบ:


45

ใช้ssh -t ...เพื่อบังคับใช้การจัดสรรหลอก (ซึ่งเป็นสิ่งที่คุณได้รับเมื่อคุณเข้าสู่ระบบตามปกติผ่าน ssh)


ไม่ได้ช่วยโชคไม่ดี นี่อาจเป็นปัญหากับ MTU แต่ก็ไม่ได้ช่วยอะไร
Nick Roz

ดูความคิดเห็นของ Magnus ด้านล่างอ้างอิงโดยใช้-tt- มันใช้ได้กับฉันเมื่อ -t ไม่ได้
Tom Dalton

23

หากต้องการขยายคำตอบของ Ryan Fox นิดหน่อย: หลาย ๆ โปรแกรม (ส่วนใหญ่ - เป็นค่าเริ่มต้นสำหรับโปรแกรม C) line-buffer stdout เมื่อพวกเขากำลังพูดกับเทอร์มินัล (มาตรฐาน C ระบุว่า stdout นั้นถูกบัฟเฟอร์ในตอนแรกเมื่อ "สามารถพิจารณาได้ว่าจะไม่อ้างถึงอุปกรณ์แบบโต้ตอบ")

ดังนั้นสิ่งที่คุณเห็นคือผลลัพธ์ของโปรแกรมที่คุณกำลังเรียกใช้จากระยะไกล (ตามที่กำหนดไว้กับ stdout) ไม่ได้ถูกบัฟเฟอร์บรรทัด ssh เพิ่งผ่านสิ่งที่ได้รับเมื่อได้รับมา (ฉันคิดว่า ssh จริง ๆ แล้วไม่มีบัฟเฟอร์ในผลลัพธ์ - นั่นจะเป็นวิธีที่วิเศษที่สุดเพื่อให้แน่ใจว่าผู้ใช้เห็นสิ่งที่โปรแกรมระยะไกลมีไว้)


ผู้ใช้ที่ไม่ระบุชื่อแนะนำว่า stdout ได้รับการบัฟเฟอร์อย่างสมบูรณ์ไม่ใช่บัฟเฟอร์บรรทัด
Michael Mrozek

Dave Vandervies ได้บอกฉันว่าเขาเป็นคนที่แก้ไขและบอกว่ามันถูกต้อง (เช่น stdout นั้นถูกบัฟเฟอร์ในขั้นต้นเต็มแล้วไม่ใช่บัฟเฟอร์แถว)
David Wolever

6

หากต้องการขยายคำตอบของ Ryan Fox ให้กว้างขึ้นssh -tก็ไม่ได้ผลสำหรับฉันเช่นssh -ttกัน ดูหน้าคน ssh เกี่ยวกับ -t:

อ็อพชัน -t หลายตัวบังคับให้จัดสรร tty แม้ว่า ssh จะไม่มี tty โลคัล

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