关于 Ubuntu 的陈年往事

Ubuntu 启动栏图标自定义设置

个人有时的误操作会导致 Ubuntu 启动栏某些软件的图标消失,变成一个大大的问号「?」,为了挽救难看的启动栏,这里学习一下 Ubuntu 启动栏图标的实现原理:

在目录 /usr/share/applications 下可以看到,这里有很多以 .desktop 结尾的文件,其实这些文件就是 Ubuntu 启动栏各个软件图标的设置文件。

这里以 firefox 火狐浏览器(是的,我就是把它的图标搞丢了 😐)为例介绍启动图标的设置。可自行新建或修改一个以 firefox.desktop 命令的文件,写入或修改内容:

1
2
3
4
5
6
7
8
[Desktop Entry]
Name=Firefox 63.0.3
Comment=this is firefox
Exec=/opt/firefox/firefox
Icon=/opt/firefox/browser/chrome/icons/defaults/default128.png
Terminal=false
Type=Application
Categories=Application;Network;

其中,较为重要的几个,Name 字段即启动图标鼠标悬停提示,Exec 字段即启动图标对应的可执行程序,Icon 字段为启动图标的 icon 文件。


Ubuntu 20 添加自定义程序到启动栏

同样地,在目录 /usr/share/applications 下,参照上节 firefox 的示例,自行创建一个以 xxxx.desktop 命令的文件,并以命令 [user@host /usr/share/applications]$ sudo chmod +x xxxx.desktop 赋予其可执行权限,至此即可在启动栏尾部选择「Show Applications」菜单,在所有应用列表中找到刚才创建的应用启动图标(以 Name 字段为名称,以 Icon 字段指向的图片为图标),在该图标上右键选择「Add to Favorites」即可将此自定义程序(即 Exec 字段指向的可执行程序)添加到系统的快速启动栏。


修改 Ubuntu 默认终端

在考虑到多终端窗口分屏显示时,可以采用命令 [root@A ~]$ apt-get install terminator 安装新的终端工具 Terminator 。但在安装该工具后会自动设置默认终端为 Terminator,对于 Ubuntu 16.04,可通过如下命令重置默认终端为系统自带的 gnome-terminal:

  • $ gsettings set org.gnome.desktop.default-applications.terminal exec /usr/bin/gnome-terminal
  • $ gsettings set org.gnome.desktop.default-applications.terminal exec-arg "-x"

对于 Ubuntu 20.04,可通过如下命令 [root@A ~]$ update-alternatives --config x-terminal-emulator 重置默认终端。


FoxitReader 支持中文输入

在安装完 Linux 平台的 FoxitReader (版本号:2.4.4.0910)后,FoxitReader 默认是不支持中文输入的。在 FoxitReader 安装目录下的 FoxitReader.sh 脚本文件中加入环境变量 GTK_IM_MODULE、QT_IM_MODULE 和 XMODIFIERS 的设置,即添加 gtk、qt 等对 fcitx 的支持:

1
2
3
4
5
6
7
8
#!/bin/sh
appname="FoxitReader"

selfpath="/opt/foxitsoftware/foxitreader"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
exec "$selfpath/$appname" "$@"

注意,需将 export 语言添加在 exec 语句之前。


Ubuntu 20 上 Sogou 输入法的安装

除按照搜狗输入法官网这里的指导,设置使用 fcitx 输入法系统以外,还需在文件 /etc/environment 中添加如下语句:

1
2
3
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx

重启生效后,Sogou 输入法即可正常使用。


一些常用 Shell 小技巧

ImageMagick convert 相关

拼贴多张图片

命令 $ convert flameshot_*.png -gravity Center -append new.png 将所有匹配到 flameshot_*.png 的图片文件从上至下紧凑拼接成一整个名为 new.png 的图片。

命令 $ convert flameshot_*.png -gravity Center +append new.png 将所有匹配到 flameshot_*.png 的图片文件从左至右紧凑拼接成一整个名为 new.png 的图片。

命令 $ convert Screenshot*.png -background black -splice 0x10+0+0 -gravity Center -append -chop 0x10+0+0 new.png 将所有匹配到 Screenshot*.png 的图片文件从上至下拼接成一整个名为 new.png 的图片,拼接时所有单个 Screenshot*.png 按水平居中对齐,在每两个图片中间插入 10 像素的空隙,并取背景底色为黑色。

命令 $ convert Screenshot*.png -background white -splice 10x0+0+0 -gravity Center +append -chop 10x0+0+0 new.png 将所有匹配到 Screenshot*.png 的图片文件从左至右拼接成一整个名为 new.png 的图片,拼接时所有单个 Screenshot*.png 按垂直居中对齐,在每两个图片中间插入 10 像素的空隙,并取背景底色为白色。

PDF 转 JPG 格式

命令 $ convert -density 100 -flatten in.pdf out.jpg 将 in.pdf 以 100 的采样率做格式转换输出为 out.jpg 的图片。

find 相关

修改文件夹或文件的属性

命令 [user@A target_directory]$ find . -type d -exec chmod 755 {} \; 修改主文件夹 target_directory 下所有子文件夹的访问属性为 755。

命令 [user@A target_directory]$ find . -type f -exec chmod 644 {} \; 修改主文件夹 target_directory 下所有文件的访问属性为 644。

重命令指定命令规则文件

命令 [user@A target_directory]$ find . -name "*wildcard*" -exec sh -c 'x="{}"; mv "$x" "${x//oldString/newString}"' \; 找出主文件夹 target_directory 下所有名称中含有 wildcard 子字符串的文件,并将其名称中的所有 oldString 子字符串替换为 newString 以实现重命令。

查找修改时间晚于指定日期的文件

命令 [user@A target_directory]$ find . -type f -mtime 5.0 -not -path "./anExcludedDirectory/*" -not -path "./anotherExcludedDirectory" 找出除 anExcludedDirectory 和 anotherExcludedDirectory 子文件夹外,主文件夹 target_directory 下的所有修改时间晚于 5 天前的文件。这里的 -mtime 选项的参数值可以为整数或小数。


Mendeley 支持中文输入

根据 解决 Debian 中 RStudio 和 Mendeley 下 Fcitx 输入法不能使用的问题 所述,Mendeley 等软件不支持 Fcitx 输入法输入中文的原因可能是,这些软件使用的 Qt 版本与系统版本不同,而 Fcitx 是直接调用的系统的 Qt 库。

所以,Mendeley 等的 Fcitx 中文支持问题的最根本最可靠的解决办法是,下载这些软件对应版本的 Qt 库源码,编译生成动态链接库,拷贝到软件的插件目录下即可。

此外,针对 Mendeley 软件,另一种可能但不可靠的解决办法(参见 libfcitxplatforminputcontextplugin.so)是,下载 libfcitxplatforminputcontextplugin.so.for.MendeleyDesktop 并拷贝到插件目录 /opt/mendeleydesktop/plugins/qt/plugins/platforminputcontexts/ 下并重命名为 libfcitxplatforminputcontextplugin.so,可通过如下命令实现:

1
2
$ wget https://github.com/JackieMium/libfcitxplatforminputcontextplugin.so/raw/master/lib-fcitx-plugin/debian.sid.20171223/libfcitxplatforminputcontextplugin.so.for.MendeleyDesktop
$ sudo mv libfcitxplatforminputcontextplugin.so.for.MendeleyDesktop /opt/mendeleydesktop/plugins/qt/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so

SHELL 函数的定义与使用

定义

在 SHELL 脚本中,可参照如下格式定义函数:

1
2
3
[ function ] functionName [ () ] {
...
}

其中,function() 不可同时省略。

在函数定义中,可通过变量 $1 访问传入该函数的第 1 个参数,$2 则对应第 2 个参数,依此类推。

在函数定义中,可通过 return errorCode 返回错误码,进而在下一步中通过变量 $? 获取该码值。若定义中无 return 语句,则以函数执行的最后一条语句的错误码返回。

使用

在定义函数的 SHELL 脚本中,在函数定义的下文中,可直接通过语句 functionName [ argument1 [ argument2 [ ... ] ] ] 调用该函数。

在外部命令行中,先通过命令 source scriptFileName 在环境中添加函数定义(scriptFileName 为定义函数的脚本文件),即可通过上述语句调用该函数。

在外部命令行中,可通过命令 typeset -f functionName 查看该函数的定义内容。

在外部命令行中,可通过命令 unset -f functionName 取消对该函数的定义。


Ubuntu UEFI 引导修复

由于一个很偶然的机会,在 BIOS 中的一时手欠,导致主机上 UEFI 引导的 Ubuntu 系统无法启动(在屏幕闪现过品牌商 Logo 后,只留下 “No operating system found. Boot sequence will automatically repeat” 的提示在热情地舞动着)。

