ฉันต้องเขียนเป็นแบบ ssh wrapper สคริปต์ที่ท้องเส้นการแก้ไข. มันเป็น invoked เหมือนๆกันกับริการ ssh. สำหรับตัวอย่าง: python3 sshwrapper.py [email protected] -CX
. ปัญหาก็คือตอนที่ฉันเชื่อมต่อให้เป็นคอมพิวเตอร์ปลายทางการใช้สคริปต์นี้และใช้ vim
หรือ tmux
มีบางอย่างถังขยะเป็นกตีพิมพ์ ปัญหานี้ไม่ได้เจาะจงให้บริการ ssh ตั้งแต่ปัญหาก็ปรากฏตอนที่ฉันใช้สคริปต์นี้ต้องห่อ bash
แทนที่จะเป็น ssh
.
ตัวอย่าง:
หลังจากเริ่ม
tmux
บางถังขยะเป็นกพิมพ์หลังจากคนตบให้แจ้งเตือน:abc@me:~$ ^[[?65;1;9c
เมื่อมีการเปิดแฟ้มใหม่ใน Vim ใช้
vim mynewfile.txt
นี่ดูเหมือนบนเส้นแรกของกรอบ:^[[2;2R^[[>65;6003;1c^[]10;rgb:0000/0000/0000^G^[]11;rgb:ffff/ffff/dddd^G
ยังไงฉันแก้ไขปัญหา?
นี่เป็นสคริปต์อยู่ในคำถาม:
import os
import pty
import select
import signal
import subprocess
import sys
master_fd, slave_fd = pty.openpty()
process = subprocess.Popen(['ssh'] + sys.argv[1:],
stdin=slave_fd,
stdout=slave_fd,
stderr=subprocess.STDOUT,
# Important for Ctrl-c in the remote terminal.
preexec_fn=os.setsid)
def sigint_handler(_signum, _frame):
os.write(master_fd, b'\03') # Send Ctrl-c.
signal.signal(signal.SIGINT, sigint_handler)
def sigtstp_handler(_signum, _frame):
os.write(master_fd, b'\x1A') # Send Ctrl-z.
signal.signal(signal.SIGTSTP, sigtstp_handler)
def sigchld_handler(_signum, _frame):
process.wait()
sys.exit(process.returncode)
signal.signal(signal.SIGCHLD, sigchld_handler)
while process.poll() is None:
# Block until there is something to read or write.
r, w, e = select.select([sys.stdin, master_fd], [], [])
if sys.stdin in r:
# Write to SSH.
user_input = os.read(sys.stdin.fileno(), 4096)
if not user_input:
os.write(master_fd, b'\04') # Send Ctrl-d.
else:
os.write(master_fd, user_input)
if master_fd in r:
# Read from SSH.
data = os.read(master_fd, 4096)
sys.stdout.write(data.decode())
sys.stdout.flush()
ฉันใช้ไพธอน 3.8.10 บ Ubuntu 20.04 บทั้งสองของฉันท้องถิ่นคอมพิวเตอร์และทางไกลบนเครื่องคอมพิวเตอร์ นี่เป็นตัวการศึกษาโครงการดังนั้นฉันเขียนโปรแกรมโดยใช้ไพธอนมาตรฐานบรรณารักษ์เท่านั้น
export LS_COLORS=none
ไม่มีลูกเล่นสถานการณ์ก่อน