目录
一、解释型语言和编译型语言
1.1 python解释器
1.2 下载软件
1.2.1 wget
1.2.2 curl
1.2.3 区别
二、判断用户是否存在
2.1 id
2.2 cat /etc/passwd
2.2.1 grep
2.3 用户的家目录
2.3.1【用户可以没有家目录】
2.3.2【用户的家目录不在/home】
2.3.3 删除用户
2.3.4 切换用户的注意事项
三、【前提】重定向
3.1 标准输入和标准输出
3.2 设置用户密码
3.3 脚本练习
3.3.1 if和$?
3.2.1 shell完成
3.3 输入输出重定向
3.3.1 &>
3.3.2 Linux操作系统的理论知识
3.3.3 交互式硬件设备
3.3.4 终端(w)
3.3.5 利用重定向从一个终端输出到另一个终端
3.3.6 ulimit 查看Linux内核的限制参数
四、练习(补充:kill)
4.1 kill:踢出其他非法登录Linux系统的用户
4.2 ssh远程登录
五、【使用】重定向
5.1 标准正确输出重定向 >
5.2 标准输出追加重定向 >>
5.2.1 复制文件内容粘贴到另一个文件
5.2.2 合并两个文件内容
5.3 标准错误输出重定向 2>
5.4 同时使用1>和2>
5.5 清空文件但不删除
5.6 正确和错误输出重定向
5.7 标准的输入重定向
5.8 here document(即
5.8.1 将键盘输入的内容重定向到一个文件里
5.8.2 生成一个指定内容的文件
5.9 tee
六、设备文件
6.1 /dev/null
6.2 /dev/zero
七、read隐藏输入的密码
c语言--编译型:一次性编译成二进制文件,然后执行二进制文件,跟源代码文件无关。
如果c语言源代码文件进行了修改,必须要重新编译,生成新的二进制文件,然后去执行新的二进制文件。
python--解释型:一行一行代码的去解释执行,只要源代码有更新就会重新根据源代码一行一行解释
【c的速度要比python快】
pypy、Cpython(用c语言写的)、Ipython、Jpython、Ironpython
【安装wget】yum install wget -y
wget是Linux下的下载文件,类似于Linux里的迅雷。默认下载的软件存放在当前文件夹下。
【使用】wget + 链接地址
curl是Linux下的字符界面的浏览器,也可以下载软件
【使用】curl -O +链接地址
wget:纯下载软件,需要自己安装
curl:Linux里的浏览器,默认就有,无需安装
查看用户的信息,可以用来判断用户是否存在
[root@localhost sanchuang]# id lihua321 uid=1012(lihua321) gid=1012(lihua321) 组=1012(lihua321) / [root@localhost sanchuang]# id li id: li: no such user ==》说明用户不存在
一行一个用户
[root@localhost sanchuang]# cat /etc/passwd | grep lihua ==》和管道符号和过滤命令配合,判断用户lihua是否存在(不准确) lihua:x:1008:1008::/home/lihua:/bin/bash lihua321:x:1012:1012::/home/lihua321:/bin/bash [root@localhost sanchuang]# echo $? 0 [root@localhost sanchuang]# cat /etc/passwd | grep jinzh [root@localhost sanchuang]# echo $? 1
文本过滤,会根据字符串去匹配内容,如果一行里有匹配的字符串,就将整行输出到屏幕,如果没有找到就不输出。
useradd -r hanmeimei
-r 新建这个用户属于系统用户,不建立家目录
useradd -d /beijin xiaolihua
如此,用户xiaolihua的家目录就在/beijin
-d 指定家目录的位置,默认是放在/home下,可以放到其他地方
userdel -r xiaolihua
删除用户xiaolihua,并且删除用户的家目录
su - lihua
- 会加载新用户的环境变量,不使用上一个用户的环境变量
重新定义了他的输出方向。
改变命令的输出方向,本来标准输出往屏幕输出,重定向后命令就输出到文件。
不会影响命令的返回值
标准输入(STDIN):standard input ==》接受从键盘输入
给计算机输入内容的方式:键盘输入、语言、图形图像(生物信息识别)、文件
标准输出(STDOUT):standard output ==》都是输出到屏幕
其他输出方式:文件
1.正确的标准输出
2.错误的标准输出
标准输入和标准输出都是人和计算机在沟通交流方式上的确定。
常见的进程都会涉及标准输入和标准输出(系统调用和内核里的内容可能就没有标准输入和标准输出)
echo 是在屏幕上输出
| 管道符号:是将前面一个命令的标准输出送给后面的一个命令作为标准输入
--stdin 是passwd命令的选项:作用是告诉passwd 管道符号传来的内容是可以作为标准输入使用的
【非交互式设置密码】
[root@localhost sanchuang]# useradd shijunhao ==》新建用户shijunhao [root@localhost sanchuang]# echo |passwd shijunhao --stdin ==》给用户shijunhao设置密码 更改用户 shijunhao 的密码 。 passwd:所有的身份验证令牌已经成功更新。
【交互式设置密码】
[root@localhost sanchuang]# passwd shijunhao 更改用户 shijunhao 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。
(在编写脚本时,常用非交互式设置密码,给用户设置密码)
题目:接受用户输入的用户名和密码,帮助新建用户,并且设置密码。
(v2版本)(添加功能)如果用户名存在,就提醒用户重新输入,如果用户名不存在就新建。
可以使用shell或者python
1.【if语句的语法】
if 命令 then 命令1 ==>命令执行成功时执行 else 命令2 ==>命令执行失败时执行 fi
2.echo $?
输出上一条命令的返回值。为0时,表示执行成功;非0时,表示执行失败。
常见的非0返回值:1,2,127
127 表示命令不存在
1 表示命令执行失败,参数或者选项不对
2 表示命令执行失败,选项不对
[root@localhost sanchuang]# echo $? 0 [root@localhost sanchuang]# id jinzhi id: jinzhi: no such user [root@localhost sanchuang]# echo $? 1
【需求分析】
接受用户输入:read
新建用户:useradd
设置密码:passwd
脚本名字:create_user_pwd.sh
[root@localhost sanchuang]# vim create_user_pwd.sh [root@localhost sanchuang]# cat create_user_pwd.sh #!/bin/bash #接受用户的输入 read -p "请输入用户名:" u_name read -p "请输入需要给用户设置的密码:" u_pwd #新建用户和设置密码 useradd $u_name echo $u_pwd | passwd $u_name --stdin [root@localhost sanchuang]# bash create_user_pwd.sh 请输入用户名:lihua321 请输入需要给用户设置的密码: 更改用户 lihua321 的密码 。 passwd:所有的身份验证令牌已经成功更新。 [root@localhost sanchuang]# id lihua321 uid=1012(lihua321) gid=1012(lihua321) 组=1012(lihua321) / [root@localhost sanchuang]# id li id: li: no such user
👍shell脚本在执行的时候时从上而下,一条一条执行,中间某条命令执行失败,后面的命令依然会执行。
👍python脚本在执行的时候时从上而下,一条一条执行,中间某条命令执行失败,后面的命令不会执行。
[root@localhost sanchuang]# bash create_user_pwd.sh 请输入用户名:lihua321 请输入需要给用户设置的密码:12345 useradd:用户“lihua321”已存在 更改用户 lihua321 的密码 。 passwd:所有的身份验证令牌已经成功更新。
【v2版本】
[root@localhost sanchuang]# cat create_user_pwd.sh #!/bin/bash #接受用户的输入 read -p "请输入用户名:" u_name #新建用户和设置密码 #if是判断用户是否存在,存在给予提醒,不存在就新建并设置密码 if id $u_name &>/dev/null then echo "用户 $u_name 存在" else useradd $u_name echo $u_pwd | passwd $u_name --stdin read -p "请输入需要给用户设置的密码:" u_pwd fi
&>/dev/null
不管正确的还是错误的输出,都重定向到文件/dev/null/
/dev/null是一个特殊文件,任何内容重定向到这个文件,都不会保存,自动消失。
/proc 存放Linux内核信息的地方。外面的用户可以通过/proc文件夹去访问内存里的信息。processes
/proc里的信息是存放在内存里的,停电会丢失。
里面数字文件夹是每个进程的信息
cpuinfo =》cpu的基本信息 information
meminfo ==》 内存的基本信息
内核 kernel:Linux系统最核心的软件
echo $$
当前shell的进程号:当前xshell里的终端的pid号(进程号)
[root@localhost sanchuang]# ll /dev/std* lrwxrwxrwx. 1 root root 15 3月 20 14:51 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx. 1 root root 15 3月 20 14:51 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx. 1 root root 15 3月 20 14:51 /dev/stdout -> /proc/self/fd/1
Linux里一切皆文件 =》任何硬件(包括屏幕等)都会有一个文件和它对应
[root@localhost fd]# ll /dev/stdin lrwxrwxrwx. 1 root root 15 3月 20 14:51 /dev/stdin -> /proc/self/fd/0 [root@localhost fd]# ll /proc/self/fd 总用量 0 lrwx------. 1 root root 64 3月 23 10:31 0 -> /dev/pts/0 lrwx------. 1 root root 64 3月 23 10:31 1 -> /dev/pts/0 lrwx------. 1 root root 64 3月 23 10:31 2 -> /dev/pts/0 lr-x------. 1 root root 64 3月 23 10:31 3 -> /proc/21604/fd
/dev/stdin (链接)==> /proc/self/fd/0 (链接)==> /dev/pts/0
/dev/pts/0 终端设备的文件名
w 查看当前Linux登录的用户情况
[root@localhost ~]# w 12:48:53 up 1 min, 2 users, load average: 0.22, 0.10, 0.04 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 12:48 45.00s 0.01s 0.01s -bash root pts/0 192.168.255.1 12:48 5.00s 0.01s 0.00s w
12:48:53 表示当前时间
up 1 min 表示开机启动多长时间。
2 users 表示两个用户登录
TTY 表示终端类型。
终端:面向最终用户的端口
tty1 ==》直接登录操纵的第1个终端。--正式员工---真正的终端
Linux里最多允许6个可以直接登录的终端(tty1~tty6)
【开启tty终端】ALT+F2(F3、F4、F5、F6) ==> tty2(tty3、tty4、tty5、tty6)。
某个终端卡住可以打开另一个终端。
pts/0 ==》/dev/pts文件夹下的第0个终端文件
pts文件夹下是远程登录过来的终端类型:仿终端---模拟终端---临时工(数量不受限制)
【开启】复制标签可以产生(pts/1、pts/2……)
WHAT 表示用户登录进入Linux系统,正在使用的命令
FROM 表示用户从哪里登录过来的
192.168.255.1 从这个ip地址远程登录过来的
- 表示本地直接登录
往/dev/pts/1这个文件里输入内容,对应/dev/pts/1这个bash进程会收到相应消息
[root@localhost pts]# echo "hello,lihua" >/dev/pts/1
wall 广播输出
普通用户不可以,权限不够(root用户才可以)
[root@localhost pts]# wall hello
3.3.6 fd(文件描述符)
file descriptor
文件描述符:Linux内核给每个进程创建了一个文件描述符表,这个表里记载这个进程打开的所有文件。
为了方便进程知道自己打开了哪些文件,就给每个文件进行了编号,这个编号就是文件描述符。
进程对文件进行读写操作的时候,就直接使用对应的编号了,不再使用文件名。
每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。【详情链接:文件描述符 - 简书】
[root@localhost proc]# echo $$ 7963 [root@localhost proc]# cd 7963 [root@localhost 7963]# ls attr cwd map_files oom_adj schedstat task autogroup environ maps oom_score sessionid timers auxv exe mem oom_score_adj setgroups uid_map cgroup fd mountinfo pagemap smaps wchan clear_refs fdinfo mounts patch_state stack cmdline gid_map mountstats personality stat comm io net projid_map statm coredump_filter limits ns root status cpuset loginuid numa_maps sched syscall [root@localhost 7963]# cd fd [root@localhost fd]# ls 0 1 2 255 [root@localhost fd]# ll 总用量 0 lrwx------. 1 root root 64 3月 21 18:14 0 -> /dev/pts/0 lrwx------. 1 root root 64 3月 21 18:14 1 -> /dev/pts/0 lrwx------. 1 root root 64 3月 21 18:14 2 -> /dev/pts/0 lrwx------. 1 root root 64 3月 21 23:12 255 -> /dev/pts/0
内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。
0 ==》标准输入 ==》 /dev/pts/0
1 ==》标准正确输出 ==》 /dev/pts/0
2 ==》标准错误输出 ==》 /dev/pts/0
只要有输入输出的程序,他都有0 1 2 这3个文件描述符【对应的都是同一个文件,只是有不同的编号】
Linux操作系统默认一个进程只能打开1024个文件
所以默认的文件描述符的范围:0~1023
[root@localhost pts]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7183 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 ==》对一个进程可以打开多少个文件进行限制
【临时修改】
[root@localhost pts]# ulimit -n [root@localhost pts]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7183 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) [root@localhost pts]# ulimit -n
# 1 alt + F1~F6 # 2 ulimit -n # 3 w
sshd服务是提供远程登录Linux的服务
剔除用户的本质就是杀死进程
利用w查看终端,根据用户的终端来找到对应的bash进程,然后kill这个bash进程
ps aux | grep pts/1 ==》过滤找到对应进程号
[root@localhost pts]# ps aux | grep pts/1 root 3090 0.0 0.3 6120 ? Ss 13:46 0:00 sshd: root@pts/1 root 3098 0.0 0.1 2076 pts/1 Ss+ 13:46 0:00 -bash root 14343 0.0 0.0 980 pts/0 S+ 21:01 0:00 grep --color=auto pts/1 [root@localhost pts]# kill -9 3098 [root@localhost pts]# w 21:05:31 up 8:17, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 12:48 7:29m 0.05s 0.05s -bash root pts/0 192.168.255.1 12:48 3.00s 0.06s 0.01s w
kill 是Linux杀死进程的命令
-9 是发送强制杀死进程的信号,告诉Linux内核强制杀死进程
信号 是进程和进程之间通信的方式
# 查看Linux里有哪些信号问题 [root@localhost pts]# kill -l
9) SIGKILL signal kill 杀死进程的信号,强制杀死,必定会杀死进程
15) SIGTERM signal terminate 终结信号:让进程自己杀死自己,可能有的进程会不执行
(不接-9,默认是-15)
ssh 是远程登录的命令
ssh IP地址 ==》Linux里使用ssh命令远程登录到其他机器里
将标准输出到屏幕上的内容重定向到文件里,如果文件不存在就会自动新建,如果文件存在就覆盖里面的内容。
> 和 1> 是等价的
[root@localhost lianxi]# echo 1342 > 1.txt [root@localhost lianxi]# cat 1.txt 1342 [root@localhost lianxi]# echo dsfho 1> 1.txt [root@localhost lianxi]# cat 1.txt dsfho
不同用户之间使用重定向沟通交流
核心:往对方的标准输出的文件里重定向,就会出现在对方的屏幕上
将标准输出到屏幕上的内容追加重定向到文件里,如果文件不存在就会自动新建,如果文件存在就不覆盖里面的内容,只是在末尾追加。
[root@localhost lianxi]# cat 1.txt dsfho [root@localhost lianxi]# ls >> 1.txt [root@localhost lianxi]# cat 1.txt dsfho 1.txt backup_pwd_boot_log.sh backup_pwd.sh create_dir_v2.sh messages mkdir_file.sh passwd python-test sanchuang student.txt
任何有输出的命令都可以重定向
【示例】不使用cp命令将lihua.txt里的内容复制到lihong.txt里
[root@localhost lianxi]# cat lihua.txt lihua [root@localhost lianxi]# cat lihua.txt > lihong.txt [root@localhost lianxi]# cat lihong.txt lihua
[root@localhost lianxi]# cat lihua.txt lihua [root@localhost lianxi]# cat lihong.txt lihong [root@localhost lianxi]# cat lihua.txt lihong.txt > huahong.txt [root@localhost lianxi]# cat huahong.txt lihua lihong
2> 将标准错误输出到屏幕上的内容重定向到文件里,如果文件不存在就会自动新建,如果文件存在就覆盖里面的内容。
2>> 将标准错误输出到屏幕上的内容追加重定向到文件里,如果文件不存在就会自动新建,如果文件存在就不覆盖里面的内容,只是在末尾追加。
[root@localhost lianxi]# sakdfhsai -bash: sakdfhsai: 未找到命令 [root@localhost lianxi]# sakdfhsai 2>2.txt [root@localhost lianxi]# cat 2.txt -bash: sakdfhsai: 未找到命令 [root@localhost lianxi]# kkkkkkkk -bash: kkkkkkkk: 未找到命令 [root@localhost lianxi]# kkkkkkkk 2>>2.txt [root@localhost lianxi]# cat 2.txt -bash: sakdfhsai: 未找到命令 -bash: kkkkkkkk: 未找到命令
只会重定向错误的输出,如果将正确输出使用2>,那就会清空文件
[root@localhost lianxi]# cat 2.txt -bash: sakdfhsai: 未找到命令 -bash: kkkkkkkk: 未找到命令 [root@localhost lianxi]# echo 132 2> 2.txt 132 [root@localhost lianxi]# cat 2.txt [root@localhost lianxi]#
[root@localhost lianxi]# cat 1.txt [root@localhost lianxi]# cat 2.txt [root@localhost lianxi]# echo 1234 1>1.txt 2>2.txt ==》分流:正确的输出到1.txt,错误的输出到2.txt(会清空) [root@localhost lianxi]# cat 1.txt 1234 [root@localhost lianxi]# cat 2.txt [root@localhost lianxi]# echo1234 1>1.txt 2>2.txt [root@localhost lianxi]# cat 1.txt [root@localhost lianxi]# cat 2.txt -bash: echo1234: 未找到命令
[root@localhost lianxi]# cat huahong.txt lihua lihong [root@localhost lianxi]# >huahong.txt [root@localhost lianxi]# cat huahong.txt [root@localhost lianxi]#
&> 正确的和错误的都重定向到一个文件里,如果文件不存在就新建,如果存在就覆盖里面的内容。
&>> 正确的和错误的都重定向到一个文件里,如果文件不存在就新建,如果存在就不覆盖里面的内容,只是在末尾追加。
echo feng >feng.txt 2>&1 <==> echo feng &>feng.txt 两种方法等价
[root@localhost lianxi]# cat feng.txt [root@localhost lianxi]# echo feng >feng.txt 2>&1 [root@localhost lianxi]# cat feng.txt feng
从文件里导入内容给程序
[root@localhost lianxi]# wc /etc/passwd 33 43 1487 /etc/passwd [root@localhost lianxi]# wc < /etc/passwd 33 43 1487 [root@localhost lianxi]# cat > feng.txt << EOF > FENGZHENGTING > FANMINGYOU > EOF ==>结束的功能
文档就在这里,用于生成一个指定内容的文档
[root@localhost lianxi]# cat >abc.txt <<EOF 接受键盘输入,输入内容重定向到abc.txt文件里,遇到EOF停止输入 > FENG > FAN > linux > end > eof > EOF [root@localhost lianxi]# cat abc.txt FENG FAN linux end eof
EOF 结束标志 end of file 文件到这里结束(结束标志可以是其他的字符串,建议使用EOF或end)
[root@localhost lianxi]# cat >lihua.txt <<end > lihua > linux > EOF > END > end [root@localhost lianxi]# cat lihua.txt lihua linux EOF END
用于:生成一个指定内容配置文件,配置文件里的内容是我们提前准备好的
[root@localhost lianxi]# cd 0323 [root@localhost 0323]# ls [root@localhost 0323]# vim li_feng_fan.sh [root@localhost 0323]# cat li_feng_fan.sh #!/bin/bash #lihua cat >> /root/lianxi/0323/li_feng_fan.txt <<EOF lihua changsha fengxiaojie xiangtan fanxiansheng chengzhou EOF echo "#########################" cat /root/lianxi/0323/li_feng_fan.txt echo "#########################" [root@localhost 0323]# bash li_feng_fan.sh ######################### lihua changsha fengxiaojie xiangtan fanxiansheng chengzhou ######################### [root@localhost 0323]# ls li_feng_fan.sh li_feng_fan.txt
将内容重定向到文件,同时在屏幕上输出
[root@localhost 0324]# echo lihua | tee lihua.txt lihua [root@localhost 0324]# cat lihua.txt lihua
/dev/null 黑洞文件:葫芦文件,任何内容重定向到这个文件,都会消失,不保存
[root@localhost ~]# du -sh / du: 无法访问"/proc/18232/task/18232/fd/4": 没有那个文件或目录 du: 无法访问"/proc/18232/task/18232/fdinfo/4": 没有那个文件或目录 du: 无法访问"/proc/18232/fd/3": 没有那个文件或目录 du: 无法访问"/proc/18232/fdinfo/3": 没有那个文件或目录 2.0G / [root@localhost ~]# du -sh / 2>/dev/null 2.0G /
零产生器:能产生一堆0的文件
dd 是一个备份命令,也可以产生一个指定大小的文件
if 输入设备文件 input file
of 输出文件 output file
bs 单位时间里读写的数据的字节数:输出的数据的单位大小
count 输出数据的数量
【dd也可以用来测试磁盘的读写速度】
[root@localhost ~]# dd if=/dev/zero of=/root/lianxi/test.dd bs=1M count=100 记录了100+0 的读入 记录了100+0 的写出 字节(105 MB)已复制,0.0 秒,3.3 GB/秒 [root@localhost lianxi]# du -sh test.dd 100M test.dd
使用 -s 选项
不可以放在-p 和提示之间,那样会打断-p的功能
[root@localhost 0324]# vim create_user.sh [root@localhost 0324]# bash create_user.sh 请输入你的用户名:lihua 请输入你的密码: create user ok username is lihua and passwd is [root@localhost 0324]# cat create_user.sh #!/bin/bash # 接受用户名和密码 read -p "请输入你的用户名:" u_name read -s -p "请输入你的密码:" u_pwd echo # 新建用户 useradd $u_name &> /dev/null # 设置密码 echo $u_pwd | passwd $u_name --stdin &> /dev/null echo "create user ok" echo "username is $u_name and passwd is $u_pwd"