Linux指令集合

磁盘相关命令

df//查看磁盘整体状况

在这里插入图片描述

df -h //查看磁盘整体状况

在这里插入图片描述

du //查看磁盘使用情况,如果不加目录,默认为当前目录

在这里插入图片描述

du -h -d 0//表示我们只希望看当前目录磁盘使用情况,不会继续展示这层目录的下一级目录
du -h -d 1//表示展示当前目录的下一级目录磁盘使用情况,-d是可以指定查看层数的

Linux指令集合_第1张图片

远程拷贝

实现文件的上传和下载,把远程机器的文件拷贝的本地(下载),以及把本地的文件上传到远程机器(上传)
scp(secure copy):使用的协议是ssh协议
本地路径比较好写:可以使用绝对路径和相对路径
远程路径比较难处理:用户名@远程服务器IP:目标路径路径 (这是一种指定远程路径的方法)

示例,使用windows上传文件到ubuntu虚拟机

  1. 最开始没有上传时ubunt虚拟几个普通用户加目录文件
    Linux指令集合_第2张图片
  2. 使用windows将本地文件上传到Ubuntu系统中mask用户的根目录下
    scp FileName UserName@TargetIP: targetfile
scp 要上传的文件名 目标机器的用户名@目标机器的IP:上传文件的目标位置

Linux指令集合_第3张图片

  1. 登录Ubuntu服务器可以查看到上传的文件
    Linux指令集合_第4张图片

  2. 从Ubuntu服务器下载文件
    在这里插入图片描述

除了上面这样使用用户名和密码进行验证实现上传和下载功能,我们还可以使用密钥和公钥的方式进行验证登录,在验证身份时我们会用自己的密钥和别人传过来的公钥进行配对,如果匹配成功,那么就可以实现登录等一系列操作

  1. 生成自己的公钥和私钥,先cd 到自己目录下的 .ssh/ 目录
    在这里插入图片描述

  2. 查看自己的公钥和私钥,id_rsa就是我们创建的私钥,id_rsa.pub就是我们创建的公钥
    在这里插入图片描述

  3. 有了公钥我们就可以让其他设备直接使用公钥和我们建立连接,这里使用的时gitee代码管理仓库来实现我们的对接,查看公钥并且将公钥配置在我们的gitee仓库之后,我们就可以不用输入密码直接在gitee仓库上push,clone,pull代码
    在这里插入图片描述

Linux指令集合_第5张图片
此时我们就可以在Ubuntu上快乐的实现操作gitee仓库的代码啦

如果我们使用公钥密钥进行传输,需要通过ssh进行,如果在使用此方法上传或者下载文件时在保证你网络,以及虚拟机正常开启的情况下无法进行传输,那么我们可以使用ps -elf|grep sshd命令来查看我们是否在虚拟机上开启sshd服务
Linux指令集合_第6张图片
如果出现/usr/sbin/sshd这条记录那么说明我们已经开启sshd服务
如果我们ping虚拟机IP,无法联通那么我们需要用vmnet8开启

c在linux上的编译过程

c语言程序在linux上运行,首先编译器会将 *.h文件和 *.c文件进行预处理形成预处理后文件 *.i文件,然后 *.i 文件会经过编译形成 *.s 汇编文件 ,然后再经过汇编形成 *.o 目标文件 ,最后再进行引导代码和库函数的链接 形成没有后缀的 * 可执行文件

Linux指令集合_第7张图片

预处理指令
g++ -E hello.c -o hello.i
// -E代表执行预处理
// -o是指定输出文件

1. 预处理的作用

执行预处理指令,预处理指令包含如下指令
(1)#include 文件包含
(2)#define M 5 宏定义(简单的文本替换)
(3)#define size(a)(sizeof(a) / sizeof(a[0])) 宏定义

宏开关
#if #else #endif(不常用)

源代码Linux指令集合_第8张图片
执行代码进行预处理

`g++ -E hello.c -o hello.i`

预处理之后生成的代码
Linux指令集合_第9张图片

#ifdef N #else #endif(常用)
防御式声明,为了避免重复包含多个头文件
源代码
Linux指令集合_第10张图片
执行代码进行预处理

g++ -E hello.c -o hello.i

预处理之后的代码
Linux指令集合_第11张图片
重新执行一下代码进行编译,后面的 -D表示添加define宏定义 后面的N表示添加的宏定义名称叫做N

g++ -E hello.c -o hello.i -D N

编译之后的代码
Linux指令集合_第12张图片
我们可以看到相同的代码但是再我们执行不同的编译指令之后,预处理出来的代码都是不一样的,这样子就给我们后面进行移动开发进行不同设备之间的代码编译时提供了便捷

#ifndef #else #endif
执行是上面的相反结果

2. 编译

将c语言代码编译成汇编代码
两种风格的汇编代码
(1)AT&T汇编
(2)x86/x86_64
他俩的区别就是目标寄存器和原寄存器位次不一样,他俩刚好反过来的
源代码
Linux指令集合_第13张图片
执行以下代码(先将源代码进行预处理再进行编译)
gcc -E hello.c -o hello.i
gcc -S helli.c -o hello.s
或者一步到位,直接将源代码编译成 *.s 汇编代码
gcc -S hello.c -o hello.i
Linux指令集合_第14张图片

pushq %rbp  //会将%rbp寄存器的值保存在栈帧中
movq %rsp , %rbp //会将%rsp 的值移动到%rbp中,这样他们相减为0,说明main函数的栈帧大小为0
leaq .LC0(%rip),%rdi //%rip中存储的是hello world字符串的地址,会将此地址赋值给 %rdi ,%rdi一般是存储第一参数
call puts@PLT //调用printf内置函数
movl $0,%eax //执行return 0 的操作,将0 存储在%eax寄存器中
popq  %rbp //恢复%rbp寄存器的值
push 入栈		mov 移动(赋值)		pop 出栈		lea (load effictive address)相当于&,加载有效地址
call 函数调用		ret 函数返回                     
%rbp -->base pointer 栈帧基址寄存器
%rsp -->stack pointer 栈顶寄存器
%eax -->存储返回值

Linux指令集合_第15张图片

你可能感兴趣的:(Linux,linux,运维,服务器)