我想要运行一个脚本(bash 或 python),以简单的格式打印用户登录时所有系统服务的状态。
service --status-all
上述命令将它们全部输出到一个列表中,如下所示
[+] servicename
[?] servicename
[-] servicename
当用户登录时,脚本应该提供有关正在运行的服务的人性化消息。
我知道可能有一些实用程序可以做到这一点,但我想了解更多有关脚本的知识以及如何完成一件事。
任何帮助深表感谢。
答案1
如果你想要如下输出:
The following services are running: ntp, rsync, ssh,
您可以使用awk
来转换输出service --status-all
:
$ service --status-all | awk '/+/{printf "%s", sep " " $NF; sep=","}'
acpid, alsa-utils, apache-htcacheclean, apache2, apparmor, apport, atd, avahi-daemon, cron, cups-browsed, dbus, grub-common, irqbalance, keyboard-setup, kmod, lightdm, network-manager, networking, ondemand, procps, rc.local, resolvconf, rsyslog, speech-dispatcher, ssh, udev, ufw, urandom, whoopsie
因此你的脚本看起来应该是这样的:
#! /bin/sh
printf "The following services are running: "
service --status-all | awk '/+/{printf "%s", sep " " $NF; sep=","}'
echo
命令awk
很简单:
/+/
匹配+
其中带有 的行。通常,+
表示一个或多个前面的表达式。但是, 本身+
就表示。如果此模式匹配,+
Awk 将运行以下块。{...}
printf "%s" sep " " $NF
打印变量的内容sep
,后跟一个空格,后跟行的最后一个字段(NF
是字段数,$x
是字段号 x 的内容)。sep
一开始是空的,所以要打印的第一个服务前面只有一个空格。现在我设置了sep=","
,所以下一行开始,我们就有了一个,
。- 这不会打印换行符,因此我
echo
在末尾使用一个简单的换行符来打印一个。
现在使用如下方法:为所有用户在 shell 登录时运行脚本在登录时运行脚本。