Skip to content

Instantly share code, notes, and snippets.

@xiaoxiangmoe
Last active September 11, 2017 16:07
Show Gist options
  • Save xiaoxiangmoe/3e9019e4bb775b84be690f276db3cec3 to your computer and use it in GitHub Desktop.
Save xiaoxiangmoe/3e9019e4bb775b84be690f276db3cec3 to your computer and use it in GitHub Desktop.
Test Gist

Linux 学习第一天

前期准备

趁腾讯云一元学生优惠机还没有过期,我重新安装了一下腾讯云的系统,换成了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变身。)

安装 Oh My Zsh

这时候,我们先用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

成功啦。

小插曲1——sudo的PATH变量

诡异的which和sudo which

我发现不管在root用户环境下,还是在xiang用户环境下,我的which zshsudo 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命令。

➜  ~ 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

secure_path

所以,我们打开关于sudo的配置文件/etc/sudoers看,果然,在其中找到了一行:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

在网上找到了对其的解释

当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。

啊,今天又捡到了个新知识,每次用sudo的时候,环境变量会变哦。

小插曲2——PATH变量没有\bin?

我们搞完了上面一大堆,我发现了另一个神奇的事实——用户(包括root用户和普通用户)的$PATH 没有\bin 目录啊。啊,没见过这种套路啊。于是在se上面提了个微小的问题

大佬就是大佬,直接给了我红帽的解释,涉及引导过程中的initramfs。啊,我还是萌新啊,先挖个坑,放一放吧。

不过我知道了

➜  ~ ll /bin
lrwxrwxrwx. 1 root root 7 Jun 11 19:47 /bin -> usr/bin

这里是一个软链接。涉及到了几个小知识点

  • 硬链接不能对目录创建;(所以这里是软链接)
  • 软链接可交叉文件系统;
  • 软链接可对文件或目录创建;
  • 软链接有自己的文件属性及权限等;

小插曲3——无法sudo 重定向

我在操作中试着

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了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment