「基于时间的任务调度器」

任务调度器(Job Scheduler)包含的门类很广,基于时间的任务调度只是其中的一个门类。
系统管理
经常用到的基于时间的任务调度器有以下几个: 1)At 2)Cron 3)systemd Timer
At,可以在特定时间点执行任务。Cron,可以用于进行周期性任务。sytemd Timer,可以同时实现二者的功能,并且能将时间粒度控制到秒。
参考文献
Wikipedia/Job scheduler[……]

READ MORE

「Cron and Anacron」- 基于时间的任务调度器

「Cron」
「Cron」是一个用于创建周期任务的工具包。其中,包含一个执行调度任务的守护进程的cron命令是,用于周期执行脚本;包含的crontab命令用于管理周期任务。
如果你有什么任务需要周期性的在后台执行,那就可以使用Cron来执行该任务。通过向Cron的配置文件中添加一个条目,条目中指明需要周期执行的命令或脚本即可。
「Anacron」
与「Cron」一样,「Anacron」也是周期性的执行命令。
有所不同的是「Anacron」不会假定”系统是不间断运行的“。就是说,如果关机了,在Cron中,错过的任务不会再执行,而在Anacron中,开机后,错过的任务也会保证被执行。
二者之间的关系
但是这二者并不是互相替代的,他们是互相协作的。
「anacron」本身不作为服务/守护进程运行,而是作为「cron」的作业,/etc/cron.d/anacron,存在的。 因此,「cron」会为每日、每周、每月任务检查是否存在「anacron」,而不是每小时任务。「Cron」运行每小时的任务。
关于「Anacron」一些误区
「anacron」本身不作为服务/守护进程运行,而是作为「cron」的作业,/etc/cron.d/anacron,存在的。
「anacron」不会用于”在确切时间运行作业“。它最好用于,例如,确保维护脚本以近似频率运行,如每日、每周、每月。它没有低于一天的时间分辨率。
参考文献
Who runs scripts inside /etc/cron.hourly if anacron is enabled? Is it possible to set one job to run at precise hour with anacron[……]

READ MORE

「Cron」- 安装及注意事项

系统环境:Kali GNU/Linux Rolling
#1 安装服务

#!/bin/sh

# 安装Cron服务:
apt-get install cron

# 启动并开机自启动Cron服务:
systemctl enable cron
systemctl start cron

# 查看服务状态:
systemctl status cron

# 如果手动启动Cron服务可以执行:
cron &

# 推荐使用systemd的方式来启动cron服务。

#2 启动服务

#!/bin/sh

# 安装服务
apt-get install cron

# 启动并开机自启动服务
systemctl enable cron
systemctl start cron

# 如果手动启动Cron服务可以执行:
cron &

# 推荐使用systemd的方式来启动cron服务。

#3 查看服务状态

# 查看服务状态:
systemctl status cron[……]

READ MORE

「Cron and Anacron」- 常见问题处理

在CentOS 7中的cron.daily/weekly/monthly的执行由/etc/anacrontab描述。
创建周期任务
如果要添加「Cron」周期任务,则需要修改/etc/crontab配置文件。配置Cron周期任务的关键就是熟悉配置文件/etc/crontab的语法,这个文件并不复杂。
假如我们要每隔5分钟向/tmp/datelist文件中输出当前时间,那么向/etc/crontab文件添加如下行:

5 * * * * root date >> /tmp/datelist

有关crontab配置文件的语法,参考「关于crontab表文件的格式」一文,或者参考crontab(5)手册。
参考文献
When does `cron.daily` run?[……]

READ MORE

「crontab」- 周期任务的配置文件

配置文件crontab中描述了需要命令cron周期执行的任务。
配置文件的位置
系统级别的配置文件为/etc/crontab。通常由系统管理员编辑,执行系统维护相关的周期任务。
用户级别的配置文件位于/var/spool/cron/crontabs/中。每个用户在该目录中都有自己的crontab文件,单独存放。使用命令crontab(1)进行编辑。这其中任何给定的crontab中的命令都将使用拥有crontab文件的用户身份来执行。
文件内容概述
文件crontab中包含了cron(8)守护程序的指令,一般形式为:“此日期此时运行此命令”。
Uucp和News通常都有自己的crontabs,因此无需显式运行su(1)作为cron命令的一部分。
配置文件的内容分为第三部分:

注释行;
环境变量设置;
周期任务指定;

