创建CentOS启动屏幕逻辑
分发捆绑软件时,您有多个选项,但是如果我们不包括Docker和Kubernetes等花哨的新手,那么您将有以下选项:安装程序(用于Windows)、相应发行版的包(rpm或Deb)、带有创建必要配置的安装外壳脚本的tarball和虚拟机(或虚拟设备)。
所有这些选项都适用于不同的场景,但是分发现成的虚拟机映像被认为是企业软件的标准。您的机器有它所需要的所有依赖项(因为它可能不允许连接到Interenet),而且它只需要被激活。
但通常情况下,您需要一些初始配置,或者至少能够向用户展示如何连接(通常是基于Web的)应用程序。因此,创建一个启动屏幕是许多公司所选择的。下面是在CentOS上实现这一目标的简单方法,这是我的首选版本。(关于这一专题还有其他资源。这一个,但是它依赖于/etc/inittab,它在CentOS 8中不受欢迎)。
|
1
2
3
4
5
6
7
8
9
|
useradd startup -myum -y install dialogsed -i -- "s/-o '-p -- \\u' --noclear/--autologin startup --noclear/g" /usr/lib/systemd/system/getty@.servicechmod +x /install/startup.shecho "exec /install/startup.sh" >> /home/startup/.bashrcsystemctl daemon-reload |
使用上面的代码,您将创建一个启动用户,并在常规登录提示符之前自动登录该用户。替换Exec(如Getty@.service中的Exec)就是这样做的。
然后,脚本将对启动bash脚本的调用添加到.bashrc,当用户登录时将运行.bashrc。这个脚本所做的完全取决于您,下面是一个使用对话框命令(我们刚刚安装在上面)的简单演示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/bin/sh# Based onHEIGHT=15WIDTH=70CHOICE_HEIGHT=4BACKTITLE="Your Company"TITLE="Your Product setp"BIND_IP=`ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'` --backtitle "$BACKTITLE" \ --title "$TITLE" \ --msgbox "$INFO" \ $HEIGHT $WIDTH \ 2>&1 >/dev/tty)clearecho 'Enter password for user "root":'su root |
此对话框只显示一些基本信息,但您可以将其扩展到允许用户进行选择和输入一些参数。更重要的是,它获取当前IP地址并显示给用户。这不是他们自己不能在其他方面做的事情,但表现出来更友好。而且你不能硬编码,因为在每个安装中,它都有一个不同的IP(即使不使用DHCP,你也应该让用户设置他们分配的静态IP,而不是强迫他们安装一个IP)。在脚本的末尾,它切换到根用户。
https://www.douban.com/note/810545419/
这里必须考虑安全性--您的启动用户不应该被允许在系统中做任何有意义的事情,因为它是在没有密码的情况下自动登录的xec排序-of解决了这个问题(例如,当您输入错误的根密码时,您将返回startup.sh脚本,而不是控制台)。
我同意这是一个罕见的用例,但我想我应该分享这个“神秘”的知识。
这是个不错的特征。几年前,我在Scala中使用过它,其他语言也有它,所以在Java中引入它似乎是一件轻而易举的事情。
但是,语法糖(请不要争论这是否正是语法糖)是有问题的,并导致“句法糖尿病”。它有两个可能的问题。
不太重要的是一致性--如果你能以多种同样有效的方式做一件事,那就会在代码中引入不一致,以及“正确的
https://m.douban.com/mip/note/810545419/
做事方式”的毫无意义的论点。在这个上下文中,对于2行字符串,是否使用文本块?您是否应该对简单字符串执行多行格式设置?您是否应该将校验样式规则配置为拒绝一个或另一个选项,以及在何种情况下?
第二个也是更大的问题是代码可读性。我知道这听起来有悖常理,但请容忍我。VLAD给出的示例说明-您想在Java代码中有一个20行的SQL查询吗?我会说不-你最好把它提取到一个单独的文件,并使用某种形式的模板,填充正确的值。在浏览代码时,这当然是可读的:
|
1
2
3
4
5
|
String query = QueryUtils.loadQuery("age-query.sql", timestamp, diff, other);// orString query = QueryUtils.loadQuery("age-query.sql", Arrays.asList("param1Name", "param2Name"), Arrays.asList(param1Value, param2Value); |
查询可以放在/src/main/resources中,并由QueryUtils。而且,由于以前缺少文本块,所以您不喜欢代码中丑陋的字符串连接查询。
但是现在,有了这个特性,您就可以尝试这样做了,因为它看起来很好。Elasticsearch查询、JSON模板和诸如此类的情况也是如此。有了这个“糖”,你就会有更多的动机把它们放到代码中,在那里,它们可以说降低了代码的可读性。如果您确实需要调试查询,而不是根据其名称来假设其语义并依赖于适当的实现,则可以轻松地转到age-query.sql并与之合作。就像提取包含一些实现细节的私有方法一样,这样可以使调用方法更加可读性和易于跟踪。
https://www.douban.com/doulist/143615472/
这两个问题都体现在我的Scala经历中,我在演讲中总结了这一点(只有幻灯片可用)。Scala允许您以多种方式很好地表达事物,这在某些情况下会导致不一致和可怕的代码可读性。
反过来说,有时语法的改进可能会对代码的可读性造成更大的影响。因为它们带来了复杂性,也因为它们使得做错事变得更容易。
这不是一个普遍的抱怨,当然,语法糖是必要的-你不需要写List<String> list = new ArrayList<String>()如果你能用钻石操作符。但是,每个这样的特性都应该得到充分的考虑,不仅仅是因为它使编写代码变得多么容易,而且还在于阅读它是多么容易,更重要的是,它激励了哪种类型的代码。

浙公网安备 33010602011771号