linux常用命令.md

学习了一段时间的linux之后,开始着手基本命令的学习,这里主要记录一些学习过程中重要的知识点供以后查阅。

1、系统资源监控命令

1)文件系统查看命令df

df命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令和程序占用的空间 (最常见的是文件已经被删除,但是程序并没有释放空间)
image
image

2)统计目录或文件大小du

du命令是面向文件的,只会计算文件和目录占用的空间:
du -sh * | sort -nr
image

如:

查看tomcat目录下占用空间最大的前6的目录(du -h |sort -hr|head -n 6 不包括文件)、文件(du -ha|sort -hr |head -n 6 包括目录):

image
image

3)查看进程命令ps

[publisher@shfttppfbdb ~]$ ps -ef|grep sync
publish+  15990      1 97 Jun30 ?        33-12:38:36 python3.6 -u sync_bmcapp_newversion.py
publish+  40899      1 99 Jun29 ?        34-16:32:24 python3.6 -u sync_hxapp_newversion.py
publish+ 129897 129351  0 15:16 pts/1    00:00:00 grep --color=auto sync
[publisher@shfttppfbdb ~]$ ps -ef|grep sync |awk $'{print $2}'
15990
40899
129914
[publisher@shfttppfbdb ~]$ 

grep -v grep:从输出结果来看,可以过滤掉查找进程的自身这条命令。(grep -v 是反向查找的意思,比如 grep -v grep 就是查找不含有 grep 字段的行)

点击查看代码
#!/bin/sh
app_name="manage"   #应用名
app_path="/app/Assistant"        #应用位置
pid=''  #应用运行的pid
MAX_TIMEOUT=10 #最大等待次数
#重启方法
function stop(){
        echo "开始停止${app_name}"
        pid=`ps aux|grep ${app_name}|grep -v grep|awk '{print $2}'` #获取jar包运行的pid
        echo $pid
        if [ -z $pid ] ;then  #如果pid的长度为空,说明没有在运行
                echo "${app_name}未运行,直接启动"
        else
                echo "${app_name}正在运行中,进程号:"${pid}
                kill -15 $pid
        fi
        #等待60S进行强杀
        for((i=0;i<$MAX_TIMEOUT;i++))
        do
                pid=`ps aux|grep ${app_name}|grep -v grep|awk '{print $2}'`
                if [ -z $pid ]; then
                        break
                else
                        echo "${app_name}停止中..."
                fi
                sleep 6
        done
        if [ -z $pid ] ;then
                echo "${app_name}已停止"
        else
                kill -9 $pid
                echo "${app_name}已停止"
        fi
}
stop

2、编辑命令vi

1)命令行模式 (command mode/一般模式)

  任何时候,不管用户处于何种模式,只要按一下“ESC”键,即可使Vi进入命令行模式;我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。
  在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。
  如:G跳到文本末尾,gg跳到文本开头

2)文本输入模式 (input mode/编辑模式)

  在命令模式下输入插入命令i(insert)、附加命令a (append)、打开命令o(open)、修改命令c(change)、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按"ESC"键即可。
  如,i,a,o,c等命令

3)末行模式 (last line mode/指令列命令模式)

  末行模式也称ex转义模式。
  Vi和Ex编辑器的功能是相同的,二者主要区别是用户界面。在Vi中,命令通常是单个键,例如i、a、o等;而在Ex中,命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令,可访问很多面向行的Ex命令。在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。
  如:(shift+:键,进入此模式)q!强制退出,wq保存退出等命令。

4)Vim 字符串替换

查找和替换是任意一款文本编辑器的一组常见和必备功能。下面就来讲解 Vim 中的字符串替换功能。

Vim 使用以下命令结构实现替换功能。
:<range> s/<search_string>/<replace_string>/<modifier>

% - 对整个文件执行
< start _line > < end_line > - 在一组特定的行上面执行操作

g - 全局替换
gc - 在每次更换之前要求确认
gn - 忽略替换功能并突出显示查找结果。

例如,在 PackageList.txt 文件里用 Python3 字符串替换所有 python 字符串。