下面将分别介绍这三部分。
配置中使用注释
空白行会被忽略;前导的空格和TAB也会被忽略;以井号(#)开始的行会被忽略。
注意事项 注释不允许和命令在同一行。就是说一行条目,要么是命令,要么是注释。下面的格式是不正确的:
09,39 * * * * root date >> /var/log/date # comment…

同样的,注释也不能和环境变量设置在同一行。
配置文件中的环境变量
文件crontab中可以指定命令执行的环境变量。
文件crontab从上到下进行解析,因此任何环境变量设置都只会影响文件中它们下面的cron命令。环境变量设置的形式:
name = value

等号(=)周围的空格是可选的,value中任何后续的非前导空格都是分配给name的值的一部分。value字符串可以放在引号中(单引号或双引号,但要成对出现)以保留前导或尾随空白。要定义空变量,必须使用引号。对于环境替换、变量替换都不会进行不解析,因此类似:
PATH = $HOME/bin:$PATH

的行不会按照你的期望进行解析。下面的这些也不会奏效:
A=1
B=2
C=$A $B

在最后一个值C中,不会替换定义的变量,因此C就是字面上的“$A $B”。
设置命令路径PATH的另一种方法是:即许多shell会将代字号(~)视为$HOME的代替,因此如果您将BASH用于任务,则可以使用:
SHELL=/bin/bash
PATH=~/bin:/usr/bin/:/bin

守护进程cron(8)自动设置了几个环境变量。SHELL设置为/bin/sh;LOGNAME和HOME是从文件crontab的所有者的/etc/p[……]

READ MORE

「Cron」- 使用技巧

如何每秒执行任务?
没有直接的解决方案。因为在Cron中,最小的时间帧是分钟,不能进行每秒钟执行某个任务。
# 方案一:systemd Timer
可以使用systemd Timer,它支持以秒为时间帧来执行任务。
# 方案二:Shell Script
在Cron中,最小的时间帧是分钟。因此可以写一个Shell脚本:在循环中,休眠一秒钟,创建一个后台任务,共计60秒。
创建后台任务是为了不让任务的执行循环执行,否则极可能出现脚本执行时间超过60秒的情况。
# 方案三:Shell Script
与「方案二」类似,创建一个脚本。不同的是脚本的写法:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

上面的示例是每隔五秒中执行,要不要使用这个方案,需要根据自己的需求把握。
「方案二」和「方案三」存在相同的问题:任务越靠后,时延越大,因为即使是放入后台运行也需要消耗时间。
参考文献
Seting cron to run a script every second How to run scripts every 5 seconds? systemd as a replacement for cron every 10 seconds Run timer exactly every second with systemd systemd.timer — Timer unit configuration[……]

READ MORE

「Cron」- 执行日志

根据文档所述:

cron logs its action to the syslog facility ‘cron’, and logging may be controlled using the standard syslogd(8) facility.

所以,具体的日志文件位置还要看/etc/syslog.conf中的配置。
在Kali GNU/Linux Rolling中,「Cron」的日志文件位于/var/log/cron.log中。
在就是,在我的系统(Kali GNU/Linux Rolling)中「Cron」是前台运行(-f)的,所以可以使用journalctl(1)来查看日志。
而在Ubuntu中,默认安装后,日志位于/var/log/syslog中,使用grep CRON /var/log/syslog来查看。
参考文献
Where is the cron / crontab log?[……]

READ MORE

「systemd.timer」

systemd.timer,是由systemd提供的定时任务,类似于Cron功能。
简单描述
文件命名
该单元文件以.timer为文件后缀。单元文件命名为<timer>.timer。其中,<timer>为具体的任务名,而.timer为固定的文件后缀。
文件结构
本文不涉及单元文件的[Unit]部分与[Install]部分,有关内容参考systemd.unit(5)手册。
本文只包含[Timer]部分的指令,主要摘自systemd.tiemr(5)手册。特定于定时器的配置选项都位于单元文件的[Timer]部分中。
# 其他方面
对于每个定时器文件,必须存在匹配的单元文件,描述了计时器经过时要激活的单元文件。默认情况下,激活与计时器同名的服务(除了后缀)。例如,计时器foo.timer将执行foo.service服务。需要指定要执行的单元,通过Unit=指令来指定。
!!!在计时器经过时,要激活的任务已经激活,它不会被重新开始,而是仍然保持运行。在这种情况下不会产生新的实例。因此服务中使用了RemainAfterExit=(即使主进程退出了也保持存在状态)不适合通过计时器来激活,因为他们只会被激活一次,然后一直存在,服务不退出就无法进行下一次任务。
自动依赖
隐含依赖
定时器单元会在它们应该激活的服务上自动获得一个Before=依赖。
默认依赖
除非设置了DefaultDependencies=no,否则会添加以下依赖:

计时器会自动获得在sysinit.target上的Requires=和After=的依赖,一个timers.target上的Before=类型的依赖,以及shutdown.target上的Conflicts=和Before=依赖(以确保系统在关闭期间能干净的停止)。只有涉及早期启动或延迟系统关闭的计时器单元才应禁用DefaultDependencies=选项。

对于具有至少一个OnCalendar=指令的定时器单元,将在time-sync.target上具有额外的After=依赖,以避免“在正确设置系统时钟之前”启动。

命令支持的选项及含义
计时器文件必须包含一个[Timer]部分,该部分包含了计时器的定义。特定于[Timer]部分的选项如下:
OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec=, OnUnitInactiveSec= 定义相对于不同起点的单调计时器:

OnActiveSec=:定义计时器,相对于计时器单元本身被激活的时刻。[……]

READ MORE

「systemd」- Timer:由systemd提供的定时任务

该文章概述了在systemd中使用Timer来设置定时任务的方法,并提及了一些细节上的东西。
!!!这篇文章是一个概要,而不是一份详细的教程。
在Linux中,任务调度器Cron广为认知。但是Cron的粒度只能控制到分钟,不能到秒,但是systemd的Timer可以。
第一步、创建单元文件
创建Timer单元文件。假设以mytimer.timer为文件名,格式大体如下:

[Unit]
Description=Runs mytimer every hour

[Timer]
OnUnitActiveSec=1h
Unit=mytimer.service

[Install]
WantedBy=multi-user.target

如上所示,在systemd的Timer单元文件中,它并不包含具体要执行的命令,而是指定了一个要执行的Service单元。比如,上面的mytimer.service单元,该Service单元文件中包含了具体要执行的任务,所以你要先创建Service单元文件。这里就不再展开。
该mytimer.tiemr文件要放在/etc/systemd/system目录中。
第二步、启动定时任务
同样的,执行sytemctl start mytimer.timer来启动定时任务。
如果要开机自启动,则可以执行systemctl enable mytimer.timer命令。
常见问题
#1 定时任务没有立即启动
执行systemctl start foo.timer以后,没有立即执行对应的单元,原因参考「Systemd timer not starting its service unit」一文。
解决办法 在foo.timer单元文件的[Unit]部分加入Requires=bar.service部分。
参考文献
Systemd 定时器教程 如何使用 systemd 中的定时器 linux基础命令介绍十四:定时任务 systemd.timer 中文手册 Systemd 定时器教程 如何使用 systemd 中的定时器 systemd/Timers[……]

READ MORE

「Linux」- 用户与组的管理

用户操作
修改用户(改)

usermod –append -G vboxusers virtmgr # 将用户 virtmgr 添加到 vboxusers 组中;

进入用户家目录
进入用户 zheng 的家目录:

# cd ~zheng

如果要在终端中输入制表符,可以先按下 Ctrl+v,然后在按下 TAB 键;
常见问题汇总
已为用户设置 Group 权限,但是用户在访问时依旧没有权限
Group permissions allow, but still get permission denied How to apply changes of newly added user groups without needing to reboot?
假设配置正确,并且使用 id 命令可以看到用户属于该组;
解决办法: 或,用户需要重新登录(桌面环境,使用该方法); 或,如果由于某些原因无法重新登录,可以使用 sudo login 命令重新登录; 或,使用 newgrp “<group-name>” 来更新当前会话的组,该方式能保持当前会话的环境配置; 或,使用 sg “<group-name>” -c “command” 来执行命令(类似 su 命令,sg 用于组);[……]

READ MORE

「Linux」- 以其他用户的身份运行命令

问题描述
在 Linux 中,有时候我们需要以其他用户身份来运行命令,而不是当前登录用于。像 Nginx 或者其他某些应用程序,可以指定在运行时所属的用户和组,但是有些程序则不支持指定用户和组(因为它们自身不支持)。
本笔记将介绍以其他用户身份来运行特定命令的方法。
解决方案
方法一、使用 systemd 的单元文件
在.service文件中,使用User=和Group=来指定运行命令的用户的组。如下示例:

[Unit]
Description=xxxxxxx

[Service]
User=www-data
Group=www-data
ExecStart=xxxxxxx

方法二、使用 sudo(8) 命令
可以用 sudo(8) 命令,它的作用本来就是“excute a command as another user”,默认为root用户,可以用-u指定所要使用的用户名。
sudo(8)以另一个用户身份执行命令,但遵循一组规则,这些规则决定了哪些用户可以作为哪些其他用户来执行哪些命令。在/etc/sudo(8)ers文件中进行配置。与su(1)不同的是对用户进行身份验证时,sudo(8)使用调用sudo(8)命令的用户的密码,而不是目标用户的密码。 sudo(8)允许系统管理员授权某些用户(或用户组)以root用户或其他用户身份来运行命令的能力,同时提供命令及其参数的审计跟踪。这允许将特定命令委派给特定主机上的特定用户,而无需在其中共享密码。
假设要以user身份执行prog程序:

#!/bin/sh

sudo -u user prog

方法三、使用 su(1) 命令
还可以使用 su(1) 命令。使用su(1)命令切换到另一个身份,运行Shell,再用新的Shell运行指定程序。命令su(1)只能运行Shell程序,虽然可以把命令写成类似于sudo(8)的样子(比如,su -c user prog),但它的实现原理实际上还是先运行一个Shell,再通过Shell运行其他程序。
假设要以user身份执行prog程序,有两种方法:
先切换到user用户,然后执行prog程序:

#!/bin/bash

su – user
prog arg0 arg1 …

使用命令su(1)的-c选项指定要执行的命令:

#!/bin/bash

su -user -c “prog arg0 arg1 …”

这两者方法只是形式上的不同,本质上还是相同的。不管使用哪一个,它都会提示你输入用户的密码。
因此,如果要在Shell脚本中使用su命令:

#!/bin/bash[……]

READ MORE

「Linux」- 找到用户的创建时间

问题描述
在某些场景下,我们需要知道用户的创建时间。
比如 Jumpserver 推送用户到系统,我们想知道该用户是何时推送到系统的。
该笔记将记录:在系统中,如何确定用户的创建时间。
解决方法
方法有很,但都不是常规方法。
如果用户没有修改密码,可以使用如下方法(只能查看时间):

# passwd -S test
test P 12/03/2020 0 99999 7 -1

# chage -l k4nz
Last password change : Mar 16, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

通过系统日志获取:

// CentOS

# cat /var/log/secure | grep -i “<your username>”

// Ubuntu 18.04.4 LTS

# cat /var/log/auth.log | grep -E ‘useradd.+test’
Dec 3 09:33:10 localhost useradd[13160]: new group: name=test, GID=1002
Dec 3 09:33:10 localhost useradd[13160]: new user: name=test, UID=1002, GID=1002, home=/home/test, shell=/bin/bash

创建用户的最佳实践
在创建用户时,建议使用 –comment 选项添加注释,并补充相关的信息。
参考文献
HowTo Find Linux User Created Date Is There Any Way – ARKIT[……]

READ MORE

「Linux」- 强制用户下线

内容简介
本文将介绍如何显示已登录系统的用户,以及如何强制已登录用户下线。
问题描述
之前有些开发拿到ROOT帐号。现在,要回收ROOT帐号,修改密码,并强制已登录用户下线。如果不强制下线,他们还可以使用ROOT用户继续操作。
解决办法
找到用户登录进程,然后结束这些进程即可。
#1 查看已登录用户
查看当前用户

#!/bin/sh

################################################################################
# 显示当前登录的用户的用户名
################################################################################
whoami # 没有其他选项

################################################################################
# 显示当前登录的用户的用户名
################################################################################
id -un

上述命令是等价的,都显示了当前登录的用户。
查询已登录用户

#!/bin/sh

################################################################################
# 显示系统中登录的用户,及正在执行的动作
################################################################################
w

################################################################################
# 显示当前登录的用户
################################################################################
who

################################################################################
# 显示当前登录用户(特殊一些)
# 没有其他的选项,功能单一。如果用户具有多个进程,则显示多次用户名。
####################################################################[……]

READ MORE

「CentOS」- 重置 ROOT 密码

问题描述
未做文档,交接疏忽……总之会出现各种需要重置密码的场景…………本文将介绍如何重置ROOT密码。
该笔记将记录:在 Linux 中,如何重置密码,以及相关问题的解决办法。
解决方案
本文只进行简单记录,不深入操作细节。
Ubuntu 20.04 LTS
How to Reset Forgotten Root Password in Ubuntu grub2 – How to get to the GRUB menu at boot-time? – Ask Ubuntu
1)当进入 GURB 菜单时,按 [e] 编辑启动项; 2)编辑 linux /boot/… 行尾,类似 ro quiet splash 内容; 3)修改为 rw init=/bin/bash 并 [F10] 以继续启动; 4)进入系统,passwd,修改密码; 5)最后,exec /sbin/init,启动系统;
Q:某些系统,/etc/default/grub: GRUB_HIDDEN_TIMEOUT=0,导致无法显示 GRUB 菜单 A:当开机时:基于 BIOS 系统,按 [Shift] 键;基于 UEFI 系统,按 [Esc] 键;
CentOS 7
How To Reset Root Password On CentOS 7
GRUB => 编辑对应启动菜单项 => 找到 linux16 行 => 将 ro 替换为 rw init=/sysroot/bin/sh 配置 => 启动,进入单用户模式
chroot /sysroot
passwd root
touch /.autorelabel (如果系统加载SELinux模块)
exit
reboot[……]

