记录下平时遇到的坑

Posted by [Kohn] on Monday, May 8, 2023
Last Modified on Tuesday, January 9, 2024
本文阅读量

1 杂项

  1. 生成base64编码时,不要用echo “text” | base64,因为echo会输出换行符号,最终生成的base64编码其实是”text\n”的编码。需要用echo -n “text” | base64
  2. kubectl apply的时候, 会参考对象的kubectl.kubernetes.io/last-applied-configuration的值, 并且仅对上次apply的值进行修改. 并不是简单的覆盖所有字段. 参考https://kubernetes.io/zh/docs/tasks/manage-kubernetes-objects/declarative-config/
  3. 通过expect(例如二次验证的那个脚本)ssh登录到远程服务器之后, 使用rz命令会出现一个问题, 显示Received, 但是实际上看不到文件. 需要在expect之前加一行export LC_CTYPE=en_US
  4. gorm的AutoMigrate不会修改字段类型(长度变化的会修改)
  5. bash才支持"[[“这种格式, sh不支持. 而很多docker镜像中默认使用的是sh 来执行命令. 需要加一行SHELL ["/bin/bash”, “-c”]或者bash -c包一层来 强制使用bash. 特殊情况是make, 貌似make的原理是先make会生成一个 shell, 然后再执行这个shell. 这样会导致前面的方法失效, 需要hack一下: RUN rm /bin/sh && ln -s /bin/bash /bin/sh
  6. docker push有时候会卡在waiting状态, 也不报错. 可以重启下docker daemon试试

2 二次验证

有些地方可能要求开启二次验证, 每次登录的时候得打开手机查询动态码, 比较麻烦, 可以使用oathtool这个工具来实现动态码, 这样就不需要打开手机了

创建一个脚本:

#!/usr/bin/expect -f
set password “XXXXXX”
set token “TOKENID”
set mfa [exec sh -c "oathtool -b --totp ${token}"]

spawn ssh root@IPADDR
expect {
“MFA auth”
{send “${mfa}\r}
}

interact {
timeout 120 {send “\0}
}

执行这个脚本即可实现ssh到远程机器的时候自动填充验证码

3 makefile

编写makefile的过程中, 大概的流程是makefile会根据构建target对应的构建命 令生成一份类似的shell脚本, 最后逐行执行这个shell脚本. 这里需要注意 的是:

写在makefile的脚本并不是最终执行的脚本, 最终执行的是被makefile做过一次 变量替换后的脚本, 因此变量引用的时候, 得写成$${VAR}, 两个$. 这样渲染过 一次之后变成了${VAR}就对应了shell中的变量引用. 生成的脚本貌似是逐行执 行的, 变量引用和赋值不生效. 解决方法是通过在每一行命令后面加上”; \” 把 多行命令转成一行命令makefile默认会把每一行要执行的shell打出来(set -x), 可以通过在行首加上’@’要求makefile不输出待执行的命令

4 ssh远程执行python2脚本print语句报错

一段python2脚本, 很简单只是执行一行print语句, 但是print的内容中带有中文.

例如: print(u”测试”)

ssh登录到主机之后再运行脚本没有问题, 但是ssh root@host “python test.py”这么执行就会报错:

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 8-20: ordinal not in range(128)

解决方案: print语句会将文本内容传输给tty, 然而ssh执行命令没有默认创建tty. 在不修改python代码的前提下, 解决方法是要么给ssh命令增加-t参数分配tty, 要么增加一个环境变量PYTHONIOENCODING=UTF-8

5 iterm2 输出文本过长时会截断

前阵子遇到个奇葩的问题, 浪费了两天时间(囧)

背景是开发一个采集程序, 为了确认采集结果正常, 将结果以json格式输出. 验 证的时候, 随便取了一个值通过ctrl+f搜索json中是否存在. 这时候发现ctrl+f 搜索不到, 接下来就是不断加日志排查问题, 但是增加的日志始终显示确实将要 搜索的这段数据加到了对象里, 只不过输出的json里始终搜索不到.

最终怀疑是iterm的问题, 尝试将输出结果重定向到文件里, 在文件里能正常搜 索到内容. 看上去是输出的json太长, iterm截断了所以搜索不到.