xterm.js 使用相同的 PWD 重新连接

xterm.js reconnect with same PWD

我在我的网络项目中使用 xterm.js 在网页上有一个终端。每次由于客户端的互联网波动而导致套接字连接中断时,我刷新页面或重新连接套接字时。当前 PWD 目录丢失,它落入指定的 CWD 目录,在我的例子中是用户主目录。所以我又得在我工作的地方做 cd。

在页面刷新或套接字断开连接之前,我如何连接并保持上次使用的 PWD?

我尝试的其中一件事是存储术语对象并在重新连接时通过同一对象连接(如果它已经存在)。不删除 WebSocket 断开连接中的进程和对象。

var http = require('http');
var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
var pty = require('node-pty');
var cors = require('cors');
app.use(cors());
app.options('*', cors());
var terminals = {}; //global terminals

function getUser(token) {
    return new Promise((resolve, reject) => {
      try {
        return http.get({
            host: '',
            path: '',
            headers: {'token': token}
        }, function(response) {
            // Continuously update stream with data
            var body = '';
            response.on('data', function(d) {
                body += d;
            });
            response.on('end', function() {
                return resolve(JSON.parse(body));
            });
        });
      } catch (err) {
        console.log('Api failed');
        console.log(err);
        reject;
      }
    })
}

app.ws('/terminals/:user_id', function (ws, req) {
  try {
    getUser(req.params.user_id) /* cheking with api if user exist in my database*/
      .then(user_info => {
        if(terminals[parseInt(req.params.user_id)]){
          var term = terminals[parseInt(req.params.user_id)];
        }else {
          var term = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], {
            name: 'xterm-color',
            cwd: cwd,
            env: process.env
          });
          terminals[parseInt(req.params.user_id)] = term;
        }

        term.on('data', function(data) {
          ws.send(data);
        });

        ws.on('message', function(msg) {
          term.write(msg);
        });

        ws.on('close', function () {
          // process.kill(term.pid);
          // delete terminals[parseInt(req.params.pid)];
          // delete logs[req.params.pid];
        });
      })
      .catch(err => {
      })
  } catch (err) {
      console.log('Terminal webSocket failed');
      console.log(err);
  }
});

app.listen(3000);

这对我不起作用。这让我第一次连接,但当我刷新页面时,终端不连接现有的商店对象。

此外,如果生成的进程被系统杀死但它仍然保留在 javascript 对象中,并且脚本尝试重新连接相同的术语对象,则会失败。

关于如何使用相同的 PWD 重新连接的指南。

详情

OS 版本: Mac OS , xterm.js版本:2.2.3

只需更新服务器

上的~/.bashrc即可轻松解决此问题

~/.bashrc 文件中的两行对我有用

PROMPT_COMMAND+='printf %s "$PWD" > ~/.storepwd'
[ -s ~/.lastdirectory ] && cd `cat ~/.lastdirectory`

参考 Save last working directory on Bash logout