READ MORE

「PAM」- Pluggable Authentication Modules

可插拔认证模块,将低层认证方案集成到高层接口中,为操作系统的应用及服务提供认证支持,而需要关注低层认证方案。简单地说,如果你的应用程序想要使用系统帐号登录,不需要自己解析 passwd 和 shadow 文件,使用 PAM 模块即可。
Linux Pluggable Authentication Modules
从 Unix Pluggable Authentication Modules 架构中演变而来。它将身份验证任务分为四个独立的管理组:

(1)Account Module,帐户模块:检查帐号是否为有效认证对象。帐号可能存在过期、密码失效等等问题。
(2)Authentication Module,认证模块:由于验证密码或其他密钥。该模块也肯能将认证信息传递给其他系统,比如 keyring 服务。
(3)Password Module,密码模块:负责更新密码,通常耦合到认证步骤中使用。也被用于强制使用强密码。
(4)Session Module,会话模块:定义会话在开始与结束时执行的动作。会话开始与用户成功认证后。

该四个模块与 pam.conf(5) 手册所属的 type 属性对应。
注意事项
1)调整 PAM 会改变系统的安全性。 2)错误的配置将导致系统部分功能无法访问,或者全部无法访问。请做好回滚准备,比如备份原文件。 3)无需过多关心 PAM 内部细节,要更多关注配置文件如何定义应用与PAM之间执行认证任务的连接。
配置实例(谨慎参考)
错误配置可能导致系统认证不可用,请谨慎参考本部分内容,这只在我们自身环境中测试通过。请参考官方文档或手册获取准确内容。
检查应用程序是否使用 PAM 认证
我们希望使用 su root 命令时无需输入密码,则先检查 su 是否集成 PAM 认证:

