趁腾讯云一元学生优惠机还没有过期,我重新安装了一下腾讯云的系统,换成了CentOS 7.3
然后在Windows上把PuTTY的字体换成了be5大大的Inziu Iosevka。啊,准备好了,开搞
首先进入root,创建账号
sudo useradd -d "/home/xiang" -m -s "/bin/bash" xiang
然后改密码,注意,我们只能在root环境中改用户密码
passwd xiang
然后,我们需要让xiang可以获取root权限,在centos中,我们需要将其放于wheel组中。
Wheel这个用法来源于TENEX/TOPS-20也就是pdp-10的操作系统,在上面超级用户叫WHEEL, 这个来源于big wheel这个俚语,也就是"大人物"的意思。
我们输入
usermod -G wheel xiang
然后xiang就拥有了sudo变身为root的资格了。
这时候,我们退出登录,换为xiang来登录。
(其实,用root登录是非常不好的一件事情,因为登录后可以为所欲为。我们尽量要用普通账户登录,只有在需要的时候才用sudo变身。)
这时候,我们先用yum安装git,zsh
,然后我们按照oh my zsh网站的说明安装ohmyzsh。
等到安装好了ohmyzsh,我们再把xiang登录的默认shell改为zsh
首先,我们找到zsh的位置,使用
which zsh
这时候终端告诉我其位于
/usr/bin/zsh
于是我切换终端到zsh
chsh -s /usr/bin/zsh
系统告诉我
Changing shell for xiang.
chsh: "/usr/bin/zsh" is not listed in /etc/shells.
Use chsh -l to see list.
还有这种操作啊? 于是我看了一下chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh
果然没有"/usr/bin/zsh"。但是我们有"/bin/zsh"
输入
chsh -s /bin/zsh
成功啦。
我发现不管在root用户环境下,还是在xiang用户环境下,我的which zsh
和sudo which zsh
都是不一样的结果(下面我只列出在xiang用户下的结果)
➜ ~ which zsh
/usr/bin/zsh
➜ ~ sudo which zsh
/bin/zsh
这很有趣哎,我第一反应是,查PATH环境变量。
➜ ~ echo $PATH
/usr/local/bin:/usr/bin:/home/xiang/bin:/usr/local/sbin:/usr/sbin
➜ ~ sudo echo $PATH
/usr/local/bin:/usr/bin:/home/xiang/bin:/usr/local/sbin:/usr/sbin
居然是一毛一样的。然后群里的同学和我说“环境变量是shell展开的”。于是我去验证一下
➜ ~ export MYNAME="my name is xiang"
➜ ~ echo $MYNAME
my name is xiang
➜ ~ sudo echo $MYNAME
my name is xiang
果然如此。
于是,我采用了
➜ ~ su - root -c "echo \$MYNAME"
Password:
没有输出,啊成功了。通过 su - -c
就可以把环境变量的展开放到一个新的用户那里去做了。
实际上,还有更好的解决方案,用env命令。
➜ ~ env|grep PATH
PATH=/usr/local/bin:/usr/bin:/home/xiang/bin:/usr/local/sbin:/usr/sbin
➜ ~ sudo env|grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
➜ ~ su - -c "env|grep PATH"
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
➜ ~ su - -c "sudo env|grep PATH"
PATH=/sbin:/bin:/usr/sbin:/usr/bin
这里可以得到一个规律……只要涉及到sudo
,我们的PATH
就变成了/sbin:/bin:/usr/sbin:/usr/bin
。
所以,我们打开关于sudo的配置文件/etc/sudoers
看,果然,在其中找到了一行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
在网上找到了对其的解释
当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。
啊,今天又捡到了个新知识,每次用sudo的时候,环境变量会变哦。
我们搞完了上面一大堆,我发现了另一个神奇的事实——用户(包括root用户和普通用户)的$PATH
没有\bin
目录啊。啊,没见过这种套路啊。于是在se上面提了个微小的问题。
大佬就是大佬,直接给了我红帽的解释,涉及引导过程中的initramfs
。啊,我还是萌新啊,先挖个坑,放一放吧。
不过我知道了
➜ ~ ll /bin
lrwxrwxrwx. 1 root root 7 Jun 11 19:47 /bin -> usr/bin
这里是一个软链接。涉及到了几个小知识点
- 硬链接不能对目录创建;(所以这里是软链接)
- 软链接可交叉文件系统;
- 软链接可对文件或目录创建;
- 软链接有自己的文件属性及权限等;
我在操作中试着
sudo which zsh >> /etc/shells
这时候,又出现了一个坑
zsh: permission denied: /etc/shells
这是因为sudo只作用在which zsh,而 >>
是shell的一个功能,并没有获取到root权限。
这时候,我们有两种处理方法。一种是,让整条命令获取root权限。
sudo sh -c "which zsh >> /etc/shells"
这会添加/bin/zsh
还有一种方法是让重定向的append获取root权限
which zsh | sudo tee -a /etc/shells
这会添加/usr/bin/zsh
添加的东西不一样是因为神奇的secure_path。
今天,在神奇的新系统下,终于安装上了ohmyzsh。途中,见到了神奇的secure_path,还有Red Hat Enterprise Linux 7搞的New layout for root file system,还有sudo的重定向的权限问题。也还算是有一点点收获。 明天我要开始正经学Linux了。