Remmina 无法通过tls连接服务器

今天遇到一个很奇怪的问题,我在本地装了一台win10的虚拟机,可以直接通过快速链接栏链接rdp,但服务器不可以,报错,不知为何。甚至那台win10的虚拟机可以正常连接服务器。

快速链接栏

搜索了很多,最后在stackoverflow上看见一个回答[1]说是把高级里的negotiation改成TLS,试了试,并不行,于是抱着死马当活马医的态度,又试了试其它的选项,修改为RDP,很顺利的连上了。

就结果来讲,我推测是系统版本的原因,服务器是windows server,比较旧,虚拟机的RDP是官方的,肯定做了兼容,这样就解释通了

node调取打印机dll输出乱码

背景介绍

最近公司接了一个景区的项目,好巧不巧的分给我一个打票的功能。

过程

这有什么难的呀?

客户有一个一直在运行的系统,我去看了看,就是做一个网页然后预览,调用系统打印。

我求你当个人吧

客户提了一个需求,点击打印直接打印,不要什么预览确认,还要一定要B-S程序,也就是说只能使用IE的ActiveX调用dll。

这个时候我们的讨论结果是:没问题,框架支持IE,我可以用ActiveX开发。

我可求你当个人吧x2

是的你们没有猜错,现代框架哪还有兼容IE ActiveX的。只能用node在本地跑一个websocket server,于是只能重写了,因为涉及到一些高度的计算方法,要重写还挺麻烦的,我采用了一个取巧的方法:node直接接收指令打印,算法依旧在web端完成。

问题出现了

dll提供的似乎是按照GBK进行的解码,所以打印出来全是乱码,也就是说我们要转换一下编码再发送给打印机。

解决方案

iconv库,可以将已知编码转换为另一种编码,此处将UTF-8转换为GBK

如何远程连接wamp环境下的MySQL

开放端口会导致安全问题,因此,请保证只用于debug或开发环境

相信各位都知道,MySQL远程访问需要新建账户,例如


grant all on example_db.* on "example_user"@"%" identified by "your password";
flush privileges;

所以导致无法访问的罪魁祸首不是mysql,是windows防火墙,我们需要使用下列操作步骤来开放3306端口。

搜索->防火墙->高级安全 Windows Defender 防火墙->入站规则

新建规则->端口->放行3306

wordpress HTTPS修正

前文:迁移wordpress到HTTPS