# ldd $(which su) | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007ff1da47c000)

从输出中可以看出 su 命令使用 PAM 库,所以我们可以说 su 支持 PAM 认证。
配置文件的语法格式
第一步,阅读 How to Configure and Use PAM in Linux 文章,有个初步认识。 第二步,在 Debian 中,请参考 man 5 pam.d 或 man 5 pam.conf 手册。
参考文献
Wikipedia/Linux PAM Wikipedia/Pluggable authentication module What is PAM[……]

READ MORE

「su」- substitute user

在切换用户时无需输入密码
Allow user1 to “su – user2” without password
问题描述
当前为 k4nz 用户,当切换到 root 用户时,我们希望无需输入密码。
解决办法
由于 su 支持 PAM 认证,因此我们可以通过调整 /etc/pam.d/su 来实现“当用户 k4nz 切换到 root 用户时无需输入密码”,用 PAM 的话来说(配置文件)就是:

auth [success=ignore default=1] pam_succeed_if.so use_uid user = k4nz
auth sufficient pam_succeed_if.so user = root

也可以使用如下配置行(两者是等价的,但不知晓是否存在安全隐患)

auth [success=ignore default=1] pam_succeed_if.so user = root
auth sufficient pam_succeed_if.so user = k4nz

注意配置文件要家到 /etc/pam.d/su 的开始部分,因为配置行是以栈的形式存在(这是我们的理解)
附加说明
要理解配置行的含义,需要理解 PAM 配置文件。[……]

