এই সমস্যায় সম্প্রতি দৌড়ানোর পরে (অন্য কোনও উপায়ে: ভিম একটি রিমোট সার্ভারে চলছে এবং আমি স্ক্রিনটি ভুলে গেছি), আমি উপায় খুঁজে বের করার সিদ্ধান্ত নিয়েছি।
প্রথম ধারণাটি ছিল ভিম দ্বারা ব্যবহৃত ফাইল বর্ণনাকারীদের সন্ধান এবং এটিতে লেখার চেষ্টা করা। ভিমের এফডিএস টার্মিনাল এমুলেটর দ্বারা খোলার psedoterminal এর দিকে ইঙ্গিত করেছে, স্বাভাবিকভাবেই যথেষ্ট:
$ ls -l /proc/$(pgrep -n vim)/fd/
total 0
lrwx------ 1 muru muru 64 Nov 17 01:25 0 -> /dev/pts/14
lrwx------ 1 muru muru 64 Nov 17 01:25 1 -> /dev/pts/14
lrwx------ 1 muru muru 64 Nov 17 01:25 2 -> /dev/pts/14
lrwx------ 1 muru muru 64 Nov 17 01:25 3 -> socket:[99564312]
তবে, আমার প্রাথমিক কয়েকটি প্রচেষ্টা ব্যর্থ হয়েছে:
echo '^[:wq^M' > /proc/$(pgrep -n vim)/fd/0
echo ':wq^M' > /proc/$(pgrep -n vim)/fd/0
echo ':wq^M' > /proc/$(pgrep -n vim)/fd/0
echo '^C' > /proc/$(pgrep -n vim)/fd/0
printf "%s" '^[:wqa!^M' > /proc/$(pgrep -n vim)/fd/0
^[
এবং ^M
দ্বারা প্রাপ্ত হয় CtrlVEscএবং CtrlVEnterযথাক্রমে।
তারা সকলে ফলাফলগুলি টার্মিনালে প্রদর্শিত হয়েছিল (দূরবর্তী সেশনে এটি প্রয়োগ করার আগে আমি স্থানীয়ভাবে এটি পরীক্ষা করে দেখছিলাম)। আশেপাশে গুগল করে, আমি সিওডোটারমিনাল ডিভাইসে লেখার জন্য পাইথন ব্যবহার করে এই এসও পোস্টটি পেয়েছি :
#!/usr/bin/python
import sys,os,fcntl,termios
if len(sys.argv) != 3:
sys.stderr.write("usage: ttyexec.py tty command\n")
sys.exit(1)
fd = os.open("/dev/" + sys.argv[1], os.O_RDWR)
cmd=sys.argv[2]
for i in range(len(cmd)):
fcntl.ioctl(fd, termios.TIOCSTI, cmd[i])
fcntl.ioctl(fd, termios.TIOCSTI, '\n')
os.close(fd)
এবং এটি একটি ইন্টারেক্টিভ পাইথন শেল দিয়ে চেষ্টা করে দেখেছে:
$ sudo python3
Python 3.5.0 (default, Sep 20 2015, 11:28:25)
[GCC 5.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, fcntl, termios
>>> fd = os.open('/dev/pts/14', os.O_RDWR)
>>> a = '\033:wqa!\n'
>>> for i in a: fcntl.ioctl(fd, termios.TIOCSTI, i);
...
b'\x1b'
b':'
b'w'
b'q'
b'a'
b'!'
b'\n'
>>>
সম্পন্ন!