มีวิธีหลีกเลี่ยงความล่าช้าในการพิมพ์ SSH หรือไม่


43

ฉันสามารถบอก SSH ให้ส่งข้อมูลหลังจากกด Enter หรือแท็บแล้วไม่ใช่หลังจากกดปุ่มแต่ละปุ่มได้หรือไม่


ฉันสนใจมากที่คุณมีความล่าช้าในการพิมพ์ที่คุณไม่สามารถทำงานได้ ฉันใช้ ssh ในยุคโมเด็มและไม่เคยประสบปัญหาเหล่านี้
mailq

4
ฉันกำลังเข้าถึง SliceHost VPS (USA) จากเบลเยี่ยม ความล่าช้าเป็นสิ่งที่สังเกตได้มากพอที่จะทำให้ฉันสับสน อย่างไรก็ตามฉันได้สังเกตเห็นว่าคนอื่นดูเหมือนจะใส่ใจน้อยกว่าสิ่งนี้ ..
StackedCrooked


@mailq คุณไม่ใช้ 3G ในปี 2019 หรือ sshing จากบ้านในชนบทหรือใต้ดินเป็นเหมือนการทำด้วย dialup
POMATu

คำตอบ:


32

ไม่เพราะ SSH ไม่มีทางรู้ว่าสิ่งที่คุณกำลังพิมพ์จะต้องมีการป้อนหรือแท็บเพื่อดำเนินการ - ถ้าคุณพยายามที่จะผ่านประวัติศาสตร์คำสั่งของคุณตัวอย่างเช่น^Rลูกศรขึ้นหรือลงจะไม่ถูกส่งโดย ตัวเองและนั่นจะเป็น ... ไม่เป็นที่พอใจ