READ MORE

「sudo」- superuser do

配置文件语法
关于配置文件(/etc/sudoers)的语法:第一步、阅读 Understanding sudoers(5) syntax 文章;第二步、阅读 man 5 sudoers 或者 Sudoers Manual 手册。理解配置文件语法的关键在于理解在文档中表述的 EBNF 语法。
# 03/23/2020 那个 EBNF 语法确实让人头疼,但是静心看下去还不算复杂,就是内容较多而已。
常用配置
无密码运行 sudo 命令
这里指定用户 k4nz 可以在运行命令时无需输入密码:

#!/bin/sh

cat > /etc/sudoers.d/k4nz <<EOF
k4nz ALL = (ALL:ALL) NOPASSWD: ALL
EOF

在输入密码时,显示星号(模式 macOS 样式)
How to Make Password Asterisks Visible in the Terminal Window in Linux Ubuntu Tips – Display Asterisks When Typing Your Password in Terminal
在 Linux 中,终端输入密码是没有用户反馈的,等同于盲按(在感觉自己输入正确时,按下回车键即可)。在 macOS 中,终端输入密码则以星号显示。虽然对高手来说这完全没有必要,但是这种用户体验还是很好的。我们希望在 Linux 中也可以有这种用户反馈,本笔记将介绍如何实现(配置)。
第一步、执行 visudo 命令,进入编辑页面;第二步、在编辑页面加入:Defaults pwfeedback;第三步、保存退出并测试;
常见错误汇总
#1 sudo: unable to resolve host xxxxx
Error message “sudo: unable to resolve host (none)”
问题描述: 在执行 sudo 命令时,控制台提示错误:

sudo: unable to resolve host (none)

问题原因: 没找具体原因,就是简单的搜索了一下。
解决办法: 修改 /etc/hostname 和 /etc/hosts 文件,确保主机名和解析是正确的。
参考文献
Wikipedia/sudo[……]

READ MORE

「macOS」- 我们的使用经验

问题描述
我们曾经是 macOS 用户,但现在的工作还需要继续接触 macOS 系统(主要是提供相关的技术支持及答疑);
例如:编写与 macOS 相关的打印机连接文档;寻找其能在 macOS 中运行的某些客户端或替代品;
该笔记将记录:在 macOS 中,与其相关常见的使用经验、运维管理、技术支持,以常见问题的解决办法;[……]

READ MORE

「macOS」- 应用程序运行

