【若泽大数据实战第三天】Linux命令进阶
1.查看历史命令:
history查看
!255 表示执行第255行的命令
用这个 echo "" > ~/.bash_history 可以清空历史命令 清空后 当前session是不生效的 在新的session查看的时候 历史的命令是被清空了
用root用户登录系统后,可以查看xxx用户所使用的命令: /home/xxx/.bash_history
生产环境下一般是这样的:是内网,不能连外网,如果要连生产,则需要堡垒机进行连接
堡垒机 跳板机的区别
2.用户,用户组的常用命令
ll /usr/sbin/user* *代表模糊匹配
这个可以看
[[email protected] ~]# ll /usr/sbin/user*
-rwxr-x---. 1 root root 103096 Dec 8 2011 /usr/sbin/useradd
-rwxr-x---. 1 root root 69560 Dec 8 2011 /usr/sbin/userdel
-rws--x--x. 1 root root 42384 Aug 23 2010 /usr/sbin/userhelper
-rwxr-x---. 1 root root 98680 Dec 8 2011 /usr/sbin/usermod
-rwsr-xr-x. 1 root root 9000 Nov 23 2013 /usr/sbin/usernetctl
[[email protected] ~]# ll /usr/sbin/group*
-rwxr-x---. 1 root root 54968 Dec 8 2011 /usr/sbin/groupadd
-rwxr-x---. 1 root root 46512 Dec 8 2011 /usr/sbin/groupdel
-rwxr-x---. 1 root root 50800 Dec 8 2011 /usr/sbin/groupmems
-rwxr-x---. 1 root root 61360 Dec 8 2011 /usr/sbin/groupmod
一个用户可以属于多个用户组 但是必须有一个主组
[[email protected] ~]# useradd ruoze 自动创建一个用户组
[[email protected] ~]# id jerry 可以查看用户的相关信息
uid=500(jerry) gid=500(jerry) groups=500(jerry)
uid:user id用户id
groups:创建了一个组 组的ids 500 组的名称是jerry
gid:组的主组 主组id是500 名称是jerry
创建了jerry用户后,系统会在/home下面创建它的家目录
家目录下面会创建配置文件:
创建用户的同时,它会在/etc/passwd文件插入一行记录
cat /etc/passwd :
用户jerry 用户id为500 主组id为500 jerry的家目录为/home/jerry 用/bin/bash来执行
创建用户jerry之前它会先创建组jerry,然后把用户jerry放到组jerry里面
创建组的时候,它会在/etc/group里面插入一条记录
cat /etc/group :
创建的组为jerry 组的id为500
如果去删除用户jerry,去执行userdel jerry
那么:在/etc/passwd里面的jerry的那条记录也会被删除
在/etc/group里面的那条带有jerry组的记录也会被删除(如果在一个组里面就一个用户,而恰巧这个用户被删除了,那么这个组也会被删除,但是如果这个组里面有多个用户,其中某一个用户被删除了,那么这个组是不会被删除的。)
但是虽然执行了 userdel jerry 删除了用户jerry 它的家目录还在的,是没有删除的。
删除用户ruozehou 如果再重新创建:
重新创建
[[email protected] home]# useradd ruoze
useradd: warning: the home directory already exists. (提示家目录已经存在)
Not copying any file from skel directory into it. (家目录里的隐藏文件不需要copy)
Creating mailbox file: File exists
[[email protected] home]#
[[email protected] home]# id ruoze
uid=501(ruoze) gid=501(ruoze) groups=501(ruoze)
增加一个组:bigdata的命令 :
groupadd bigdata
现在要把jerry这个用户加入到bigdata这个组里面:
usermod -a -G bigdata jerry
-a 表示追加 这个语句表示修改jerry这个用户 把用户jerry加入到bigdata这个组里面
从上图可以看到,用户jerry,属于两个组,jerry和bigdata,主组为jerry
如果想修改用户jerry的主组为bigdata,命令为:
usermod -g bigdata jerry
3.设置密码 命令:
passwd jerry 为jerry用户设置密码
4.切用户
切换到jerry用户 su - jerry
- 代表切用户后,进该用户的家目录且执行 环境变量文件
切换用户后,先进入家目录,然后执行当前用户的环境变量(面试题)
如果不加横杠,直接这样:su jerry 的话:
像上图一样,只是切换了用户目录还停留在/root这个目录
而且没有执行jerry的环境变量,比如说,如果你之前在jerry用户下设置了一个环境变量,alias rzcd=' cd /root/ruozedata/',那么它没有执行环境变量,就没有rzcd这个命令了。
5.普通用户临时获取root最大权限
普通用户一般没有权限去执行root用户下特定的权限的。
比如:在jerry用户下,访问/root/目录 是没有权限的。
这个时候需要先回到root用户,编辑一下/etc/sudoers这个文件,
找到这一行:root ALL=(ALL) ALL
然后在下面添加一行:jerry ALL=(root) NOPASSWD:ALL
如下图:
然后保存,但是保存的时候,不让保存,因为是只读文件,这个时候需要加个!,也就是:wq!即可。
然后再切换到,jerry用户,用sudo命令即可:
su - jerry
sudo ls /root/
6.管道符
如果查看某个东西,比如cat /etc/passwd 发现里面有很多东西,几千行,但是你只想找带有jerry的那些行,你可以这样:
cat /etc/passwd | grep jerry
| 为管道符 grep表示过滤
前面查询的结果作为后面的输入,用grep进行过滤
7.从当前用户推出到上一个用户,用exit就可以了。
[[email protected] ~]# su - jepson
[[email protected] ~]$ exit
logout
[[email protected] ~]#
8.进程 + 端口号
ps -ef | grep xxx
[[email protected] ~]# ps -ef | grep tail
root 2425 1779 0 20:39 pts/0 00:00:00 tail -f install.log.syslog
root 2433 2267 0 20:40 pts/1 00:00:00 grep tail
[[email protected] ~]# ps -ef | grep tail |grep -v grep
root 2425 1779 0 20:39 pts/0 00:00:00 tail -f install.log.syslog
[[email protected] ~]#
ps -ef 显示所有的进程,加上管道符,可以筛选出你想查询的进程,如果想查询的条件中有空格,那么可以加上单引号,然后再进行过滤。
ps -ef | grep tail |grep -v grep : -v可以去掉含有grep的进程
查询进程的PID,然后杀掉它:
[[email protected] ~]# ps -ef | grep tail |grep -v grep
root 2425 1779 0 20:39 pts/0 00:00:00 tail -f install.log.syslog
[[email protected] ~]#
用户 pid ppid
生产上一般情况是: 某个服务或进程夯住了 +或者因为需要主动杀死某个服务或者进程 --》杀死
从上面查出来pid之后,用 kill -9 pid 就可以了
kill -9 2425
提醒: kill前确认清楚该进程是否该杀 不要杀错
查看端口号:
netstat -nlp|grep pid
有些pid查询不出来相应的端口号,说明:不是所有的进程有端口号
对外提供服务肯定是要有端口号的 光有ip是不行的 比如你用crt xshell putty去链接Linux服务器肯定要有端口号的
如果不通过pid,直接通过名称来搜索端口号,也是可以的。比如:
netstat -nlp|grep ssh 可以搜索出带有ssh的记录,但是正常流程是通过pid来搜索端口号的,一般通过名称是搜索不到的
[[email protected] ~]# ps -ef | grep ssh
root 1434 1 0 19:49 ? 00:00:00 /usr/sbin/sshd
root 1775 1434 0 19:52 ? 00:00:00 sshd: [email protected]/0,pts/1
root 2477 2267 0 20:51 pts/1 00:00:00 grep ssh
[[email protected] ~]# netstat -nlp|grep 1434
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1434/sshd
tcp 0 0 :::22 :::* LISTEN 1434/sshd
[[email protected] ~]#
[[email protected] ~]# netstat -nlp|grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1434/sshd
tcp 0 0 :::22 :::* LISTEN 1434/sshd
[[email protected] ~]#
正常流程: pid-->port
这样也可以,但是一般搜不到: netstat -nlp|grep ssh
服务的概念:
一个服务首先要有一个:IP,然后要有一个端口号:port
IP:端口号
0.0.0.0:22
:::22
如果你去连接一个服务,发生链接拒绝错误:
链接拒绝错误 Connection refused:
这个时候,如果你是在Windows上面做开发,打开cmd,先ping ip,再看看端口号: telnet ip 端口号(没有冒号)
window : 控制面板 卸载程序 打开或关闭windows功能 选中Telnet客户端 部署 (不然的话,telnet命令用不了)
cmd
ping ip
telnet ip port
linux : yum install telnet.x86_64
如果是Linux,想去telnet,(Linux本身,没有telnet这个命令)
可以用 which telnet 搜索这个命令存不存在
结果发现不存在。
这个时候可以用:yum search telnet 这个命令去yum上搜索telnet是否存在,yum上是否有安装包
(安装软件一般通过rpm包,rmp包一般通过yum安装)
搜索完成之后,因为只需要客户端,去用telnet就行了,所以看上面截图说明,只需要telnet.x86_64就行了。
然后用yum install telnet.x86_64 安装一下这个软件就可以了。
安装完之后,再which一下,看看就有了:
再用telnet ip port 连一下:
这个时候说明连通了。尝试连接、已经连接、遵循SSH...什么什么协议,(crt软件,putty软件也是遵循SSH这个协议)。
面试题: 老板说去A服务器 (你是有权限去login的),打开xxx软件的web界面? 如何操作?
打开软件的web界面一般就是 ip加端口号。ip:port
现在A服务器的IP,你是知道的,就缺一个端口号了。现在只要获取这个软件服务的端口号就行了。
ps -ef|grep xxx 通过这个获取pid进程id
netstat -nlp|grep pid 通过这个获取端口号
看看这个端口号对外可访问的地址是什么,是不是能够对外提供访问,如果是这样的就可以提供访问:
0.0.0.0:22
:::22
如果是这样:
127.0.0.1::22
localhost:22
就不能对外提供访问。
安装一个httpd服务:
命令:yum install httpd
安装后 启动它:
启动命令:service httpd start
然后找到httpd服务的端口号:这两种方式都可以:
从上面可以看到,httpd的端口号是80端口,说明如果我们Windows想访问httpd这个服务,可以这样访问:
http://10.9.140.90:80/ 在浏览器里就可以直接访问了。
(在浏览器输入上面地址的时候,回车之后,80就不见了,浏览器会自动把80给去掉,变成了http://10.9.140.90/,后面不带端口号的,一般都是80端口号)
vi httpd.conf 编辑这个文件
shift+冒号 进入尾行模式,然后 /0.0.0.0 再按回车键 可以在文件中搜索带有0.0.0.0的记录。
最后一句Listen 80 表示:监听本机ip 端口号80 (其实中间省略了本机ip)
如果修改成,Listen 127.0.0.1 80 表示:当前ip只对本机服务 不对外提供访问
重点:
0.0.0.0:22
:::22
:::80
代表当前ip对外提供访问 XXX.XXX.XXX.XXX
不管是 0.0.0.0还是 :: 都表示当前ip对外提供访问(无论你机器怎么变,它都是取当前机器的ip)
127.0.0.1:80 只针当前本机ip对内部当前机器访问
localhost:80(和上面一样,127.0.0.1就是localhost)
cat /etc/hosts 文件可以看出来
127.0.0.1代表了自己的本身
如果生产上,你去链接一个服务,结果被拒绝了,有可能它的服务只针对于它自己,只有它自己才能访问。
如果想测试,在本机上去链接web界面,可以这样:
curl http://127.0.0.1:80/ 或者curl http://localhost:80/
9.杀进程
kill -9 pid
kill -9 2470 2661 并行杀
我只想杀死包含log字符的所有进程
kill -9 $(pgrep -f log)
kill -9 1187 1307 1758 2470
echo $(pgrep -f httpd) 显示了横行
pgrep -f httpd 显示出来为竖行
linux操作: 遇到rm kill高危命令 需确认再确认
10.搜索
生产上: 你要搜索 xxx软件 或者 xxx目录 但是不知道在什么地方 这时你可以:
history | grep xxx 看看历史命令里面有没有被操作过 可以找到
ps -ef|grep xxx 看看这个xxx是不是在运行,如果在运行可以看到显示的是有目录的
find / -name '*log*' 全局 根目录 但耗时
find ./ -name 当前目录开始
* 代表 模糊匹配
abc123drf
*123*
隐藏文件也可以搜索到
Linux系统的命令和文件查找:which、whereis、locate、find的特点和区别可以看这篇博客:https://blog.****.net/qq_33826564/article/details/82906115
11.linux 安装软件 rpm 安装的软件一般是rpm包,rpm包一般通过yum进行安装
yum search httpd 搜索
yum install -y httpd 安装 提示是否的时候 选择y
yum remove httpd-tools-2.2.15-69.el6.centos.x86_64 删除卸载
yum --help 可以查看yum如何使用
比如:
①yum list 可以列举出系统所有的安装包
②但是这些包太多了,这个你回车之后会一直运行,这时候你按键:ctrl + z 虽然把它给stop了, 看不到它在运行了,但是它还是在后台运行着的。它只是显性退出,实际还在运行。它是个僵尸进程。
③你再使用yum命令,比如 yum list | grep httpd ,它会告诉你yum被锁住了,被另一个app使用着
④这个时候就需要查出yum的pid ,然后将它kill掉,然后才能重新使用了。
rpm -qa | grep httpd 这样可以看到安装了httpd呐写rmp包
rmp -e xxxx 删除(卸载)(xxxx名字写全):
但是删除的时候,有时候删除不掉,因为它会被其它软件所需要,所依赖,这个时候如果你确定这个包要删掉,呐可以加上
--nodeps 这个参数,删除时 不验证依赖。
可以rpm --help查看帮助
12.which
命令都是从$PATH找
[[email protected] ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] ~]# which ls
alias ls='ls --color=auto'
/bin/ls
[[email protected] ~]#
which 命令是从$PATH 中找,先在/usr/lib64/qt-3.3/bin这里面找,没有,再去/usr/local/sbin这里面找,没有,直到在/bin这里面找到了,就返回,就算后面有了也不会继续往下找。
[[email protected] ~]# whereis ls 更全 但是不常用
ls: /bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz
[[email protected] ~]#
13.man 命令帮助
yum --help
man yum