在多种无果的尝试中,发现使用先前制作的(UEFI 引导)Ubuntu 系统启动盘可以正常进入安装程序,说明在 BIOS 中的启动设置应该是没有问题的。遂怀疑是已安装 Ubuntu 系统的 UEFI 引导出了问题,决定尝试修复看看。

先使用 Ubuntu 系统启动盘进入 “Trying Ubuntu” 的 Live 操作系统。再以如下命令安装 boot-repair 引导修复工具(该工具的详细使用说明可参考这里):

1
2
ubuntu@ubuntu:~$ sudo add-apt-repository ppa:yannubuntu/boot-repair
ubuntu@ubuntu:~$ sudo apt install boot-repair

在命令行键入 boot-repair 即可启动该修复工具,展开【Advanced options】菜单,在 [GRUB location] 选项卡中确认默认启动的操作系统和 /boot/efi 对应的分区无误后,即可点击右下角 [Apply] 开始执行修复操作。

修复完成后重启系统,安装的 Ubuntu 系统果然恢复正常启动。记录至此。


WoeUSB 刻录 Windows 10 启动盘

首先,准备 U 盘。先以命令 [user@A ~]$ sudo fdisk -l 确定 U 盘对应的设备号,如 /dev/sdb。若 U 盘的 sdbX 分区已被系统自动挂载,先以命令 [user@A ~]$ sudo umount /dev/sdbX 卸载之。最后以命令 [user@A ~]$ sudo mkfs.vfat /dev/sdb -I 将 U 盘格式化。或也可进一步对 U 盘进行分区(可使用 Ubuntu 20 自带的 gnome-disks 工具)。

次者,准备 WoeUSB。先以命令 [user@A ~]$ sudo apt install bash dosfstools findutils grep gawk grub-common grub-pc-bin ntfs-3g p7zip-full parted util-linux wget wimtools 安装依赖(其中其他工具都较为常用,可能已被安装,需特别安装的是 wimtools)。在 WoeUSB 发布页 下载 woeusb-x.x.x.bash 文件。

最后,刻录启动盘。先自网页上下载 Windows 10 系统的 ISO 安装文件,如 cn_windows_10_…_xxxx.iso 。再切换到下载目录,以命令 [user@A ~]$ sudo ./woeusb-x.x.x.bash -d cn_windows_10_..._xxxx.iso /dev/sdb 开始执行刻录程序。若想提定刻录到 /dev/sdb1 分区,则用 -p 选项替换掉 -d 选项,用 /dev/sdb1 设备号替换掉 /dev/sdb 设备号,执行此命令即可。该命令执行完成,即刻录成功。


设置 xdg-open 调用的默认应用

工具 xdg-open 可以根据文件名的后缀,调用与之相应的应用来打开文件,类似于在桌面系统中,通过鼠标双击调用默认程序打开指定文件的过程。

通过命令 [user@A ~]$ xdg-mime default application mimetype 可以设置 application 为 mimetype 类型文件的默认应用,其中 application 所支持的应用选项可以是任一 /usr/share/applications 下带有 .desktop 后缀的文件名,mimetype 所支持的类型选项可以是 /usr/share/applications/defaults.list 文件中(除第一行外)任一行的等号左边的内容。


设置 ssh 远程登录密码认证规则

在 Ubuntu 系统中,由于没有 authconfig 工具,我们只能通过修改 PAM 服务文件 /etc/pam.d/sshd 来实现用户 ssh 远程登录密码连续认证失败时账户锁定的效果。同时,由于系统又默认不支持 pam_faillock.so 模块,所以这里只能使用 pam_tally2.so 模块。

以 sudo 权限打开 /etc/pam.d/sshd 文件,并在文件开头插入如下内容:

1
auth  required  pam_tally2.so   deny=6 unlock_time=600 even_deny_root root_unlock_time=1800

保存修改后即可生效。其中,各项参数的意义为:

  • deny=6:用户连续 6 次密码认证失败即被锁定;
  • unlock_time=600:用户锁定时限为 600 s,即被锁定 600 s 后可自动解锁;
  • even_deny_root:root 账户也可在连续认证失败时被锁定;
  • root_unlock_time=1800:root 账户的锁定时限为 1800 s,可与普通用户时限不同。
---------- 文结至此 静待下章 ----------