0%

记录一次使用关于通过netcat工具连接socket的问题吧

环境

本地环境
win10 企业版(2019-1206安装,奇怪不应该是专业版吗,而且我没重装系统呀,难道是上次注册表的问题?): 
netcat: v1.12 NT
jdk: 1.8.0_112
正式环境
ubuntu: 16.04.6
netcat: OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
jdk: 1.8.0_201-b09 

在写连接设备程序时,用到了

1
2
String sb = bufferedReader.readLine()
...

程序直接部署上去,结果一夜过后发现几个T的容量直接沾满了,导致数据库挂掉了。于是查看一下是因为此程序的log写满了,觉着奇怪。删掉日志文件,重新启动,日志也没有飞速增加。
但是,当我使用ubuntu的nc工具连接然后断开时,发现几乎以满IO的速度写入日志。发现 bufferedReader.readLine() 不断的获取到null,然后空指针异常填满了日志。于是程序改成了

1
2
3
while ((line = bufferedReader.readLine()) != null) {
...
}

这样改了之后,日志确实不会继续增加了,但是发现一个新的问题,每断开一个连接,cpu就会占满一个核,使用top命令发现%CPU指数基本为(断开次数*100%),于是发现是 nc 工具ctrl+c后不会关闭socket的问题。
因为我外部还套了一层循环,但是在windows使用nc测试时,如果断开连接则会抛出异常Connection reset,从而跳出循环。也就不存在什么资源占用的问题。但是ubuntu的nc命令,断开连接后,socket 仍然未关闭,可以不断的重新连接,然后while true readline。
查看了外套的循环的作用,发现基本是while true,可能是怕读取到空值后,断开连接,于是加了层循环,若读取到null后,重新获取inputstream继续readline,找了相关资料,socket发送null,基本就是等于断开连接了。于是删除此外套的循环,问题解决。

Windows 开始菜单问题

起因:

今天由于昨天关机后自动重启,无法关机,查了下原因
可能是系统故障导致关机失败重启

解决方法一:

右键我的电脑,点击启动与故障恢复的设置,然后取消系统失败时自动重新启动的选项。

a.png

这个方法有那么点掩耳盗铃的味道,于是我不答应。
打开了 windows 的事件查看器,类似如下log,之前的被覆盖了。
b.log

1
2
3
4
5
计算机-默认 权限设置并未向在应用程序容器 Microsoft.Windows.Cortana_1.10.7.17134_neutral_neutral_cw5n1h2txyewy SID (S-1-15-2-1861897761-1695161497-2927542615-642690995-327840285-2659745135-2630312742)中运行的地址 LocalHost (使用 LRPC) 中的用户 D7\illus SID (S-1-5-21-1456052483-2504874860-2005770065-1001)授予针对 CLSID 为 
{D63B10C5-BB46-4990-A94F-E40B9D520160}
、APPID 为
{9CA88EE3-ACB7-47C8-AFC4-AB702511C276}
的 COM 服务器应用程序的 本地 激活 权限。此安全权限可以使用组件服务管理工具进行修改。

找了许久,要通过组件服务,修改权限才行。
c.png
但是呢,权限是灰色的,因此又找了许久,要通过注册表修改才能获取到此完全控制权限。由于注册表的权限也不能直接修改,需要将所有者由 TrustedInstaller 改成 当前用户才能进行修改。

修改了所有者之后,赋予完全控制权限

修改 RuntimeBroker 的启动和激活权限为默认。而默认值是在下方改的

编辑默认值,组件服务,右键我的电脑-属性,然后编辑默认值
添加Network Service角色为所有权限

结果重启后,又出问题了,开始菜单打开后无法搜索,设置以及左侧按钮均无法点击,EDGE也是秒退

于是找呀找呀,
试过

1
2
3
管理员
Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation -like "*SystemApps*"} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
sfc /scannow

也试过

1
2
任务管理器运行
$manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + '\AppxManifest.xml' ; Add-AppxPackage -DisableDevelopmentMode -Register $manifest

以及好多好多,均无作用。
最后倒入了很久之前的注册表,已经刚出问题时的注册表,导入时还都报错(访问注册表时出错),重启莫名好了。奇怪

后来设置为默认值重现了一次,后续改成自定义,打补丁,导入最新注册表都没用。只能导入以前的注册表才生效了

  1. 获取脚本的目录
    SHELL_FOLDER=$(dirname $(readlink -f “$0”))
    SHELL_FOLDER=$(cd “$(dirname “$0”)”;pwd)
  2. 检测目录是否存在,不存在则创建
    if [ ! -d “$1” ];then
    mkdir $1
    fi

-f : 文件
-d : 目录

  1. nohup(包括但不限于) 中0,1,2意义:
    文件描述符:
    0: 标准输入(stdin)
    1: 标准输出(stdout)
    2: 标准错误输出(stderr)
    command > file 将输出重定向到 file。
    command < file 将输入重定向到 file。
    command >> file 将输出以追加的方式重定向到 file。
    n > file 将文件描述符为 n 的文件重定向到 file。
    n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
    n >& m 将输出文件 m 和 n 合并。
    n <& m 将输入文件 m 和 n 合并。
    << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。