如何访问由其他进程启动的VIM会话?
先给你几个实用的解决方案,都是实际场景里验证过的:
首先第一步,先找到那个VIM进程的PID,用ps命令就能定位:
ps aux | grep "vim file.txt"
记下对应的进程ID(比如假设是1234),接下来试试下面这些方法:
方法1:用reptyr直接接管终端
这是最直接有效的办法,reptyr工具可以把运行中的进程“转移”到你当前的终端会话里。如果系统没装,先安装一下——Debian/Ubuntu系用apt install reptyr,RHEL/CentOS系用yum install reptyr即可。
安装完成后执行:
reptyr 1234
执行完你当前的终端就会直接切换到那个VIM会话,能正常查看或编辑内容了。因为你本身就是user1,权限上完全没问题;如果遇到SELinux报错,临时关闭或者调整下策略就能解决。
方法2:试试VIM的远程控制(看启动参数)
如果root启动VIM的时候碰巧加了--servername参数,那你可以用VIM自带的远程功能连接。先看看有没有可用的VIM服务器:
vim --serverlist
如果能看到对应的服务器名,直接用下面的命令连接过去:
vim --servername <找到的服务器名> --remote
要是没查到服务器名,说明root启动时没开这个功能,直接跳过这个方法就行。
方法3:从进程内存/文件描述符提取内容
如果上面的方法都走不通,你还能直接从VIM进程的内存或打开的文件描述符里读取内容:
- 先进入该进程的fd目录:
cd /proc/1234/fd
这里的数字就是进程打开的文件描述符,你可以逐个用cat查看,比如cat 3(通常对应打开的目标文件),就能看到file.txt的内容。
2. 如果上面的方式不行,直接提取进程内存里的可打印字符串:
strings /proc/1234/mem
你可以搭配grep过滤关键词,比如strings /proc/1234/mem | grep "你需要的内容",快速定位目标信息。
关于交换文件无效的问题
你说杀进程生成交换文件没用,大概率是交换文件的位置不对——VIM的交换文件默认存在root执行su - user1 -c ...命令时的当前目录,不是user1的家目录。你可以全局搜索找找:
find / -name ".file.txt.swp" 2>/dev/null
找到后用vim -r .file.txt.swp就能恢复内容,但前提是进程被正常终止,交换文件生成完整。
内容的提问来源于stack exchange,提问作者user9294444