在 ARM 中,运行 x86 程序
知乎 / M1 是怎么兼容 x86 的?MacBook 是否会有软件兼容性问题
M1 不能识别 x86 的指令,那是不是可以把 x86 的复杂指令,先翻译成 ARM 的精简指令呢?
于是乎,苹果就开发了一个叫做 Rosetta 2 的转译机制,对于针对 x86 指令集编译的代码,在映像执行路径中就会被内核识别,内核则会把控制权交给 Rosetta 转译存根。此后转译存根会在映像执行期间转译,这个模式下转译和执行可以理解为是同时执行的。这种也被称作即时转译,Just In Time(JIT);
苹果系统之家 / 在 Apple Silicon M1/M2 Mac 电脑上安装 Rosetta 2 运行 intel 应用[……]

READ MORE

「macOS」- 包管理器

Homebrew
Homebrew
Fink
Homepage: http://www.finkproject.org
Fink is akin to (and iirc based on) the Debian/Ubunutu apt system: it delivers pre-compiled binaries.
MacPorts
Homepage: https://www.macports.org
MacPorts is related to the older BSD Ports collections: rather than pre-built binaries, it containers pointers to the original source + patches required to make that source work on your platform (and with the other apps that you’ve installed via ports).[……]

READ MORE

「Homebrew」- 适用于 macOS 的包管理器

问题描述
用于 macOS 或 Linux 的包管理器,而我们更多用于 macOS 系统的应用包管理。
也可以在 LFS 中使用 Homebrew 工具。LFS 是个 Linux 项目,教我们如何使用源码包一步步编译出可运行的 Linux 系统。但是,在 LFS 中没有可用的包管理器,所有的应用只能编译安装。编译安装是件非常痛苦的是事情,而有了 Homebrew,可以简化 LFS 的包管理工作。当然,LFS 不是这篇笔记要介绍的内容,我们的重点还是放在 Homebrew 的使用,我们只是突然想到可以在 LFS 中使用 Homebrew 工具。
该部分笔记将整理:与 Homebrew 有关的内容,以及常见问题处理。
解决方案
第一步、安装 brew 命令
安装方法建议参考官方主页(brew.sh),我们不能保证与官方站点同步:

/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)”

国内访问 raw.githubusercontent.com 经常失败,参考 CunKai/HomebrewCN 项目。如果有条件,还是使用网络加速服务比较好。
第二步、安装软件服务
与其他包管理器的使用方法类似(首先 search 应用,然后 install 应用):

# 搜索 MySQL 服务
brew search mysql

# 安装 MySQL 服务
brew install mysql

# 安装特定版本的 MySQL 服务
brew install mysql@5.7

在安装应用时,由于网络原因,可能考虑需要使用网络加速服务。如下是 SOCKS5 示例:

# 使用 socks5 代理
ALL_PROXY=”socks5://127.0.0.1:1080″ brew install “<pkg-name>”

第三步、启动服务(并设置开机启动)
在 Homebrew 中,内置服务管理工具(这使我们无需了解 launchctl 的使用方法):

# 服务管理工具
brew tap homebrew/services

# 启动服务
brew services start mysql@5.7

# 查看服务
brew services list

# 重启服务
brew services restart mysql@5.7

设置服务开机启动: 1)以命令 brew services start mysql@5.7 启动,则在每次用户登录时,服务将自动启动; 2)以[……]

READ MORE

「Homebrew」- Error: Failed to upgrade Homebrew Portable Ruby!

问题描述
当执行 brew 命令时,产生如下错误:

# brew doctor
==> Downloading https://homebrew.bintray.com/bottles-portable-ruby/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
Already downloaded: /Users/pengfeiwang/Library/Caches/Homebrew/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
==> Pouring portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
portable-ruby/2.6.3_2/: Can’t create ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/.brew/: Failed to create dir ‘portable-ruby/2.6.3_2’
….
portable-ruby/2.6.3_2/bin/rdoc: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/bin/ri: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/bin/ruby: Failed to create dir ‘portable-ruby/2.6.3_2’
portable-ruby/2.6.3_2/.brew/portable-ruby.rb: Failed to create dir ‘portable-ruby/2.6.3_2’
tar: Error exit delayed from previous errors.
Error: Failed to install ruby 2.6.3_2!
Error: Failed to upgrade Homebrew Portable Ruby!

该笔记将记录:如何解决该问题,以及注意事项。
问题原因
在 Google 后,我们发现导致该问题的原因有很多,但是究其根本,正如错误信息的提示:Failed to create dir ‘portable-ruby/2.6.3_2’。因此,我们尝试查找 portable-ruby/2.6.3_2 无法写入的原因。
Homebrew 的安装目录为 /usr/local/Homebrew ,而 portable-ruby/ 在 /usr/local/Homebrew/Library/Homebrew/vend[……]

READ MORE

「LINUX MANUAL PAGES」- 命令手册

