ฉันสามารถบอก SSH ให้ส่งข้อมูลหลังจากกด Enter หรือแท็บแล้วไม่ใช่หลังจากกดปุ่มแต่ละปุ่มได้หรือไม่
ฉันสามารถบอก SSH ให้ส่งข้อมูลหลังจากกด Enter หรือแท็บแล้วไม่ใช่หลังจากกดปุ่มแต่ละปุ่มได้หรือไม่
คำตอบ:
ไม่เพราะ SSH ไม่มีทางรู้ว่าสิ่งที่คุณกำลังพิมพ์จะต้องมีการป้อนหรือแท็บเพื่อดำเนินการ - ถ้าคุณพยายามที่จะผ่านประวัติศาสตร์คำสั่งของคุณตัวอย่างเช่น^R
ลูกศรขึ้นหรือลงจะไม่ถูกส่งโดย ตัวเองและนั่นจะเป็น ... ไม่เป็นที่พอใจ
คุณไม่ต้องรอระหว่างอักขระแต่ละตัวเพื่อให้ปรากฏบนหน้าจอ ถ้าคุณรู้ว่าคุณต้องพิมพ์อะไรทุบมันให้เร็วที่สุดและเทอร์มินัลจะรอเวลาไปกลับในเวลาประมาณหนึ่งรอบเมื่อคุณหยุดพิมพ์ซึ่งเป็นเรื่องที่ดีเท่าที่คุณจะทำได้ การตั้งค่า line-buffered ต่อไป (การสูญหายของแพ็กเก็ตนั้นแตกต่างกัน
PuTTY เสนอคุณสมบัติสองอย่างที่อาจมีการใช้งาน: "local echo" และ "local line editing" การแก้ไขบรรทัดภายในจะบัฟเฟอร์ทุกอย่างและส่งไปยังเซิร์ฟเวอร์หลังจากส่งคืนบรรทัดเท่านั้น ที่สามารถทำให้บรรทัดคำสั่งจัดการได้ง่ายขึ้น แต่มันอาจทำให้การใช้เท็กซ์เอดิเตอร์เป็นไปได้ด้วย
PuTTY ยังมีตัวเลือกอื่น ๆ สำหรับการเปิด / ปิดการใช้งานบางอย่าง (อัลกอริทึมของ Nagle) ที่อาจส่งผลต่อเวลาในการเชื่อมต่อการรับรู้ อย่างที่ฉันเห็นลูกค้า OpenSSH ไม่ได้นำเสนอฟีเจอร์ทั้งหมดที่ PuTTY ทำในเรื่องนี้และฉันไม่รู้ทางเลือก Linux ที่เปรียบเทียบ
มิฉะนั้น womble มันถูกต้อง
Moshถูกออกแบบมาเพื่อแก้ไขปัญหาที่แน่นอนนี้ มันถูกออกแบบมาสำหรับการใช้งานผ่านการเชื่อมต่อที่มีความล่าช้าสูงและไม่น่าเชื่อถือและให้การแก้ไขเสียงก้องและสายภายในเครื่อง
เปิดเซสชัน ssh ด้วยssh host.example.org bash
(หรือเชลล์ใด ๆ ที่คุณต้องการใช้)
คุณจะได้รับโหมด line-buffered ไปที่เปลือกระยะไกลซึ่งหมายความว่าคุณจะไม่ได้รับพรอมต์และการแก้ไขบรรทัด แต่คุณจะได้รับเสียงสะท้อนในท้องถิ่นและโหมด "หนึ่งบรรทัดต่อครั้ง" บางครั้งมันมีประโยชน์เมื่อทำงานกับการเชื่อมต่อที่ไม่ดีมาก ไม่ใช่ว่าทุกโปรแกรมจะทำงานได้อย่างถูกต้องเพราะคุณจะไม่มี pseudo-tty แต่ยูทิลิตี้ UNIX ส่วนใหญ่ก็ใช้งานได้ดี
ปรับปรุง:
เมื่อใช้เคล็ดลับข้างต้นคุณจะได้รับการแก้ไขเส้นปกติ ( ReadLine ) ที่ท้องถิ่นท้ายโดยใช้โปรแกรมที่เรียกว่าเสื้อคลุมสะดวกrlfe rlfe ssh host.example.org bash
วิ่งเพียง
มีปัญหาเดียวกัน ( latency สูงและการสูญเสียแพ็กเก็ตเนื่องจากคุณภาพของข้อมูลมือถือแย่มากในบางพื้นที่) และmoshไม่ตัดมันสำหรับฉัน (มันต้องการโปรแกรมพิเศษสำหรับโฮสต์ที่อยู่ห่างไกลทั้งหมด, แก้ไข UTF8 ในพื้นที่และจากระยะไกลบนเซิร์ฟเวอร์ทั้งหมด การปรับเปลี่ยนทั้งหมดไฟร์วอลล์ - และมันไม่ได้โดดให้สายท้องถิ่นแก้ไขแล้ว) ฉันได้ตัดสินใจที่จะเขียนกระดาษห่อขนาดเล็กเพื่อให้สายท้องถิ่นโหมดสำหรับ SSH
ตามค่าเริ่มต้นมันแค่ส่งทุกอย่างไปที่ ssh ในโหมด char-by-char เริ่มต้น แต่คุณสามารถกดปุ่มฮอตคีย์เพื่อเข้าสู่โหมดแก้ไขบรรทัดท้องถิ่นที่ขับเคลื่อนด้วย readline ได้ตลอดเวลา ดังนั้นคุณสามารถป้อน (ทั้งการแก้ไขการเรียกคืนคำสั่ง ฯลฯ ) ทั้งหมดในเครื่องแล้วเมื่อคุณกดEnterมันจะถูกส่งเป็นหนึ่งแพ็คเก็ต TCP ไปยังด้านระยะไกล
ข้อได้เปรียบคือการแก้ไขบรรทัดคำสั่งที่ล้าหลัง (เช่น telnet สุก / canonical "โหมดบัฟเฟอร์แบบบรรทัดต่อบรรทัด" แต่มีคำสั่งแก้ไขที่เหนือกว่าที่ให้โดยGNU readline ) นอกจากนี้ไม่จำเป็นต้องมีการเปลี่ยนแปลงบนเซิร์ฟเวอร์หรือไฟร์วอลล์ และบรรณาธิการและโปรแกรมอื่น ๆ ที่อิงกับคำสาปยังคงทำงานได้ตามปกติ (แม้ว่าจะมีความล่าช้า) ในโหมด char-by-char เริ่มต้นเช่นเดียวกับการเชื่อมต่อ ssh ปกติ
ข้อเสียคือคุณต้องกดปุ่มลัดเพื่อเข้าสู่โหมดการแก้ไขสายท้องถิ่นทุกครั้งที่คุณต้องการหรือคุณจำเป็นต้องปรับเปลี่ยนพรอมต์บนรีโมตโฮสต์เพื่อให้สามารถตรวจจับอัตโนมัติได้ นอกจากนี้การเติมชื่อไฟล์ของแท็บระยะไกลในปัจจุบันสามารถใช้งานได้โดยการวางคุณกลับไปที่โหมด char-by-char (หรือใช้ระบบไฟล์ในตัวเครื่องแทนที่จะเป็นชื่อไฟล์ระยะไกล แม้ว่าจะอยู่ในระหว่างดำเนินการดังนั้นขอให้ดึงคำขอหรือแนวคิดที่ใช้การได้เพื่อการปรับปรุงยินดีต้อนรับ!
ข้อได้เปรียบไม่เพียง แต่เชลล์ของคุณ (และการแก้ไขบรรทัด) เป็นแบบโลคัลและปราศจากความล่าช้า แต่ยังให้คุณสามารถนำทางระบบไฟล์ระยะไกลและใช้การเติมชื่อไฟล์เชลล์ ( คีย์แท็บ ) สำหรับไฟล์รีโมต นอกจากนี้ (ฟีเจอร์ที่ดีที่สุดของ IMHO) คุณสามารถใช้ตัวแก้ไขในพื้นที่ที่คุณต้องการสำหรับการแก้ไขไฟล์รีโมต
ข้อเสียคือ (โดยเฉพาะถ้าคุณเชื่อมโยงเป็นแบนด์วิธต่ำและไม่เพียง แต่แฝงสูง) ซึ่งสำหรับแต่ละไฟล์ที่จะแก้ไขมันจะต้องถูกถ่ายโอนไปยัง localhost อย่างเต็มที่แล้วหลังจากแก้ไข SSHFS จัดเตรียมการแคช (ดูที่ตัวเลือก sshfs (1) แคช , cache_timeout , cache_x_timeout ) เพื่อบรรเทาปัญหาดังกล่าว นอกจากนี้หากคุณต้องการที่จะดำเนินการบางอย่างในระยะไกลคุณต้องใช้หน้าจออื่นหรือคำนำหน้าคำสั่งทั้งหมดด้วย " ssh remotehost " (ตัวอย่างssh remotehost sudo service apache restart
) ดูตัวเลือกControlMasterในssh_config (5)เพื่อทำให้เร็วขึ้นในการดำเนินการ (และไม่มีการแจ้งรหัสผ่าน)
คุณสามารถเลียนแบบพฤติกรรมนั้นได้หากคุณเพียงแค่เรียกใช้คำสั่งโดยทำ
ผู้ใช้ ssh @ targetmachine 'คำสั่งของฉันในสตริง'
แต่,
ssh-agent
หรือพิมพ์รหัสผ่านในคุณสามารถใช้ 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\'
นี่คือสิ่งที่คุณต้องการ คุณต้องติดตั้งทั้งไคลเอนต์และเซิร์ฟเวอร์และ OpenSSH upstream จะไม่นำการเปลี่ยนแปลงมาใช้ https://github.com/hyc/OpenSSH-LINEMODE