:%s/python/Python3/g
接下来,我们来试试范围这一个域。其实,我们在前面的例子里,已经使用了 % 范围(对整个文件范围)。

如果我们不想在整个文件范围进行查找替换,如果我们只想在某几个特定行进行这种操作,需要怎么做?我们可以采用类似于以下命令格式:

:200,250 s/python/Python3/g
执行完以上操作,Vim 会将第 200 行开始并在第 250 行结束的所有 python 替换为 Python3 。

此功能不仅限于一个词,还可以完成对多个关键词的替换。它的命令格式如下:

:%s/<search_term_1>\|<search_term_2>\|<search_term_3>/<replace_string>/g
比如,让我们想要将文本中所有 python 和 py 更改为 Python3 。

:%s/python\|py/Python3/g
区分大小写

本文前面提到的所有替换操作都是区分大小写的。例如,Python,python ,PYTHON 等都是不同的。
如果你要忽略大小写,可以在搜索字符串后面加上一个 \c ,如下:

/<search_term>\c
:%s/<search_term>\c/<replace_term>/g

3、文件搜索命令

1)字符串搜索命令-grep

# 查找指定字符串string
grep 'string' filename
#若需要在文件夹下所有文件查找
grep 'string'  dirPath/*

补充:若目录下含有多级子目录,则用 grep -r "string" ./

在文件当中搜索符合条件的字符串,如果需要匹配,使用正则表达式进行匹配,正则表达式时包含匹配。

2)文件搜索命令find

#搜索文件
find [搜索范围] [搜索条件]
find / -name install.log
#避免大范围搜索,会非常消耗系统资源

在系统中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配。

#查找10天前修改的文件
find . -mtime +10
#atime 文件访问时间
#ctime 改变文件属性
#mtime 修改文件内容

#查找文件大小是25KB的文件
find . -size 25k

#查找i节点是262422的文件
find . -inum 262422

#查找/etc目录下,大于20KB且小于50KB的文件
find /etc -size +20KB -a -size -50KB
# -a  and 逻辑与,两个条件都满足
#-o  or  逻辑或,两个条件满足一个即可

#查找/etc目录下,大于20KB且小于50KB的文件,并显示详细信息
find /etc -size +20k -a -size -50k -exec ls -lh {}\;
#-exec/-ok命令{}\; 对搜索结果执行操作

注:

通配符:
*匹配任意内容
?匹配任意一个字符
[]匹配任意一个中括号内的字符

3)命令搜索命令whereis与which

#搜索命令所在路径及帮助文档所在位置
whereis 命令名

-b:只查找可执行文件
-m:只查找帮助文件

4)文件搜索命令locate

#在后台数据库中按文件名搜索,搜索速度更快
locate 文件名

/var/lib/mlocate :locate命令所搜索的后台数据库
updatedb:更新数据库

image

4、文件传输命令

  • 前提条件:

服务器要开启写入权限;
本地和服务器都要安装有 scp 包;

  • 如何传输:

    利用 scp、rsync、rz传输文件

1) 从服务器上下载文件

scp username@servername:远程目录/文件名 本地目录
例:scp root@192.168.0.101:/var/www/test.txt .

(把 192.168.0.101 上的 /var/www/test.txt 文件下载到本地目录 /var/www/local_dir)

2)从服务器上下载目录

scp -r username@servername:远程目录 本地目录
例:scp -r root@192.168.0.101:/var/www/test .

(把 192.168.0.101 上的 /var/www/test 目录下载到本地目录 /var/www)

3)上传本地文件到目标服务器

scp /本地目录/文件名 username@servername:远程目录
例:scp /var/www/test.txt root@192.168.0.101:/var/www/

(把本地目录 /var/www/ 下的 test.txt 文件上传到 192.168.0.101 的 /var/www/ 目录中)

4)上传本地目录到目标服务器

scp -r 本地目录 username@servername:远程目录
例:scp -r /var/www/local_dir root@192.168.0.101:/var/www/

(把本地目录 /var/www/local_dir 上传到服务器的 /var/www/ 目录)

5)rsync从远程获取目录

(可以加参数排除复制某些目录);

rsync -azh -ssh --exclude 'l_temp' --exclude 'l_tmp/claimImageList' weblogic@10.3.20.65:/t/system_temp /t/system_temp

排除复制l_temp 和l_tmp/claimImageList
目录结构:
/t/system_temp
/t/system_temp/l_temp
/t/system_temp/l_tmp/claimImageList

6)使用rz从本地电脑传输文件

image

7)使用sftp传输

sftp username@ip
put [本地文件的地址] [服务器上文件存储的位置]
get [服务器上文件存储的位置] [本地要存储的位置]
#当前本地的目录就是登陆时的目录

5、linux文本操作

1)linux三剑客-grep、sed、awk

awk、grep、sed请见[https://www.cnblogs.com/hoaprox/p/18269422]

6、其他常用命令

1)排序命令sort

在linux的使用过程中,总是避免不了排序问题。比如,topN问题。linux提供了sort排序命令,支持常用的排序功能。
sort命令支持很多参数,常用参数如下:
image

2)linux下打文件分割命令split

split -b 1024M bkce_src-5.1.28.tar.gz bkce_
cat bkce_* >bkce_src-5.1.28.tar.gz
md5sum bkce_src-5.1.28.tar.gz

3)挂载命令mount

(1)查询与自动挂载

#查询系统中已经挂载的设备
mount
#依据配置文件/etc/fstab的内容,自动挂载
mount -a
#查看192.168.161.128挂载
showmount -e 192.168.161.128

(2)挂载命令格式

mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点

-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660等文件系统
-o特殊选项:可以指定挂载的额外选项
image

(3)卸载命令

unmount 设备文件名或挂载点

(4)centos安装nfs-server

在CentOS上安装NFS服务的步骤如下:

服务/客户端安装NFS软件包:

sudo yum install nfs-utils

服务端启动NFS服务并设置开机自启:

sudo systemctl start rpcbind
sudo systemctl start nfs-server
sudo systemctl start nfs-lock
sudo systemctl start nfs-idmap
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server
sudo systemctl enable nfs-lock
sudo systemctl enable nfs-idmap

服务端配置NFS共享,在/etc/exports添加如下内容(假设您想要共享的目录是/data,并且允许所有主机访问)

/nfs/data *(rw,sync,no_root_squash,no_all_squash)

服务端应用配置并重启NFS服务:

sudo exportfs -rav
sudo systemctl restart nfs-server
# systemctl daemon-reload重新加载服务资源

服务端如果有防火墙运行,允许NFS通过防火墙

sudo firewall-cmd --permanent --zone=public --add-service=nfs
sudo firewall-cmd --permanent --zone=public --add-service=mountd
sudo firewall-cmd --permanent --zone=public --add-service=rpc-bind
sudo firewall-cmd --reload

现在NFS服务器应该已经设置并运行了。客户端可以通过showmount命令来查看服务器上的共享或者挂载共享目录。

客户端,使用以下命令来挂载NFS共享(临时):

sudo mount <nfs-server-ip>:/nfs/data /nfs/data
# 替换<nfs-server-ip>为NFS服务器的IP地址,/data是客户端上用于挂载共享的目录

客户端的/etc/fstab添加如下内容来挂载NFS共享(永久):

192.168.44.132:/nfs/data /nfs/data nfs defaults 0 0

(5)Ubuntu安装nfs-server

在Ubuntu上安装NFS服务器的步骤如下:

更新软件包列表:

sudo apt update

安装NFS内核服务器包:

#创建要共享的目录:
sudo mkdir -p /srv/nfs/share

授权网络中的计算机访问共享目录,sudo vi /etc/exports添加以下行到文件中(将<client_IP>替换为客户端IP地址或子网):

/srv/nfs/share <client_IP>(rw,sync,no_subtree_check)

应用配置更改:

sudo exportfs -ra

启动NFS服务:

sudo systemctl start nfs-kernel-server

使NFS服务开机自启:

sudo systemctl enable nfs-kernel-server

在客户端计算机上,您需要安装NFS通用文件系统客户端:

sudo apt install nfs-common

然后,在客户端您可以挂载服务器上的共享目录(临时):

#替换 <nfs_server_ip> 为NFS服务器的IP地址
sudo mount <nfs_server_ip>:/srv/nfs/share /mnt

客户端的/etc/fstab添加如下内容来挂载NFS共享(永久):

192.168.44.132:/applications /applications/nfs nfs defaults 0 0

4)expect命令

expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了expect就是一套用来实现自动交互功能的软件需要自行安装。
yum install -y expect

  • expect基础
    在使用expect时,基本上都是和以下四个命令打交道:

命令 作用
spawn 启动新的进程
expect 从进程接收字符串
send 用于向进程发送字符串
interact 允许用户交互

spawn命令用来启动新的进程,spawn后的expect和send命令都是和使用spawn启动的新进程进行交互。
expect通常用来等待一个进程的反馈,我们根据进程的反馈,再使用send命令发送对应的交互命令。
send命令接收一个字符串参数,并将该参数发送到进程。
interact命令用的其实不是很多,一般情况下使用spawn、expect和send和命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。
[https://blog.csdn.net/givenchy_yzl/article/details/118079170]

5)openssl加解密

tar -zcf - host.conf | openssl des3 -salt -k ZYProduct@2022 | dd of=host.des dd if=host.des | openssl des3 -d -k "ZYProduct@2022" | tar zxf -

6)eval命令

eval是一个内置的Linux命令,用于将指定的参数作为shell命令执行。它将参数组合成一个字符串,并将其作为输入提供给shell,然后在当前的shell环境中执行生成的命令。

语法:eval [argument]

7)转化参数命令xargs

extended arguments缩写,可以将标准输入转化成参数,传递给后面的命令。

语法:(默认命令是echo)
xargs [参数] [命令]
(1)基础

  • 参数:
    -n:指定一次传递多少个参数(默认根据空格或者换行拆分,进行一次传递)
    -d:指定拆分的字符
    -p:显示要执行的命令,需要确认执行
    -t:显示要执行的命令,直接执行
    -I:指定占位符,通常为{}
    -r:如果传递参数为空,则不执行
  • 操作:
    多行处理成一行

(2)实例

  • 找出含有“password”的txt文件
#find . -name "*.txt" -exec grep "password" {} \;
#find . -name "*.txt" |xargs grep "password"
  • 指定一次传递一个参数
# echo "hello world" |xargs -n 1
  • 根据“#”进行拆分
# echo "hello#world" |xargs -d "#"
  • 占位符
#echo "hello#world" |xargs -I {} echo {}
#echo |xargs -r echo

8)echo输出命令

echo [选项] [输出内容]

选项:-e:支持反斜线控制字符转换

image
  • 设置显示颜色
#\e[1开启 、\e[0关闭
echo -e "\e[1;33m test \e[0m"

7、linux用户管理

1)linux用户类型

image

2)linux用户

image

3)groupadd/useradd

用groupadd和useradd命令为系统添加mysql 组和用户

语法如下:

groupadd mysql 
useradd -u 544 -d /home/mysql -g mysql -m mysql

4)chown 改变用户和所属组命令

将test.php 文件的所属用户设置成zhuo,所属用户组设置成zhuogroup
chown zhuo:zhuogroup test.php
将testfiel 及其内部文件所属用户设置成zhuo,所属用户组设置成zhuoroup
chown -R zhuo:zhuogroup testfile

7、linux文件管理

1)linux文件类型

image

2)

9、其他常用功能

1)不知道分类,可以解决ssh远程登录shell问题

ssh -tt weblogic@10.3.20.22 << EOF
sh $proddomaindir/stopappserver1.sh
sh $proddomaindir/startappserver1.sh
exit
EOF

OR

ssh weblogic@127.0.0.1 "rm -rf /tsys/applications/nginx/log/*"

2)服务器上近一分钟文件变动监控

点击查看代码
#!/bin/bash
if [ -e "/tsys/applications//web" ];then
for i in `find /tsys/applications//web -type f -cmin 1 ! -name "*.log*" ! -name "*.out*" ! -name "*.err*" ! -name "*.ser" ! -name "*.tar.gz"`
 do 
   echo `date +%F%t%T`"   "  $i >>/tsys/applications/showChangeFile.log;
 done
 fi 

3)文件防篡改监控

点击查看代码
#!/bin/bash
original_publish_dir='/tsys/applications//web'
current_publish_dir='/tsys/applications//web'
original_MD5='original_MD5.txt'
current_MD5='current_MD5.txt'
if [ "$1" == "original" ];then
   cd /tsys/applications && rm -rf ./$original_MD5
   find $original_publish_dir -type f ! -name "*.rdb*" ! -name "*.zip*" ! -name "*.xls*" ! -name "*.rar*" ! -name "*.txt*" ! -name "*.pdf*" ! -name "*.log*" ! -name "*.out*" ! -name "*.err*" ! -name "*.ser" ! -name "*.tar.gz" -exec md5sum {} \;| sort >/tsys/applications/$original_MD5
fi
if [ "$1" == "current" ];then
   cd /tpsys/applications && rm -rf ./$current_MD5
   find $current_publish_dir -type f ! -name "*.rdb*" ! -name "*.zip*" ! -name "*.xls*" ! -name "*.rar*" ! -name "*.txt*" ! -name "*.pdf*" ! -name "*.log*" ! -name "*.out*" ! -name "*.err*" ! -name "*.ser" ! -name "*.tar.gz" -exec md5sum {} \;| sort >/tsys/applications/$current_MD5
   backcode=`diff -q $original_MD5 $current_MD5 | awk '{print $1}'`
fi
if [ "$backcode" != "" -a "$1" == "current" ];then
  echo `date +%F%t%T`"  " `diff $original_MD5 $current_MD5 |awk '{print $3}'|xargs` >/tsys/applications/showDiffFile.log
fi 

4)读取csv文件,根据条件创建目录并复制文件

点击查看代码
#!/bin/bash
tr -d '\r' < "pensionmain.csv" > "output.csv"
csv_file="./output.csv"
while IFS=, read -r column1 column2
do
 dir_name="$column1"
 if [ ! -d "$dir_name" ];then
  echo "mkdir $dir_name"
  mkdir "$dir_name"
  echo "./$dir_name/ $column2"
  cp $column2 ./$dir_name/
 else
  echo "./$dir_name/ $column2"
  cp $column2 ./$dir_name/
 fi
done < "$csv_file"

10、使用semanage管理SELinux安全策略

semanage命令用于管理SELinux的策略,格式为“semanage [选项] [文件]”。
SELinux服务极大地提升了Linux系统的安全性,将用户权限牢牢地锁在笼子里。semanage命令可以设置文件、目录的策略,还可以管理网络端口、消息接口。

1)常用参数

port: 管理定义的网络端口类型
fcontext: 管理定义的文件上下文
-l: 列出所有记录
-a: 添加记录
-m: 修改记录
-d: 删除记录
-t: 添加的类型
-p: 指定添加的端口是tcp或udp协议的,port子命令下使用
-e: 目标路径参考原路径的上下文类型,fcontext子命令下使用

2)检查semanage是否有安装

如果没有,需要安装semanage

[root@localhost ~]# yum install policycoreutils-python -y 

3)Selinux是否开启

[root@localhost ~]# egrep -i selinux /etc/sysconfig/selinux | egrep -v "#"
SELINUX=enforcing
SELINUXTYPE=targeted

如selinux未开启就需要进配置文件把selinux设置为enforcing

[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing

重启使其生效

[root@localhost ~]# reboot

4)查看服务使用端口号

查看etc/httpd/conf/httpd里看看端口号是多少
egrep -i listen /etc/httpd/conf/httpd.conf | egrep -v "#"

5)列出所有定义的端口

semanage port -l

6)列出指定的端口类型的端口

semanage port -l | grep -w http_port_t
semanage port -l | grep -w 443

7)创建、添加、删除端口

# add
semanage port -a -t http_port_t -p tcp 8081
# del
semanage port -d -t http_port_t -p tcp 8081

参考:

[https://zhuanlan.zhihu.com/p/128447380]

posted @ 2024-06-13 22:07  权杖攻城狮  阅读(92)  评论(0编辑  收藏  举报