为什么要创建这部分笔记
创建命令的完整中文手册
首先,感谢要各位博主能够在互联网上传播与分享在 Linux 中的命令及使用方法,对大家做出的努力表示钦佩与感谢。但有的时候因为精力有限或者一些其他的原因导致这些文章并无法覆盖命令所有的功能,有的时候往往只有几个常用选项的介绍。
我们的目标是为大家提供命令的完整说明,这包括:完整介绍、选项含义、使用方法,并以通俗易懂的方式来解释命令。
使用命令来简化日常工作
在工作中,我们进程要处理一些问题。比如: 1)生成一些“格式化”的文本。这些文本很显然都带有了一定的格式,做为一个懂得编程的人,如果你还在手写、复制粘贴,而不是用一小段程序自动生成,那就…emmmmmm…。 2)使用SQL查询数据,一条SQL语句,即使使用了子查询有时也无法获得目标数据,还有的时候要使用一份查询结果数据生成两种不同的数据报表。 3)对于某些日志的过滤,数据库数据的筛选。 4)…
还有很多类似的“零散问题”,我们不是说编程语言解决不了这些问题,我们只是在说,有时候使用Shell命令直接处理这些问题可能会更方便。打开一个终端,输入指令,回车运行,得到输出,或者直接重定向到文件。想想编程语言中的文件代开,命令行参数读取,图片处理,文本处理,…。Shell中还可以直接使用其他编程语言的运行工具,不是其他语言不能,只是Shell更方便。(不想写了)。总之,Shell对日常的这种“零散操作”非常有用。
我们不是在安利你Shell。学习有时候需要根据自己的需要、兴趣、工作重心,这个需要你自己把握。而我们这是深刻体会到了掌握这种技能在我们的工作环境中的便捷。
通过命令来创建知识体系
与其他行业类似,我们这个行业也是博大精深,知识众多,规范众多,还有各种实践经验,散落在世界各处,隐藏在网络的各种角落。并不是每个概念术语都有与之对应的书籍来进行完整的诠释。
命令是工具,用来操纵系统的工具,它能操纵系统的方方面面。通过这工具,我们也可以了解到系统的方方面面,了解到在系统中的各种概念。在翻译手册的过程中,我们学到非常多的知识,了解到某些东西是怎么出现的,了解到哪些东西是历史遗留。
我们的 RHCE 经历(07/16/2018)
因为准备转运维了,改行穷三年。熟悉这些命令能给工作带来多少方便我们就不说了。这些也是基本,但不时所有的命令都必须掌握,只是说技多不压身。你若你还是初级阶段,也不建议看所有的命令,应该先把常用的学会了。
其他的原因
市面上的书太多了,但也正是由于是“书籍”的原因,它的存在着篇幅、更新、付费、查阅、及时勘误、交流等诸多方面的限制。虽然如此,我们还是喜欢纸质的书籍。但使用Web站点终究是一个处理“技术文档的查阅参考手册”更好的方案。
我们[……]

READ MORE

「acl」

安装的可执行程序
chacl Changes the access control list of a file or directory
getfacl Gets file access control lists
setfacl Sets file access control lists
参考文献

LFS/6.22. Acl-2.2.52
访问ACL主页[……]

READ MORE

「chacl」-

修改文件或者目录的访问控制列表
命令语法格式
chacl acl pathname… chacl -b acl dacl pathname… chacl -d dacl pathname… chacl -R pathname… chacl -D pathname… chacl -l pathname… chacl -B pathname… chacl -r pathname…
命令描述

chacl is an IRIX-compatibility command, and is maintained for those users who are familiar with its use from either XFS or IRIX.
Refer to the SEE ALSO section below for a description of tools which conform more closely to the (withdrawn draft) POSIX 1003.1e stan‐
dard which describes Access Control Lists (ACLs).

chacl changes the ACL(s) for a file or directory. The ACL(s) specified are applied to each file in the pathname arguments.

Each ACL is a string which is interpreted using the acl_from_text(3) routine. These strings are made up of comma separated clauses
each of which is of the form, tag:name:perm. Where tag can be:

“user” (or “u”)

indicating that the entry is a user ACL entry.

“group” (or “g”)

indicating that the entry is a group ACL entry.

“other” (or “o”)

indicating that the entry is an other ACL entry.

“mask” (or[……]

READ MORE

「getfacl」-

获取文件的访问控制列表(ACL)
命令语法格式
getfacl [-aceEsRLPtpndvh] file …
getfacl [-aceEsRLPtpndvh] –
命令描述

For each file, getfacl displays the file name, owner, the group, and the Access Control List (ACL). If a directory has a default ACL,
getfacl also displays the default ACL. Non-directories cannot have default ACLs.

If getfacl is used on a file system that does not support ACLs, getfacl displays the access permissions defined by the traditional
file mode permission bits.

The output format of getfacl is as follows:

1: # file: somedir/
2: # owner: lisa
3: # group: staff
4: # flags: -s-
5: user::rwx
6: user:joe:rwx #effective:r-x
7: group::rwx #effective:r-x
8: group:cool:r-x
9: mask::r-x

10: other::r-x
11: default:user::rwx
12: default:user:joe:rwx #effective:r-x
13: default:group::r-x
14: default:mask::r-x
15: default:other::—

Lines 1–3 indicate the file name, owner, and owning group.

Line 4 indicates the setuid (s), setgid (s), and sticky (t) bits: either the letter representing the bit, or else a dash (-). This
line[……]

READ MORE

「setfacl(1)」-

设置文件的访问控制列表(ACL)
命令语法格式
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] file …
setfacl [-bkndRLPvh] [{-M|-X} acl_file] file …
setfacl –restore=file
命令描述
命令setfacl设置文件和目录的“访问控制列表(ACL)”。在命令行上,一系列命令后面跟着一系列文件(后面可以跟着另一个命令序列,……)。
选项–set(–set-file)设置文件或目录的ACL。替换之前的ACL。此操作的ACL条目必须包含权限。
选项-m(–modify)和-M(–modify-file)修改文件或目录的ACL。此操作的ACL条目必须包含权限。
选项-x(–remove)和-X(–remove文件)删除ACL条目。删除不存在的条目不会产生错误。除非定义了POSIXLY_CORRECT,否则只接受没有perms字段的ACL条目作为参数。
选项-m和-x期望在命令行上使用ACL。多个ACL条目由逗号(,)分隔。选项-M和-X从文件或标准输入读取ACL。在「ACL ENTRIES」部分中描述ACL条目格式。
使用选项-M和-X从文件读取时,命令setfacl接受getfacl生成的输出。每行最多有一个ACL条目。在“#”之后,直到行尾的所有内容都被视为注释。
如果在不支持ACL的文件系统上使用setfacl,则setfacl将对文件模式权限位进行操作。如果ACL不完全适合权限位,则setfacl会修改文件模式权限位以尽可能地反映ACL,将错误消息写入标准错误,并返回退出状态大于0。
关于权限
在具有CAP_FOWNER功能的进程和文件所有者会被授予修改文件ACL的权限。这类似于访问文件模式所需的权限。 (在当前的Linux系统上,root是唯一具有CAP_FOWNER功能的用户。)
命令支持的选项及含义
-b, –remove-all 删除所有扩展ACL条目。 保留所有者、组、其他的基本ACL条目。
-k, –remove-default 删除默认ACL。 如果不存在默认ACL,则不会发出警告。
-n, –no-mask 不要重新计算有效权限掩码。 setfacl的默认行为是重新计算ACL掩码条目,除非明确给出了掩码条目。 掩码条目被设置为拥有组的所有权限以及所有已命名的用户和组条目的并集。 (这些正是受掩码条目影响的条目)。
–mask 即使明确指定了ACL掩码条目,也要重新计算有效权限掩码。 (请参阅-n选项。)
-d, –default 所有操作都适用于默认ACL。 输入[……]

READ MORE

「deluser」-

功能简述
deluser, delgroup – remove a user or group from the system
常用命令
将用户从组中移除:

deluser user group

语法格式

deluser [options] [–force] [–remove-home] [–remove-all-files] [–backup] [–backup-to DIR] user

deluser –group [options] group
delgroup [options] [–only-if-empty] group

deluser [options] user group

COMMON OPTIONS
[–quiet] [–system] [–help] [–version] [–conf FILE]

命令描述

deluser and delgroup remove users and groups from the system according to command line options and configuration information in /etc/deluser.conf and /etc/adduser.conf. They are friendlier front ends to the userdel and groupdel programs, removing the home directory as option or even all files on the system owned by the user to be removed, running a custom script, and other features. deluser and delgroup can be run in one of three modes:

Remove a normal user

If called with one non-option argument and without the –group option, deluser will remove a normal user.

By default, deluser will remove the user without removing the home directory, the mail spool or any other files on the system owned by the user. Removing the home directo[……]

READ MORE

「apt-file」

apt-file,该软件包包含了一系列的命令,用于在Debian软件包中某个的文件。
软件包简述
search for files within Debian packages apt-file is a command line tool for searching files contained in packages for the APT packaging system. You can search in which package a file is included or list the contents of a package without installing or fetching it.
软件包文件列表
/etc/apt/apt-file.conf /etc/bash_completion.d/apt-file
/usr/bin/apt-file
/usr/bin/diffindex-download /usr/bin/diffindex-rred
/usr/share/apt-file/apt-file-update.update-notifier /usr/share/apt-file/do-apt-file-update /usr/share/apt-file/is-cache-empty
/usr/share/doc/apt-file/README /usr/share/doc/apt-file/changelog.gz /usr/share/doc/apt-file/copyright
/usr/share/man/man1/apt-file.1.gz /usr/share/man/man1/diffindex-download.1.gz /usr/share/man/man1/diffindex-rred.1.gz
参考文献

apt-file list apt-file
apt-cache show apt-file[……]

READ MORE

「apt-utils」

apt-extracttemplates apt-ftparchive apt-sortpkgs

章节列表
「apt-sortpkgs(1)」-[……]

READ MORE