grep 带星号的文件名 返回了意外的结果

grep filename[asterisk] returns unexpected result [1]

1
2
3
4
5
$ ls
file1.txt file2.txt 'file*.txt'

$ ls | grep file*.txt
无输出

在执行grep命令之前,*先被 shell expanded 了,所以实际执行的命令是ls | grep file1.txt file2.txt 'file*.txt'

就变成了在 file2.txt 和 ‘file*.txt’ 中查找 ‘file1.txt’ 这个文本,而因为已经有文件输入,ls 的管道被忽略了

验证

1
2
3
echo 'no file1.txt' > file2.txt
$ ls | grep file*.txt
file2.txt:no file1.txt

所以,如果想只查找 ‘file*.txt’,则可以加引号

1
2
$ ls | grep '*.txt'
file*.txt

如果想使用其正则功能,则需要加上 -E

1
2
3
4
$ ls | grep -E '*.txt'
file1.txt
file2.txt
file*.txt

  1. https://stackoverflow.com/questions/20473441/grep-filenameasterisk-returns-unexpected-result ↩︎

测试连接失败

DNS 污染导致域名解析有问题,写 Hosts 可破

1
2
3
4
5
6
vim /etc/hosts

// 我只加了这两条,可以依据自身网络状况继续添加

54.230.62.121 api.themoviedb.org
13.266.238.82 api.themoviedb.org

搜索不到涩涩内容

尽管已经在账户设置中开启搜索结果中包含成人内容,但那只影响页面搜索

Video Staion 使用的 API 中并未实现

所以我们修改源码

1
2
3
4
5
6
7
8
9
vim /var/packages/VideoStation/target/plugins/syno_themoviedb/util_themoviedb.py

# _get_movie_search_data 中添加 include_adult=true 影响电影的搜索

url = constant.THEMOVIEDB_URL + 'search/movie?include_adult=true&api_key=' + api_key + '&query=' + nameEncode + '& language=' + \

# _get_tv_search_data 中添加 include_adult=true 影响剧集的搜索

url = constant.THEMOVIEDB_URL + "search/tv?include_adult=true&api_key=" + api_key + '&query=' + \

好耶!涩涩!

https://api.themoviedb.org/3/search/tv?api_key=xxx&query=Shoujo%20Sect&include_adult=true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"page": 1,
"results": [
{
"backdrop_path": "/9EWPzs6KSgZwOvWD8plkcWQjeh0.jpg",
"first_air_date": "2008-07-25",
"genre_ids": [
16
],
"id": 45473,
"name": "Shoujo Sect: Innocent Lovers",
"origin_country": [
"JP"
],
"original_language": "ja",
"original_name": "少女セクト ~Innocent Lovers~",
"overview": "Handa Shinobu and Naitou Momoko have known each other since childhood. Shinobu fell in love with Momoko from the day they first met. Now in high school, Momoko has forgotten about the past, but Shinobu has not. Both follow their own paths but Shinbobu still hopes for Momoko to remember the promise they made long ago.",
"popularity": 4.103,
"poster_path": "/jGpFhasLjo75ZjNrg1OAGs31UEP.jpg",
"vote_average": 7,
"vote_count": 1
}
],
"total_pages": 1,
"total_results": 1
}

关于 SSH Aruba AC 提示 port 22:2: Too many authentication failures

添加选项 IdentitiesOnly=yes

1
ssh -o IdentitiesOnly=yes xxx

It works!

被 JavaScript 的 Promise 折磨了两三天后,终于有所收获,故此记录

实现在 Selenium WebDriver 中,封装一个实用函数,同时 wait until located & visible 并返回 the fisrt visible element,并保持 thenable,极大兼容性了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
driver.find = function (locator, timeout = 30000) {
return this.findElement(async () => {
return Promise.any(await this.wait(until.elementsLocated(locator), timeout).then((elements) => {
return elements.map(element => this.wait(until.elementIsVisible(element), timeout));
}));
});
}


describe('Wait & Click the first visible element', () => {
it('usage', async () => {
await driver.get('a-RHEL-nginx-index.html');
await driver.find(By.xpath("//div[@class='logos']/a").click();
});
}

NOTE

  • find() 并不是一个 async function,不然返回的是一个 Promise,需要进一步 await,无法 then 链式
  • 使用 findElement() 替我们返回了一个 WebElementPromise,WebElementPromise 才有 then(),才能 thenable [1]
  • Promise.any() 是个好东西,但方法依然是实验性的,尚未被所有的浏览器完全支持。它当前处于 TC39 第四阶段草案 [2],希望正式了之后能在 selenium-webdriver/lib/promise.js [3] 中封装一个 promise.any()
  • wait until 好像只能在这里,没有 async function 不能用 await,也不能在执行的时候它还是个 Promise {}

XXX

JavaScript 的 async, promise, await 快赶上 C 的指针了,真的头大


  1. https://github.com/SeleniumHQ/selenium/blob/944aad294d14a13345ebaf0e64df3aa68218521f/javascript/node/selenium-webdriver/lib/webdriver.js#L2402 ↩︎

  2. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/any ↩︎

  3. https://github.com/SeleniumHQ/selenium/blob/944aad294d14a13345ebaf0e64df3aa68218521f/javascript/node/selenium-webdriver/lib/promise.js ↩︎

Versions

  • 个人改造

个人一直以来用的 Inconsolata 版本是一个好多年前的祖传版本,中间经过许多人个性定制,单双引号也早就变成了竖直的,后续又手动补充了 Powerline 系列字符,base 的版本已经不可考

  • 官方版本

https://fonts.google.com/specimen/Inconsolata

https://github.com/googlefonts/inconsolata

目前已经更新到 3.000,已经内置了更多的字符,包括 Braille Patterns(盲文), Geometric Shapes, Box Drawing, Block Elements 等,可以让你的 tui 更加炫酷,如 btop++ 等的进度条和统计图的显示

但似乎迟迟不添加 Powerline,也是迷惑

新版本还添加了对 ligatures 的支持,可以理解为连字,比如 >= 变成占一个字符的真正的大于等于号,=>, === 等也有变形,这个版本的字体叫 Ligconsolata

  • InconsolataDz & Inconsolata-g

https://leonardo-m.livejournal.com/77079.html

早期的对官方 Inconsolata 的著名修改版,因为官方版长期不更新。主要修改包括,把单双引号变直;把点和逗号变得更明显;把加斜杠的 0 变成加点的 0;把 ^ 变得更宽等

但也很久没有更新了,没有现在这些乱七八糟字体的支持,也没有 Powerline

  • Inconsolata for Powerline

Powerline 是啥不用多说,官方放出了许多 patched 好的各种字体,其中也包括 Inconsolata, Inconsolata-g, InconsolataDz, 都命名为Inconsolata xxx for Powerline

优点自然是支持 Powerline 字符了,左右小三角啦,branch 图标啦

缺点就是官方 patched 基于的 Inconsolata 字体也是比较老的,不会随 googlefonts 的更新,自然也没有后续字符的加入

  • 个人再定制

https://github.com/powerline/fontpatcher

Powerline 的项目中也带了一个 fontpatcher,基于 FontForge。但装起来麻烦,个人推荐另一款,可以 docker

Nerd Fonts

https://www.nerdfonts.com/

https://github.com/ryanoasis/nerd-fonts#font-patcher

提供docker pull nerdfonts/patcher免去安装 FontForge 的麻烦

通过docker run --rm -v ~/myfont/patchme:/in -v ~/myfont/patched:/out nerdfonts/patcher执行

常用参数有

1
2
3
4
5
     --mono: 代码用字体,mono 少不了
-c: 我全都要.jpg
--careful: Do not overwrite existing glyphs if detected
-w: 增强 Windows 兼容性,Limit the internal font name to 31 characters (for Windows compatibility)
--powerline: --啥就添啥

是目前用得最爽的一款 fontpatcher,让 Inconsolata 焕发新生!

一个程序员 = 一把键盘: HHKB + 一款字体: Inconsolata + 一套配色: Molokia

1
2
curl 'wttr.in?format=3'
Beijing, China: ☀️ +5°C

OS 差异

  • macOS

macOS 上使用 iTerm2,字体安装的话很方便,可以brew install font-inconsolata,其中的 inconsolata 是随 googlefonts 比较新的,inconsolata-for-powerline 等是上面提到的其它 repo 的比较旧的。

iTerm2 的 Powerline 支持可以直接,Preference > Profiles > Text,勾上 Use built-in Powerline glyphs,省去自己打 Inconsolata 补丁的麻烦。

macOS 还是适合程序员啊!

  • Windows

Windows 上就比较麻烦,需要先给 Inconsolata 打补丁以支持 Powerline 字符。nerdfonts 打出来的字体没有被标记为 fixed-width,所以默认不会被 SecureCRT 承认,需要修改 Global.ini,位置详见 SecureCRT 的 Global Options > Configuration Paths,修改 Allow Proportional Fonts 那行的值为 00000001,重新打开 SecureCRT 即可

关于Linux上DST,饥荒,Don’t Starve Together MOD打不上,不下载的问题

因为dedicated_server_mods_setup.lua内容会被重置

如果使用的的是别人写的run_dedicated_servers.sh

其中

1
./steamcmd.sh +force_install_dir "$install_dir" +login anonymous +app_update 343050 validate +quit

在validate之后会重置dedicated_server_mods_setup.lua的内容,所以dst读不到

所以可以在steam更新及验证之后,dontstarve_dedicated_server_nullrenderer_x64启动之前,加上一句

1
2
#备份一下你的dedicated_server_mods_setup.lua
cp -f "$HOME/dedicated_server_mods_setup.lua" "$install_dir/mods"

SMI-S 模拟器

网上的水的论文不少,实际项目没看到,于是搞了一下,希望能有所参考

tog-pegasus

yum源里也有rpm,但release版隐藏我们需要的一个功能开关,这里我们自己编译

https://github.com/OpenPegasus/OpenPegasus

采用了rpmbuild方式,同时做了一些修改

  • tog-pegasus.spec: Version+1
  • tog-pegasus.spec: PEGASUS_REPOSITORY_DIR/PEGASUS_VARDATA_CACHE_DIR 移到了postun,否则yum remove时会报一堆repository找不到
  • rpm/wbem-redhat => rpm/wbem: 这个是pam验证的,根据自己系统的情况修改,装完再改/etc/pam.d/wbem也行
  • env_var_Linux.status: PEGASUS_USE_RELEASE_CONFIG_OPTIONS=false 以启用repositoryIsDefaultInstanceProvider等配置项

准备好tar.gz和相关重命名,然后编译rpmbuild -bb tog-pegasus.spec,rpm在rpmbuild/RPMS下,然后使用yum localinstall xxx安装

/etc/Pegasus/access.conf,wbemNetwork中去掉了root,禁止root账号远程登录

yum完跑以下命令

1
2
3
4
5
6
7
8
9
10
/usr/share/Pegasus/scripts/genOpenPegasusSSLCerts           // 生成证书
cimserver // 先开启一下进行一些配置
cimconfig -s enableHttpConnection=true -p // 启用HTTP
cimconfig -s repositoryIsDefaultInstanceProvider=true -p // 关键!省去了我们写Provider
cimconfig -s enableAuthentication=true -p // 开启认证登录
cimserver -s // 关闭重开以生效
useradd -g pegasus smissim // PAM登录的话,走的就是系统的账号
// 把要登录的账号放到pegasus组,相关组配置在access.conf
passwd smissim // 来个密码
cimserver // 启动

Class & Instance

由于开启了repositoryIsDefaultInstanceProvider,使得我们可以不用编写Provider,而对Class具有Create / Get / Enumerate操作

相关说明和更多配置见项目的doc/BuildAndReleaseOptions.html

instance以xxx.idx和xxx.instances文件的方法在于在[namespace]/instances/下

添加时只需cimmof -n[namespace] -aEV xxx.mof

提示没有相关qualifiers就去其它namespace下copy一堆来

Tips

给想进一步写Provider的一些tips

  • provider只能注册在PEGASUS_INTEROP_NAMESPACE下,一般可能为: root/PG_InterOp 或者 root/interop 或者 interop

所以要注意注册provider时的cimmof -n参数

  • create出来的instance都是浮云

REF http://cvs.opengroup.org/pegasus-doc/CIMProvider.html

virtual void initialize(CIMOMHandle & cimom) = 0
Performs any setup required before normal operation of the provider.
The initialize() function allows the provider to conduct the necessary preparations to handle requests. The initialize function is called only once during the lifetime of the provider. Note, however, that with the Pegasus automatic unload function enabled, a provider many be unloaded and loaded many times during one cycle of the CIMOM. This function must complete before the CIM server invokes any other function of the provider, other than terminate.

virtual void terminate(void) = 0
Performs any cleanup required before termination.
The terminate function allows the provider to conduct the necessary preparations for termination. This function may be called by the CIM Server at any time, including initialization. Once invoked, no other provider functions are invoked until after a call to initialize.

如果你create出来的东西没有存在什么地方,provider.so是会被随时unload再load的,所以_instances中的实例不是持久的

可以参考在项目在SDK/samples/Providers/DefaultC++/InstanceProvider中给出的例子

因为initialize方法总是会在其它方法调用前执行

Linux下

1
2
3
4
5
6
7
8
9
10
11
wmic -U [user]%[pass] //[IP] "select Name,PNPDeviceID from Win32_VideoController"
DeviceID|Name|PNPDeviceID
VideoController1|NVIDIA GeForce GTX 1660 SUPER|PCI\VEN_10DE&DEV_21C4&SUBSYS_13D310B0&REV_A1\4&945BE43&0&00E6
VideoController2|NVIDIA GeForce GTX 1660 SUPER|PCI\VEN_10DE&DEV_21C4&SUBSYS_13D310B0&REV_A1\4&20EA873F&0&00E4
VideoController3|NVIDIA GeForce RTX 3080|PCI\VEN_10DE&DEV_2206&SUBSYS_404B1458&REV_A1\4&3081E79F&0&00E3
VideoController4|NVIDIA GeForce GTX 1660 SUPER|PCI\VEN_10DE&DEV_21C4&SUBSYS_13D310B0&REV_A1\4&D1659EC&0&00E2
VideoController5|NVIDIA GeForce GTX 1660 SUPER|PCI\VEN_10DE&DEV_21C4&SUBSYS_13D310B0&REV_A1\4&121866D4&0&00E0
VideoController6|NVIDIA GeForce RTX 3080|PCI\VEN_10DE&DEV_2206&SUBSYS_404B1458&REV_A1\4&651A21D&0&00E7
VideoController7|NVIDIA GeForce RTX 3080|PCI\VEN_10DE&DEV_2206&SUBSYS_404B1458&REV_A1\4&2810674&0&00E1
VideoController8|Intel(R) HD Graphics|PCI\VEN_8086&DEV_0402&SUBSYS_04028086&REV_06\3&11583659&0&10
VideoController9|NVIDIA GeForce RTX 3080|PCI\VEN_10DE&DEV_2206&SUBSYS_404B1458&REV_A1\4&34528348&0&00E5

通过wmic采集Win32_VideoController的PNPDeviceID

我们关注VEN_10DE&DEV_21C4&SUBSYS_13D310B0这部分

  • VEN_XXXX,这四位是Vendor ID,10DE 表示 NVIDIA Corporation
  • DEV_XXXX,这四位是Device ID,21C4 表示 TU116 [GeForce GTX 1660 SUPER]

参考: https://devicehunt.com/view/type/pci/vendor/10DE

  • SUBSYS_XXXXYYYY中,YYYY这四位是制造商Vendor ID,10B0 表示 Gainward Technology Int’l Limited

参考: https://pcisig.com/membership/member-companies?combine=10B0

GPU-Z的Subvendor查询也是依赖于此

顺便也把PCI-SIG上的数据抓了一份,方便大家使用

pcisig.csv

Linux Fuck Windows

开一个Linux监控Windows系列的大坑

先从不同版本的winexe搞起

Winexe 0.80

这里选择的代码是 https://github.com/greenbone/openvas-smb

原因是最近还有在更新

1
[/root/test/openvas-smb-21.4.0/winexe/winexe.c:90:parse_args()] winexe version 0.80

编译

分别记录一下Fedora和CentOS7两种系统下的编译过程

搞了两套是因为

  • CentOS7的EPEL源移除了mingw相关的包
  • 在Fedora上编译完之后要迁往CentOS7,要同时迁移N多依赖,也很不方便

先说一下共有问题

No package ‘heimdal-gssapi’ found

dnf/yum出来的heimdal-devel不支持pkgconfig,后续许多操作都很麻烦,建议按下面的方法自己先compile一个

https://community.greenbone.net/t/full-gvm-11-build-guide-for-centos-8/5425

1
2
3
4
5
6
7
./configure --enable-otp=no --prefix=/opt/heimdal
make && make install

echo "/opt/heimdal/lib" > /etc/ld.so.conf.d/heimdal-xxx.conf
ldconfig

export PKG_CONFIG_PATH=/opt/heimdal/lib/pkgconfig

ld -ltspi

ld问题参考 https://www.hbspy.moe/2021/06/07/ld_cannot_find/

1
ln -s /usr/lib64/libtspi.so.1 /usr/lib64/libtspi.so

Fedora 编译

mingw can no longer be found in the Centos 7 EPEL Repository See bugzilla.redhat.com/show_bug.cgi?id=1807975 and pagure.io/fesco/issue/2333

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
yum install gcc cmake pkg-config mingw64-gcc gnutls-devel \
perl-base popt-devel glib2-devel \
libunistring-devel krb5-devel

yum install mingw32-gcc-c++ \
mingw32-gcc \
mingw32-pthreads \
mingw32-w32api \
mingw32-binutils \
mingw32-runtime \
mingw32-filesystem \
mingw32-cpp \
mingw32-dlfcn-static

mkdir build
cd build
cmake ..
make && make install

https://wiki.videolan.org/Win32Compile_Under_Fedora/

CentOS7 编译

CentOS7多一个popt的问题,类似heimdal,也是yum出来的包不支持pkgconfig

参照heimdal的处理自己先compile一个

1
2
3
4
5
6
7
8
./autogen.sh
./configure --prefix=/opt/popt
make && make install

echo "/opt/popt/lib/" > /etc/ld.so.conf.d/popt.conf
ldconfig

export PKG_CONFIG_PATH=/opt/popt/lib/pkgconfig

主要需要搞定mingw的问题

这里分享一个可用的repo: https://copr.fedorainfracloud.org/coprs/alonid/mingw-epel7/

使用的时候需要只enable它,yum install --disablerepo=* --enablerepo=mingw-epel7 xxx

常见问题

NT_STATUS_IO_TIMEOUT

  1. 一种可能是0.80似乎只支持SBMv1

smb1protocol

https://docs.microsoft.com/zh-cn/windows-server/storage/file-server/troubleshoot/detect-enable-and-disable-smbv1-v2-v3

顺便分享一些远程安装启用的命令

是在Windows下使用的

首先利用SysinternalsSuite包中提供的PsExec拉Dism,用WMIC process call create应该也行

NOTE 这里加了/NoRestart,主要是由于Dism提供的重启不够强力,可能造成卡住

后面用WMIC shutdown -r -f强制重启

1
2
.\PsExec.exe \\[IP] -u [user] -p [passwd] Dism /online /Enable-Feature /FeatureName:smb1protocol /NoRestart /ALL
wmic /node:[IP] /user:[user] /password:[passwd] process call create "shutdown -r -f -t 0"
  1. 另一种可能的原因是防火墙

可以查看目前网络配置文件是公用还是专用。如果是公用,进一步查看是否开启了公用网络的防火墙

可以考虑直接切换到专用,关闭或配置专用网络的防火墙规则

本机上的system32目录内容与winexe cmd.exe dir出来的不一致

这是一个32-bit/64-bit问题

winexe新一点的版本会有[–ostype=0|1|2]选项,来指定x86/x64

可以通过echo %programfiles%看判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:\Windows\system32>echo %programfiles%
echo %programfiles%
C:\Program Files (x86)

C:\Windows\system32>dir nv*

2020/10/13 16:40 5,972,824 nvapi.dll
2020/10/13 16:42 4,174,064 nvcuda.dll
2020/10/13 16:42 6,860,184 nvcuvid.dll
2020/10/13 16:42 657,304 nvEncodeAPI.dll
2020/10/13 16:42 1,585,560 NvFBC.dll
2020/10/13 16:43 1,161,112 NvIFR.dll
2020/10/13 16:43 555,248 NvIFROpenGL.dll
2020/10/13 16:43 543,128 nvofapi.dll
8 21,509,424
0 ¼ 55,284,584,448

这里%programfiles%会被认为是 (x86)

没有nvidia-smi.exe

我们可以直接拉"c:\windows\sysnative\cmd.exe"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C:\Windows\system32>echo %programfiles%
echo %programfiles%
C:\Program Files

C:\Windows\system32>dir nv*

2020/10/13 16:41 7,001,536 nvapi64.dll
2020/10/13 16:42 5,519,600 nvcpl.dll
2020/10/13 16:42 2,508,528 nvcuda.dll
2020/10/13 16:42 7,707,544 nvcuvid.dll
2020/10/13 16:42 445,848 nvdebugdump.exe
2020/10/13 16:42 813,464 nvEncodeAPI64.dll
2020/10/13 16:43 2,098,072 NvFBC64.dll
2020/10/13 16:43 589,208 nvidia-smi.exe
2020/10/13 16:43 1,507,224 NvIFR64.dll
2020/10/13 16:43 670,616 NvIFROpenGL.dll
2020/10/01 15:14 80,930 nvinfo.pb
2020/10/13 16:43 816,368 nvmcumd.dll
2020/10/13 16:43 1,023,216 nvml.dll
2020/10/13 16:43 673,520 nvofapi64.dll
14 31,455,674
0 ¼ 55,284,584,448

这样就正常了

参考 https://ss64.com/nt/syntax-64bit.html

LD 找不到 -l问题的统一解决

/usr/bin/ld: cannot find -l
collect2: error: ld returned 1 exit status

1
ld -l<xxx> --verbose

/usr/bin/ld: cannot find -lhdb

1
2
3
4
5
6
7
8
9
ld -lhdb --verbose
...
attempt to open /usr/lib64/libhdb.so failed
attempt to open /usr/lib64/libhdb.a failed
attempt to open /usr/local/lib64/libhdb.so failed
attempt to open /usr/local/lib64/libhdb.a failed
attempt to open /lib64/libhdb.so failed
attempt to open /lib64/libhdb.a failed
...

可以看到ld在尝试从哪些地方寻找所需的文件

然后就方面通过文件名判断该安装什么包或者做软连接

1
2
3
4
5
6
locate libhdb
/usr/lib64/heimdal/libhdb.a
/usr/lib64/heimdal/libhdb.so
/usr/lib64/heimdal/libhdb.so.9
/usr/lib64/heimdal/libhdb.so.9.2.0
ln -s /usr/lib64/heimdal/libhdb.so /usr/lib64/libhdb.so
0%