前文提到,使用docker部署,因为前后https模式不同步(前面是https后面是http://ip:port)导致需要修改配置文件,所以我决定把wordpress从docker迁移出来,因为docker挂载目录的其实就是wordpress本体在的位置


server {
  listen  443;
  server_name wpdev.endercaster.lan;#记得改掉
 #SSL证书配置参照前文
  root /opt/wordpress;#记得改掉
  location / {
      try_files $uri $uri/ /index.php?$is_args$args; #这里需要注意一下,不要少打
      index index.php;
  }
  # 这里替换为:在设置->固定连接->改为任意一个非朴素型
  #location ~ ^/wp-json/ {
  #    rewrite ^/wp-json/(.*?)$ /?rest_route=/$1 last;
  #}
  location ~ \.php$ {
        fastcgi_pass unix:/run/php/wp-test.sock;
        include fastcgi.conf;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

然后把前文中wp-config.php加的代码都删掉。

配置php-fpm,如果只有这一个项目,可以把上面的fastcgi_pass改掉,跳过这步


[wordpress]#从www改为wordpress
user = www-data
group = www-data
listen = /run/php/wp-test.sock
listen.mode = 0666


# 重启php-fpm
systemctl restart php7.2-fpm
#现在可以重新读取nginx配置文件了
nginx -t 
# 如果上面的输出是successful的话
systemctl reload nginx

然后登录查看工具->站点健康,看看有没有少一些依赖,给它装上。

至此,我的站点终于完美的迁移到https啦!

PHP文件无读写权限

平台:CentOS + nginx + php-fpm

首先说明出现场景:权限修改为777依旧提示没有权限/文件未找到

解决方案:


setenforce 0
# [/your/path/here] 支持正则表达式写法,想要递归的话请使用正则表达式 [/your/path/here(/.*)?]
semanage fcontext -a -t httpd_sys_rw_content_t [/your/path/here]
# 或
semanage fcontext -m -t httpd_sys_rw_content_t [/your/path/here]
restorecon
setenforce 1

事情是这样的,客户的服务器是CentOS,我上传图片的时候需要先存本地然后上传到云,测试站测没问题,预发布站出问题了(因为是新系统,预发布站和生产站这个时候都部署好了),我当时就惊了。

第一件事想到的就是权限问题,于是检查一下:
drwxrwxrwx
?????????小老弟你怎么回事
总之之后通过修改代码的方式定位到了是在复制文件的时候没有成功从/tmp复制到项目文件夹下,这个时候我已经怀疑是有其他权限控制这里了(是的,当时并没想到selinux,平常没接触过这层),但是时间比较紧急,所以先去确认了一下生产站上传功能是否正常,结果是正常的,这时候我就很迷惑,因为预发布和测试站结果不同很合理,毕竟操作系统和服务器(apache/nginx)都不一样,但是预发布和线上站应该是一样的啊?(作为开发人员我的原则是不碰线上站的东西,所以没见过线上站的服务器,结果它还真【此处自主规制】不一样,太打脸了)
由于线上没有问题,这个问题就先告一段落了

本来想着反正部署本来就不是我的活,就算了,然后上班路上突然想起来一件事:结合vmware的共享文件夹功能是不是可以实现windows下开发,生产环境调试?于是我准备了一个laravel项目,在虚拟机上打开共享,考虑到在Centos上踩过坑,系统就选用的CentOS 8,安装nginx+php-fpm,配置好之后,很好,访问404,查看nginx日志显示 *16 stat() “/mnt/hgfs/workspace/laravel/public/favicon.ico” failed (13: Permission denied) ,这个没跑了,肯定是权限问题,chmod,chown一气呵成,刷新网页一看,很好,根本没有效果,于是把代码文件复制到虚拟机磁盘上,修改配置文件重启nginx,至少php解析没问题了,但是提示写日志失败,没有权限,那就给权限呗,于是从455到777试了一遍还是不行,不行咋整啊?上网搜吧,转了一圈,基本都是在说权限没给够,都777了肯定不是权限没给够了,然后我看到了一篇文件无法写入的文[1],提到了selinux,我记得这是一个独立的权限系统,那事情就简单了,百度:selinux 配置

先看到了怎么配置关闭,我信了你的邪,我去服务器上还能把selinux关了是咋的,走你,下一个。

之后是selinux配置说明[2],很长,看到那个fcontext的命令,我就知道怎么整了 ,但是得有理有据是不是,比如那个-t后面的参数是怎么来的?

再之后看到了以Apache举例配置selinux的[3],都是服务器软件,理论上是一样的,既然能看进程的selinux context,那就好说了


ps -eZ | grep php
# 可以看到context是httpd_t
# 既然可以查看selinux 开放的端口列表,应该可以查看上下文列表吧,于是我试了一下
semanage fcontext --list
# 的确,输出了好多东西,我来找一下看看
semanage fcontext --list | grep :httpd_
# 出现了很多context,命名很有规则,可以看到httpd_sys_rw_content_t应该就是我想要的了
# httpd所属 rw权限
# 如果还没有context的话,添加
semanage fcontext -a -t httpd_sys_rw_content_t '/opt/endercaster/laravel(/.*)?'
# 如果有context的话,修改
semanage fcontext -m -t httpd_sys_rw_content_t '/opt/endercaster/laravel(/.*)?'
# 然后让设置立即生效
restorecon /opt/endercaster/laravel
# 记得确认一下
ls -Z /opt/endercaster/laravel

等等,刚才的vmhgfs的问题是不是也是这个导致的?于是我采用了最简单暴力的方法:把selinux关掉(编辑/etc/selinux/config)事实证明真的是selinux的问题,但是vmware共享不能修改标签……

你以为还有下文?至此两个问题都已经解决了。是的,都解决了

部署不会用vmware共享文件夹,而不用共享文件夹的selinux设置已经解决了。

而使用vmware共享文件夹做环境测试只需要关闭selinux即可。

[1] linux下文件权限777了,file_put_contents()却不能写入,为什么?

[2]如何配置selinux

[3]SELinux中Apache的配置

bilibili视频批量下载

!important 本文以讲述原理为主,不发布可直接执行的代码

由于经常出现我今天看了第二天视频就没了的情况,所以特别喜欢的视频我都会down下来保存到本地,当然三连给up是肯定的,网上已经有不少可以直接下载的插件了(特别是chrome插件,但是批量下载还是得手动来。

所以我们先来了解一下怎么手动下载B站视频

此处以我的一个视频为例(gank钓鱼网站)原料如下

  • Google Chrome/Firefox(PC端)
  • aria2c (是的,下载怎么能少了它呢
  • curl
  • 代码执行环境(如cmd/powershell/bash

首先打开页面,按F12打开调试窗口,刷新(因为我需要用到sources中的内容,不刷新通常拦截不到)此时打开“网络”选项卡,你会看见密密麻麻的一堆网络请求地址,像下面这样

网络请求

先排除掉资源文件,比如字体,css,js,因为视频音频数据基本不可能存在这些文件中,所以可疑的数据就只剩下两条了:那两个m4s的xhr请求(就是我们平常说的ajax请求)

接下来要做什么已经显而易见了,打开“源”选项卡,找到这个页面

看见这个index了吗?点它,这就是当前页面的源文件(并非你看到的这个页面,因为你看到的这个页面是经过js和css处理过的),顺便按一下左下角的大括号,美化代码,ctrl+f搜索刚才看见的那两个m4s,可以发现他们在一个__playinfo__的json里

第一次找到的时候我其实是很震惊的,B站这个播放器的音频和视频是分开的,这两条url也就是我们要找的下载地址了

你以为这就结束了?没有!

直接使用aria2c 下载会报错,用curl查看提示403forbidden,既然B站下载可以,那我们让请求参数更像B站的下载请求就行了啊,这里直接说结果:加上–refer参数,refer是指你在哪个页面请求的这个地址,对应的是网络请求的header中的refer,所以完整的命令是

aria2c –refer=’base_url’ ‘video/audio url’

至此,手动下载的部分说完了,下面的内容就简单很多了

批量下载适用于解放手工劳动的,如果批量也这么下那可太麻烦了,批量下载一般会在程序中直接下载,甚至连视频音频的合并都做了,但是我懒(

于是我采用的是类似于爬虫的思路,只爬取url,使用url生成下载命令并保存为文件,当前的批量下载针对多个分p的,分p的获取在查看源那一步搜索分P标题就可以找到一个名为 __INITIAL_STATE__ 的json,分p在pages数组里,其它参数这里暂时用不到

b站视频播放的url有一个p参数,就是分p序号,所以我们令max=len(pages),来循环获取每一p的url(p=i+1),把生成的command写到文件中就万事大吉了

为了方便区分文件内容,来认识一下aria2c的-o参数,指的是下载文件名,在生成下载命令的时候带上这个参数能够让文件更便于区分。

那么这篇文章到此结束,欢迎来B站找我@EnderCaster

编译安装ss-qt5

OS: Ubuntu Desktop 18.04

相关wiki:


sudo apt-get update
#环境
#如果下面编译报错请使用apt-cache search 来查找相似名称的包
sudo apt-get install \
    cmake\
    qtbase5-dev\
    libqrencode-dev\
    libzbar-dev\
    libappindicator1\
    git\
    libbotan-2-dev

OPT_BASE=~
OPT_BASE=${OPT_BASE}/opt
mkdir ${OPT_BASE}
cd ${OPT_BASE}
#编译libshadowsocksqt5
git clone https://github.com/shadowsocks/libQtShadowsocks
cd libQtShadowsocks
git checkout stable
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j4
sudo make install
#编译shadowsocks-qt5
cd ${OPT_BASE}
git clone https://github.com/shadowsocks/shadowsocks-qt5
cd shadowsocks-qt5
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j4
sudo make install

Chrome地址栏默认不再是自动补全

首先说明一点,这是个feature,相信找到这的都觉得这不是什么好东西,所以我们来关了它

原地址

As Harwin & PlasticIssue points out, to avoid this issue, one can go to chrome://flags/#omnibox-drive-suggestions

and set that “Omnibox Google Drive Document suggestions” flag to Disabled.

What is Google thinking, is this about increasing search ad profits at the expense of usability?

上文中给出了一个Chrome设置的地址,点击之后会进入设置页面,同时需要改的那一项会被标黄

如同这位老哥吐槽的一样,Google为什么会想到这么个东西,好影响体验啊

eclipse自动补全失效

好久没用eclipse写项目了(真的很久,这次下载的eclipse自动补全特别难用,一开始以为是以前遇到的那个xml和dtd下载不下来的问题,然后尝试修复之后并不是。

后来查找到这篇文章

eclipse可真的太过分了,居然改了默认快捷键

在keys绑定中修改以下快捷键:word Completion快捷键改回 ctl+alt+/,

Word Completion : alt + / -> ctrl + alt + /
Content Assitant : crtl + space -> alt + /

这样就还原以往的使用方法了

本地Gitlab QQ邮箱配置

因为官网没有给普通QQ邮箱的相关配置信息,昨天折腾了好一阵子,现在把配置过程记录在这里

以前因为设置太麻烦,也不太用的上,就一直没有配置,最近有时间了,想折腾一下,按照官网的文档进行了一下测试。

QQ邮箱需要在配置里开启pop3/smtp或者imap/smtp服务,详细开启方法参照QQ邮箱

这时QQ邮箱方面的设置就已经完成了,接下来配置gitlab,修改gitlab配置文件:/etc/gitlab/gitlab.rb,以下相关字段在设置文件中均已存在,直接修改=后面的值即可


## Email Settings
gitlab_rails["gitlab_email_from"] ="example@qq.com"
gitlab_rails['gitlab_email_display_name']="EnderCaster"
gitlab_rails['gitlab_email_reply_to']="example@qq.com"

##  SMTP Settings
gitlab_rails['smtp_enable']=true
gitlab_rails['smtp_address']="smtp.qq.com"
gitlab_rails['smtp_port']=465
gitlab_rails['smtp_user_name']="example@qq.com" # 此处和上面必须一致
gitlab_rails['smtp_password']="0123456789ABCDEF" # 这里输入你的授权码,注意,四组授权码之间并没有空格
gitlab_rails['smtp_domain']="smtp.qq.com"
gitlab_rails['smtp_authentication']="login"
gitlab_rails['smtp_enable_starttls_auto']=true
gitlab_rails['smtp_tls']=true

之后需要执行重新配置:


gitlab-ctl reconfigure