此链接通往 Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
root@zhengzelin:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
root@zhengzelin:~# echo $SHELL
/bin/bash
root@zhengzelin:~# bash # 进入当前 shell 的 子shell
root@zhengzelin:~# echo $SHLVL #查看当前 Shell 的层次(嵌套)
2
root@zhengzelin:~# exit # 退出 子Shell
exit
root@zhengzelin:~# echo $SHLVL # 再次查看
1
root@zhengzelin:~# cat /etc/passwd | awk '/root/ {print $0}'
root:x:0:0:root:/root:/bin/bash
# 第 7个字段为 此用户的shell类型
root@zhengzelin:~# cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"} /root/ {print $1,$7}'
root /bin/bash
root@zhengzelin:~# pstree -p | grep sshd
|-sshd(963)---sshd(24718)---bash(24743)-+-grep(25345)
# 上面有个sshd 这是因为我是通过 xshell 远程连接的!
root@zhengzelin:~# echo $PPID #查看当前shell 的父进程PID
24718
root@zhengzelin:~# echo $$ # 查看当前shell的 PID
24743
当前bash前并没有其他的bash,所以这是父shell!(父 shell 后面的 bash 为子shell)
然后我切换到 本地终端进行查看:
当前shell的父进程就是 login(login shell!)
所谓的 Login shell,指的就是当我们使用用户登录系统的时候,那个时候就称之为 " Login Shell "
Login Shell 其实就在 /etc/passwd 文件里就可以看见:
root@zhengzelin:~# cat /etc/passwd | awk '/root/ {print $0}'
root:x:0:0:root:/root:/bin/bash
# Login Shell 定义在第七个字段(也就是最后一个字段),如果为 nologin 或 false 则不可登录系统!
eg:
root@zhengzelin:~# cat /etc/passwd |awk 'BEGIN{FS=":";OFS="\t"} {print $NF;}'|awk '{a[$1]++} END{for(i in a) {print i}}'
[空] # ubuntu 登录默认为 /bin/sh
/bin/sync
/bin/bash
/bin/false # 无法登陆系统
/usr/sbin/nologin # 无法登录系统
学艺不精啊,不会直接截取 $NF 不等于 /bin/bash 的字段!求大佬教我一下!
糊涂了,可以使用 { grep -v $"/bin/bash" }
root@zhengzelin:~# cat /etc/passwd | grep aaa
aaa:x:1001:1001::/home/aaa:[空]
# 默认为空,当你使用 aaa 登录账户的时候,发现:登录的默认shell为 /bin/sh (我是Ubuntu系统)
$ echo $USER
aaa
$ echo $SHELL
/bin/sh
$ cat /etc/passwd | grep aaa
aaa:x:1001:1001::/home/aaa:[没有指定shell]
解决:
"方法1":在创建用户的时候:useradd (username) -s /bin/bash(或 其他shell)
"方法2": 当你已经创建了用户:usermod (username) -s /bin/bash(或 其他shell)
eg:
root@zhengzelin:~# usermod aaa -s /bin/bash
root@zhengzelin:~# cat /etc/passwd | grep aaa
aaa:x:1001:1001::/home/aaa:/bin/bash
1、首先 查看你的系统支持哪些shell?
root@zhengzelin:~# cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
root@zhengzelin:~# echo $SHELL
/bin/bash
注意,此命令修改的 shell 环境只对当前用户生效,就算你在root下修改,其他用户还是他自己的 shell 环境!
root@zhengzelin:~# chsh
Changing the login shell for root
Enter the new value, or press ENTER for the default
Login Shell [/bin/bash]: /bin/sh
[当前登录的shell:/bin/bash]:[修改后的shell:/bin/sh]
root@zhengzelin:~# echo $SHELL # 不是立即生效
/bin/bash
root@zhengzelin:~# logout # 需要注销用户再次连接生效
[C:\~]$
Connecting to xxx.xxx.xxx.xxx:22...
# echo $SHELL # /bin/sh 里面的命令行是这样的格式!
/bin/sh
切换回 /bin/bash 还是老方法,不能使用 logout 的话 直接使用 exit退出
与上面的结果是一样的,都只对当前用户生效,只不过换种方法:
# chsh -s /bin/bash
# exit
root@zhengzelin:~# echo $SHELL
/bin/bash
当前你得在 root 账号才有此权限!
root@zhengzelin:~# cat /etc/passwd | grep aaa
aaa:x:1001:1001::/home/aaa:/bin/bash
正常的时候,aaa用户登录主机的 shell 环境 是bash!
"现在在root账号上,为 aaa用户 切换它的 shell环境!"
eg:
root@zhengzelin:~# chsh -s /bin/sh aaa(username)
root@zhengzelin:~# cat /etc/passwd | grep aaa
aaa:x:1001:1001::/home/aaa:/bin/sh # 很清楚的看见已经变为 /bin/sh 了