Web端ssh客户端Sshwifty

Web端ssh客户端Sshwifty

Scroll Down

就不扯一堆优点啥的了,因为也真没感觉有多大用处,就是好玩~

安装

官方提供有准备好的容器镜像,可以直接使用docker根据官方镜像创建一个sshwifty服务(都2021年了不会还有人不会用docker吧)

# 官方配置文件例子,默认不用修改,如果有定制化需求可以手动更改并使用"-v 选项"挂载到容器中

# "SharedKey"是首次进入web的密码,如果开启了TSL好像不用输入了
# "ListenInterface"是监听地址
# "ListenPort"是监听端口

cat sshwifty.conf.example.json
{
  "HostName": "",
  "SharedKey": "WEB_ACCESS_PASSWORD",
  "DialTimeout": 5,
  "Socks5": "",
  "Socks5User": "",
  "Socks5Password": "",
  "Servers": [
    {
      "ListenInterface": "127.0.0.1",
      "ListenPort": 8182,
      "InitialTimeout": 3,
      "ReadTimeout": 60,
      "WriteTimeout": 60,
      "HeartbeatTimeout": 20,
      "ReadDelay": 10,
      "WriteDelay": 10,
      "TLSCertificateFile": "",
      "TLSCertificateKeyFile": ""
    }
  ]
}

# 生成 sshwifty 内部使用的TLS证书文件
openssl req \
  -newkey rsa:4096 -nodes -keyout domain.key -x509 -days 90 -out domain.crt


# 运行sshwifty容器,如果有定制化需求,将更改的配置文件重命名为sshwifty.conf.json

# 并挂载到容器中以下任一地址即可
# "/home/sshwifty/.config/sshwifty.conf.json", "/etc/sshwifty.conf.json", "/sshwifty.conf.json"

docker run --detach \
  --restart always \
  --publish 8182:8182 \
  --env SSHWIFTY_DOCKER_TLSCERT="$(cat domain.crt)" \
  --env SSHWIFTY_DOCKER_TLSCERTKEY="$(cat domain.key)" \
  --name sshwifty \
  niruix/sshwifty:latest

使用nginx反向代理并使用ssl域名解析

准备好域名,解析到对应服务器或者负载均衡上,我这里直接解析到后端服务器了,然后在后端机器上的nginx创建该域名的配置文件,如下所示:

sudo vim /etc/nginx/ssh.conf

# added for socket error
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

server {

    server_name ssh.xxx.xxx;

    client_max_body_size 1024m;

    location / {

        # added for socket error
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $connection_upgrade;        

        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 代理到本地https地址
        proxy_pass https://127.0.0.1:8182/;
    }

}

map $http_upgrade $connection_upgrade { default upgrade; '' close; }
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

这三行是为了解决报错Unable to connect to the Sshwifty backend server: WebSocket Error (1006)而添加的。

domain-sshwifty-socket-error

随后nginx平滑加载新的配置

nginx -t
nginx -s reload

我是使用的certbot申请的ssl证书,随后就可以基于https:域名访问web ssh客户端了

问题解决:

1、
Unable to authenticate: TypeError: Cannot read property 'importKey' of undefined

这个问题,主要是新的Chrome和Chromium内核浏览器,已经不支持非SSL的加密传输在SSH上,所以解决方法:

将sshwifty的 URL改为https,即需要有一个ssl证书

2、
Unable to connect to the Sshwifty backend server: WebSocket Error (1006)

这个一般出现在成功反向代理sshwifty后,需要连接本地终端时,解决办法就是修改反向代理的文件,nginx的配置文件可参考上述部分,主要是以下三行配置,注意位置不要放错

map $http_upgrade $connection_upgrade { default upgrade; '' close; }


proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

参考:

1、在Linux服务器上安装Web SSH--SSHwifty的部署和使用

2、SSHwifty项目地址

3、官方Demo