คุณไม่ต้องรอระหว่างอักขระแต่ละตัวเพื่อให้ปรากฏบนหน้าจอ ถ้าคุณรู้ว่าคุณต้องพิมพ์อะไรทุบมันให้เร็วที่สุดและเทอร์มินัลจะรอเวลาไปกลับในเวลาประมาณหนึ่งรอบเมื่อคุณหยุดพิมพ์ซึ่งเป็นเรื่องที่ดีเท่าที่คุณจะทำได้ การตั้งค่า line-buffered ต่อไป (การสูญหายของแพ็กเก็ตนั้นแตกต่างกัน


ฉันสนใจที่จะหาวิธีในการกำหนดมาตรฐานความเร็วการพิมพ์ ssh บนเครื่องหลายเครื่อง ฉันสังเกตเห็นว่าความเร็วสามารถเปลี่ยนแปลงได้มากระหว่างเครื่องที่อยู่ในสถานที่เดียวกันและไม่มีภาระหนัก ทฤษฎีของฉันคือสิ่งนี้เกิดขึ้นโดยเฉพาะอย่างยิ่งกับอินสแตนซ์ขนาดเล็กจาก AWS (เช่นขนาดเล็กหรือขนาดเล็ก)
โซริน

1
ดูกระดาษ Mosh ผู้เขียนได้ทำการเปรียบเทียบmosh.org/#techinfo
user7610

25

PuTTY เสนอคุณสมบัติสองอย่างที่อาจมีการใช้งาน: "local echo" และ "local line editing" การแก้ไขบรรทัดภายในจะบัฟเฟอร์ทุกอย่างและส่งไปยังเซิร์ฟเวอร์หลังจากส่งคืนบรรทัดเท่านั้น ที่สามารถทำให้บรรทัดคำสั่งจัดการได้ง่ายขึ้น แต่มันอาจทำให้การใช้เท็กซ์เอดิเตอร์เป็นไปได้ด้วย

PuTTY ยังมีตัวเลือกอื่น ๆ สำหรับการเปิด / ปิดการใช้งานบางอย่าง (อัลกอริทึมของ Nagle) ที่อาจส่งผลต่อเวลาในการเชื่อมต่อการรับรู้ อย่างที่ฉันเห็นลูกค้า OpenSSH ไม่ได้นำเสนอฟีเจอร์ทั้งหมดที่ PuTTY ทำในเรื่องนี้และฉันไม่รู้ทางเลือก Linux ที่เปรียบเทียบ

มิฉะนั้น womble มันถูกต้อง


นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Freddie Fabregas

ฉันไม่สามารถติดตั้ง PuTTY บน macOS จะมีการเปลี่ยนใหม่
Aero Windwalker

สีโป๊วบนลินุกซ์เป็นความเจ็บปวดเล็กน้อย มันไม่สามารถเชื่อมต่อใหม่โดยอัตโนมัติแสดงกล่องข้อความบางอย่างเมื่อตัดการเชื่อมต่อและฉันต้องเปิดหน้าต่างอีกครั้ง ฉันหวังว่าฉันจะสามารถใช้บางอย่างเช่น kitty หรือ plink.exe บน linux หรือดีกว่าเพียงแค่ปรับแต่ง autossh อย่างใด อุปกรณ์บางอย่างไม่สนับสนุน mosh สรรพสินค้า (ถ้าผมพยายามเข้าถึงบ้าน OpenWRT เราเตอร์ของฉัน)
POMATu

21

Moshถูกออกแบบมาเพื่อแก้ไขปัญหาที่แน่นอนนี้ มันถูกออกแบบมาสำหรับการใช้งานผ่านการเชื่อมต่อที่มีความล่าช้าสูงและไม่น่าเชื่อถือและให้การแก้ไขเสียงก้องและสายภายในเครื่อง


คุณสามารถติดตั้งลงในไดเรกทอรีท้องถิ่นจากแหล่งโดยไม่ต้อง sudo ดูที่ mosh.org ด้วย มันบอกว่า "ไม่มีรหัสสิทธิพิเศษไม่มี daemon คุณไม่จำเป็นต้องเป็น superuser ในการติดตั้งหรือเรียกใช้ Mosh ไคลเอนต์และเซิร์ฟเวอร์นั้นเป็น executables ที่รันโดยผู้ใช้ทั่วไปและมีอายุการใช้งานที่ยาวนานเท่านั้น"
สตีเวนซีโฮเวล

1
เพียงเพื่อทราบ Mosh ไม่ใช่ SSH มันใช้โปรโตคอลที่เป็นกรรมสิทธิ์ของตัวเอง (ฉันไม่มีปัญหากับเรื่องนั้น)
user7610

มันทำงานได้ตั้งแต่เริ่มต้นสำหรับฉันบน Android และเครือข่าย wifi ภายในบ้านที่ไม่ดี มันรู้เกี่ยวกับ readline
tinmarino

9

เปิดเซสชัน ssh ด้วยssh host.example.org bash(หรือเชลล์ใด ๆ ที่คุณต้องการใช้)

คุณจะได้รับโหมด line-buffered ไปที่เปลือกระยะไกลซึ่งหมายความว่าคุณจะไม่ได้รับพรอมต์และการแก้ไขบรรทัด แต่คุณจะได้รับเสียงสะท้อนในท้องถิ่นและโหมด "หนึ่งบรรทัดต่อครั้ง" บางครั้งมันมีประโยชน์เมื่อทำงานกับการเชื่อมต่อที่ไม่ดีมาก ไม่ใช่ว่าทุกโปรแกรมจะทำงานได้อย่างถูกต้องเพราะคุณจะไม่มี pseudo-tty แต่ยูทิลิตี้ UNIX ส่วนใหญ่ก็ใช้งานได้ดี

ปรับปรุง:

เมื่อใช้เคล็ดลับข้างต้นคุณจะได้รับการแก้ไขเส้นปกติ ( ReadLine ) ที่ท้องถิ่นท้ายโดยใช้โปรแกรมที่เรียกว่าเสื้อคลุมสะดวกrlfe rlfe ssh host.example.org bashวิ่งเพียง


1
ฉันพยายามและไม่พบว่ามันใช้งานได้ดีมาก แต่มันก็เจ๋งที่รู้
StackedCrooked

งานนี้เยี่ยมยอดสำหรับฉัน
ทะเลสาบ

6

มีปัญหาเดียวกัน ( latency สูงและการสูญเสียแพ็กเก็ตเนื่องจากคุณภาพของข้อมูลมือถือแย่มากในบางพื้นที่) และmoshไม่ตัดมันสำหรับฉัน (มันต้องการโปรแกรมพิเศษสำหรับโฮสต์ที่อยู่ห่างไกลทั้งหมด, แก้ไข UTF8 ในพื้นที่และจากระยะไกลบนเซิร์ฟเวอร์ทั้งหมด การปรับเปลี่ยนทั้งหมดไฟร์วอลล์ - และมันไม่ได้โดดให้สายท้องถิ่นแก้ไขแล้ว) ฉันได้ตัดสินใจที่จะเขียนกระดาษห่อขนาดเล็กเพื่อให้สายท้องถิ่นโหมดสำหรับ SSH

ตามค่าเริ่มต้นมันแค่ส่งทุกอย่างไปที่ ssh ในโหมด char-by-char เริ่มต้น แต่คุณสามารถกดปุ่มฮอตคีย์เพื่อเข้าสู่โหมดแก้ไขบรรทัดท้องถิ่นที่ขับเคลื่อนด้วย readline ได้ตลอดเวลา ดังนั้นคุณสามารถป้อน (ทั้งการแก้ไขการเรียกคืนคำสั่ง ฯลฯ ) ทั้งหมดในเครื่องแล้วเมื่อคุณกดEnterมันจะถูกส่งเป็นหนึ่งแพ็คเก็ต TCP ไปยังด้านระยะไกล

ข้อได้เปรียบคือการแก้ไขบรรทัดคำสั่งที่ล้าหลัง (เช่น telnet สุก / canonical "โหมดบัฟเฟอร์แบบบรรทัดต่อบรรทัด" แต่มีคำสั่งแก้ไขที่เหนือกว่าที่ให้โดยGNU readline ) นอกจากนี้ไม่จำเป็นต้องมีการเปลี่ยนแปลงบนเซิร์ฟเวอร์หรือไฟร์วอลล์ และบรรณาธิการและโปรแกรมอื่น ๆ ที่อิงกับคำสาปยังคงทำงานได้ตามปกติ (แม้ว่าจะมีความล่าช้า) ในโหมด char-by-char เริ่มต้นเช่นเดียวกับการเชื่อมต่อ ssh ปกติ

ข้อเสียคือคุณต้องกดปุ่มลัดเพื่อเข้าสู่โหมดการแก้ไขสายท้องถิ่นทุกครั้งที่คุณต้องการหรือคุณจำเป็นต้องปรับเปลี่ยนพรอมต์บนรีโมตโฮสต์เพื่อให้สามารถตรวจจับอัตโนมัติได้ นอกจากนี้การเติมชื่อไฟล์ของแท็บระยะไกลในปัจจุบันสามารถใช้งานได้โดยการวางคุณกลับไปที่โหมด char-by-char (หรือใช้ระบบไฟล์ในตัวเครื่องแทนที่จะเป็นชื่อไฟล์ระยะไกล แม้ว่าจะอยู่ในระหว่างดำเนินการดังนั้นขอให้ดึงคำขอหรือแนวคิดที่ใช้การได้เพื่อการปรับปรุงยินดีต้อนรับ!


ในด้านที่ไม่ธรรมดาคุณสามารถใช้SSHFSเพื่อติดตั้งระบบไฟล์ระยะไกลแบบโลคัล

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

ข้อเสียคือ (โดยเฉพาะถ้าคุณเชื่อมโยงเป็นแบนด์วิธต่ำและไม่เพียง แต่แฝงสูง) ซึ่งสำหรับแต่ละไฟล์ที่จะแก้ไขมันจะต้องถูกถ่ายโอนไปยัง localhost อย่างเต็มที่แล้วหลังจากแก้ไข SSHFS จัดเตรียมการแคช (ดูที่ตัวเลือก sshfs (1) แคช , cache_timeout , cache_x_timeout ) เพื่อบรรเทาปัญหาดังกล่าว นอกจากนี้หากคุณต้องการที่จะดำเนินการบางอย่างในระยะไกลคุณต้องใช้หน้าจออื่นหรือคำนำหน้าคำสั่งทั้งหมดด้วย " ssh remotehost " (ตัวอย่างssh remotehost sudo service apache restart) ดูตัวเลือกControlMasterในssh_config (5)เพื่อทำให้เร็วขึ้นในการดำเนินการ (และไม่มีการแจ้งรหัสผ่าน)


3

คุณสามารถเลียนแบบพฤติกรรมนั้นได้หากคุณเพียงแค่เรียกใช้คำสั่งโดยทำ

ผู้ใช้ ssh @ targetmachine 'คำสั่งของฉันในสตริง'

แต่,

  1. สิ่งนี้จะเพิ่มความล่าช้าเพิ่มเติมในการสร้างการเชื่อมต่อ (สามารถบรรเทาได้โดยใช้การเชื่อมต่อแบบ ssh / master )
  2. หากคุณไม่มีรหัสส่วนตัวที่ไม่มีรหัสผ่านคุณจะต้องใช้ssh-agentหรือพิมพ์รหัสผ่านใน
  3. เห็นได้ชัดว่ามันไม่ทำงานหากคุณโต้ตอบกับเมนูหรือแก้ไขไฟล์ ฯลฯ

1

คุณสามารถใช้ tmux เพื่อให้ได้เสียงสะท้อนที่ชัดเจนของการพิมพ์ของคุณ รัน tmux แบบโลคัล หากคุณมี ssh เชลล์ในหนึ่งบานหน้าต่างและเชลล์ภายในในบานหน้าต่างด้านล่างจากนั้นจากบานหน้าต่างภายในคุณสามารถส่งคีย์ไปยังบานหน้าต่างระยะไกล

tmux send-keys -t top 'ls' C-m

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

ในการลัดฉันได้เพิ่มสิ่งนี้ลงใน. bashrc ของฉัน

function ts {
    args=$@
    tmux send-keys -t right "$args" C-m
}

ขอบคุณ Christian Pelczarski สำหรับการอธิบายปุ่มส่ง: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

คุณจะต้องหลบหนีเมื่อใช้คำพูดเช่น

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'

0

นี่คือสิ่งที่คุณต้องการ คุณต้องติดตั้งทั้งไคลเอนต์และเซิร์ฟเวอร์และ OpenSSH upstream จะไม่นำการเปลี่ยนแปลงมาใช้ https://github.com/hyc/OpenSSH-LINEMODE

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