Loading

Linux基础

Linux服务器开发一(基础)

本地连接远程Linux服务器(CentOS)

ssh的公钥加密,私钥解密

电脑中的公钥私钥是用来免密码登陆的

Mac使用ssh公钥登录Linux

SSH提示Permission denied

ssh免密码登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 的解决方案!

在本地生成密钥。密钥默认保存位置在 ~/.ssh 目录下,打开后会看到私钥文件 id_rsa 和公钥文件 id_rsa.pub。生成过程中会提示输入密码两次,如果不想在使用公钥的时候输入密码,可以回车跳过

ssh-keygen -t rsa -C  'your email@domain.com'

把公钥 id_rsa.pub复制到远程服务器终端默认文件夹下面,然后把公钥追加到服务器ssh认证文件中

//就是把id_rsa.pub里面的内容放到authorized_keys文件中
//如果.ssh(隐藏文件夹)文件夹不存在就自己创建一个
//手动复制也可以
cat /home/id_rsa.pub >> ~/.ssh/authorized_keys

查看服务器ip,终端输入ifconfig,看inet x.x.x.x后面的ip地址。如果ifconfig没有结果,则先安装ssh服务

yum -y install openssh-server

在本地终端输入以下命令连接至远程服务器

ssh <服务器用户名>@<服务器ip>

如果出现拒绝访问的情况解决方法如下:

在终端输入sudo vi /etc/ssh/sshd_config,编辑sshd_config文件,修以下几个字段为yes

vim中打开sshd_config文件后直接按i键进行编辑,按:wq进行保存并退出

PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes

修改文件后需要重启ssh服务

systemctl restart sshd.service
systemctl status sshd.service #查看ssh服务的状态
systemctl start sshd.service  #开启ssh服务
sytemctl enable sshd.service #ssh服务随开机启动,还有个disabled
systemctl stop sshd.ervice #停止
//正常情况下应该是Active:active(running)

同时修改文件的权限。.ssh文件夹的权限为700.ssh下的authorized_keys文件权限为600644

chmod 700 ~/.ssh
chmod 0600 ~/.ssh/authorized_keys 

软件仓库

修改CentOS默认yum源为国内yum镜像源

命令行

命令关键字 [选项] [参数]

短格式  -单词简写     ls -a
长格式  --单词全拼    ls --all
组合 ls -a -l => ls -al

快捷键

编辑命令

Ctrl + a          移到命令行首, ahead,与home键功能相同
Ctrl + e          移到命令行尾, end, 与end键功能相同
Ctrl + f          按字符前移(右向), forward, 与方向键left功能相同
Ctrl + b          按字符后移(左向), back, 与方向键right功能相同
Alt  + f          按单词前移(右向)
Alt  + b          按单词后移(左向)
Ctrl + xx         在命令行首和光标之间移动
Ctrl + u          从光标处删除至命令行首
Ctrl + k          从光标处删除至命令行尾
Ctrl + w          从光标处删除至字首
Alt  + d          从光标处删除至字尾
Ctrl + d          删除光标处的字符, 与delete键功能相同
Ctrl + h          删除光标前的字符, 与backspace键功能相同
Ctrl + y          粘贴至光标后, yank
Alt  + c          从光标处更改为首字母大写的单词
Alt  + u          从光标处更改为全部大写的单词, uppercase
Alt  + l          从光标处更改为全部小写的单词, lowercase
Ctrl + t          交换光标处和之前的字符
Alt  + t          交换光标处和之前的单词
Alt  + Backspace  与 Ctrl + w 类似,分隔符有些差别
按两次Tab给提示

重新执行命令

Ctrl + r          逆向搜索命令历史
Ctrl + g          从历史搜索模式退出
Ctrl + p          历史中的上一条命令, previous,与方向键up功能相同
Ctrl + n          历史中的下一条命令, next, 与方向键down功能相同
Alt  + .          使用上一条命令的最后一个参数

控制命令

Ctrl + l          清屏, clear
Ctrl + o          执行当前命令,并选择上一条命令
Ctrl + s          阻止屏幕输出
Ctrl + q          允许屏幕输出
Ctrl + c          终止命令
Ctrl + z          挂起命令

Linux 目录

  /
      root --- 启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。
      home --- 存储普通用户的个人文件
          ftp --- 用户所有服务
          httpd
          samba
          user1
          user2
      bin --- 系统启动时需要的执行文件(二进制)
      sbin --- 可执行程序的目录,但大多存放涉及系统管理的命令。只有root权限才能执行
      proc --- 虚拟,存在linux内核镜像;保存所有内核参数以及系统配置信息
          1 --- 进程编号
      usr --- 用户目录,存放用户级的文件
          bin --- 几乎所有用户所用命令,另外存在与/bin,/usr/local/bin
          sbin --- 系统管理员命令,与用户相关,例如,大部分服务器程序
          include --- 存放C/C++头文件的目录
          lib --- 固定的程序数据
          local --- 本地安装软件保存位置
          man --- 手工生成的目录
          info --- 信息文档
          doc --- 不同包文档信息
          tmp
          X11R6 ---  该目录用于保存运行X-Window所需的所有文件。该目录中还包含用于运行GUI要的配置文件和二进制文件。
          X386 --- 功能同X11R6,X11 发行版5 的系统文件
      boot --- 引导加载器所需文件,系统所需图片保存于此
      lib --- 根文件系统目录下程序和核心模块的公共库
          modules --- 可加载模块,系统崩溃后重启所需模块
      dev --- 设备文件目录
      etc --- 配置文件
          skel --- home目录建立,该目录初始化
          sysconfig --- 网络,时间,键盘等配置目录
      var
          file
          lib --- 该目录下的文件在系统运行时,会改变
          local --- 安装在/usr/local的程序数据,变化的
          lock --- 文件使用特定外设或文件,为其上锁,其他文件暂时不能访问
          log --- 记录日志
          run --- 系统运行合法信息
          spool --- 打印机、邮件、代理服务器等假脱机目录
          tmp
          catman --- 缓存目录
      mnt --- 临时用于挂载文件系统的地方。一般情况下这个目录是空的。
              在我们将要挂载分区时在这个目录下建立目录,再将我们将要访问的设备挂载在这个目录上,这样我们就可访问文件了。
      tmp --- 临时文件目录,系统启动后的临时文件存放在/var/tmp
      lost+found --- 在文件系统修复时恢复的文件

/

根目录,一般根目录下只存放目录,不要存放文件。
/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。

/bin, /usr/bin

可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。

/boot

放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。

/dev

存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount:
/dev/cdrom、/mnt

/etc

系统配置文件存放的目录,不建议在此目录下存放可执行文件。
重要的配置文件有:/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
修改配置文件之前记得备份。

注:/etc/X11存放与x windows有关的设置。

/home

系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下。
~表示当前用户的家目录,~test表示用户test的家目录。
建议单独分区,并设置较大的磁盘空间,方便用户存放数据。

/lib,/usr/lib,/usr/local/lib

系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。

/lost+fount

系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。
如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found

/mnt,/media

光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。

/opt

给主机额外安装软件所摆放的目录。
如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。
以前的 Linux 系统中,习惯放置在 /usr/local 目录下。

/proc

此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间。
比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。

/root

系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。

/sbin,/usr/sbin,/usr/local/sbin

放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。
与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。

/tmp

一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。

/srv

服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。

/usr

应用程序存放目录。
/usr/bin 存放应用程序。
/usr/share 存放共享数据。
/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。
/usr/local 存放软件升级包。
/usr/share/doc 系统说明文件存放目录。
/usr/share/man 程序说明文件存放目录。
使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容。
建议单独分区,设置较大的磁盘空间。

/var

放置系统执行过程中经常变化的文件。
/var/log 随时更改的日志文件。
/var/log/message 所有的登录文件存放目录。
/var/spool/mail 邮件存放的目录。
/var/run 程序或服务启动后,其PID存放在该目录下。
建议单独分区,设置较大的磁盘空间。

root@ubuntu:~#

  • root: 当前用户名
  • @:at, 在
  • ubuntu:主机名
  • ~ : 当前用户home目录
  • #:超级用户
  • $:普通用户

文件命令

  • sudo su:切换成root用户

  • exit:退出root用户

  • cd

基本格式:cd 目录(绝对路径/相对路径)
cd directory切换到当前目录下的子目录
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd ~/cd:返回当前用户的家目录
cd -:返回到上次的目录
  • ls
ls [选项] [目录] 展示指定目录的内容
ls 展示当前目录内容
    -l:查看文件详细情况(可查看文件类型) 别名:ll
    -a:显示所有文件(包含隐藏文件)
    -A:显示所有文件(.和..不展示)
    -h:友好易读的方式展示,必须和-l一起使用  ll -h
    -R:递归展示所有文件
  • tree
tree path   显示指定路径的目录树结构
  • du:查看文件或目录磁盘的占用情况
du 文件
    -a:展示文件大小
  • df
  df -h       查看当前文件夹下的目录或文件所使用磁盘空间的详细情况。
  • pwd
  • which
which ls    查看外部命令的位置,内部命令无法查看。
  • head
  head -5 stdio.h     查看前五行内容,不加参数默认是10行。
  • tail
  tail -5 stdio.h     查看后5行内容, 不加参数默认是10行。
  • 创建文件:touch
  • 创建目录:mkdir
mkdir dirname               创建目录。
mkdir dir1/dir2/dir3 -p     按层次创建目录。
  • 拷贝文件或者目录:cp
cp 源文件 目标文件
    -i 覆盖时提示
    -f 强制覆盖
    -r 递归复制
cp hello.c temp     在当前目录下生成一个temp文件,并把hello.c的内容写入文件
                      如果temp不存在,则创建文件;如果存在,则覆盖已有文件
cp mydir newdir -r  在当前目录下生成一个newdir目录,并把mydir目录里面的目录或文件拷贝过去
                      如果目录不存在,则创建;如果存在,则mydir目录本身也拷贝到newdir目录下
  • 移动文件:mv
mv 源文件 目标文件
    -i 覆盖时提示
    -f 强制覆盖
    -r 递归复制
    -u 目标文件不存在,源文件比目标文件要新的时候才移动
mv test.c hello.c   移动到。多用于重命名目录或文件
  • 删除文件:rm (谨慎使用)
rm  目标文件
    -i 删除时提示
    -f 强制删除
    -r 递归删除整个目录树
    -rf 递归强制删除
rm -rf dirname      递归强制删除文件夹下的目录和文件,实际使用中常用
rm -ri dirname      递归删除并提示用户删除了哪些目录或文件
极度危险的命令:rm -rf /
  • cat
cat test.txt        查看文件的内容,缺点内容太多时查看困难。
  • more
more stdio.h        分屏查看文件,Enter下翻一行,Space下翻一页,缺点不能往回看。
  • less
less stdio.h        分屏查看文件。比more更实用,可以来回翻页。
ctrl + p    上翻一行
ctrl + n    下翻一行
ctrl + b    上翻一页
ctrl + f    下翻一页
q           退出
  • echo:输出指定字符串或者变量
echo "hello"	打印字符串
echo $PATH		打印环境变量
echo $?			显示上一次程序退出值
  • ln:创建连接
ln -s ~/.vim/.vimrc .vimrc      创建软链接,相当于windows下的快捷方式,可用于目录或文件。
                                路径要用绝对路径,这样软链接拷贝到哪里都是有效的。
                                如果删除原文件,则软链接失效。
 
ln .vimrc .vimrc.hard           创建硬链接,只能用于文件。不必使用绝对路径。
                                创建后生成的硬链接与原文件引用同一个inode,硬链接本身不占硬盘空间。
                                如果删除原文件,硬链接仍然有效。
  • alias:查看别名
alias la='ls -a -l':设置别名
unalias la:取消别名
  • |: 管道符,把前面命令的输出当做后面命令的输入

压缩和解压文件

  • 打包:多个文件变成一个总文件
  • 归档:tar
  • 压缩:targzip

  • tar -- 不使用z或j参数,该命令只能对文件和目录打包

    • 参数

      c       创建--压缩时使用。
      x       释放--解压缩时使用。
      v       显示提示信息--压缩和解压缩都可以使用,可以省略。
      f       指定压缩文件的名字
      
      z       使用gzip的方式压缩文件
      j       使用bzip2的方式压缩文件
      
    • 压缩

      用法:tar zcvf 生成的压缩包的名字(xxx.tar.gz) 要压缩的文件或目录
      示例:tar zcvf alltxt.tar.gz *.txt test/		同时对文件和目录进行打包压缩
      
      用法:tar jcvf 生成的压缩包的名字(xxx.tar.bz2) 要压缩的文件或目录
      示例:tar jcvf alltxt.tar.bz2 *.txt test/		同时对文件和目录进行打包压缩
      
    • 解压缩

      tar zxvf 压缩包的名字					解压到当前目录
      tar jxvf 压缩包的名字 -C 目录			解压到指定目录
      
  • rar

    • 参数

      a		Add压缩
      x		Extract解压缩
      r		压缩时递归目录,不加这个参数默认就是递归的
      
    • 压缩

      用法:rar a 生成的压缩文件的名字 压缩的文件或目录
      
      示例:
      rar a all *.txt			打包压缩文件
      rar a dir dir/			打包压缩目录
      
    • 解压缩

      用法:rar x 压缩文件名 [解压缩目录]
      示例:rar x all.rar
      
  • zip

    • 参数

      r		压缩目录时加个参数用于递归目录,不加不能压缩
      
    • 压缩

      用法:zip 压缩包的名字 压缩的文件或目录
      示例:zip all *.txt
      zip -r myzip mytest/
      
    • 解压缩

      用法:unzip 压缩包的名字
      unzip 压缩包的名字 -d 解压的目录
      示例:unzip all.zip
      unzip all.zip -d test/
      

用户管理

  • 所有的用户都在home下,root除外

  • 查看当前用户

    whoami		查看当前用户名。
    id			查看当前用户信息,如用户名,所属群组,UID,GID等。
    
  • 创建用户

    adduser super		用户名只能小写,不能大写
    useradd -s /bin/bash -g super -d /home/super -m super		用户名可以大写
    -s		指定新用户登陆时shell类型
    -g		指定所属组,该组必须已经存在
    -d		用户家目录
    -m		用户家目录不存在时,自动创建该目录
    
  • 设置用户组

    groupadd super
    
  • 删除用户

    deluser super
    userdel -r super		选项-r的作用是把用户的主目录一起删除
    
  • 切换用户

    su super
    
  • 修改用户密码

    passwd super
    
  • 退出当前用户

    exit
    
  • 查看所有用户信息

    vi /etc/passwd
    

权限管理

  • 修改目录或文件权

    • 文字设定法

      d: 目录
      l:链接
      r:读
      w:写
      x:执行
      -:没有相应权限
      
      chmod [who] [+|-|=] [mode]
      who : 不指定的话,默认是所有
      文件所有者:u
      文件所属组:g
      其他人:o
      所有人:a
      mode
      r : 读
      w : 写
      x : 执行
      chmod o+w temp		给其他人加写权限。
      chmod a-x temp		给所有人去除执行权限。
      chmod a=r temp		所有人只有读权限。
      
    • 数字设定法

      -	0	没有权限
      r	4	读
      w	2	写
      x	1	执行
      
      chmod 755 temp		-rwxr-xr-x
      chmod -001 temp		-rwxr-xr--
      
  • 修改目录或文件所有者与所属组

    chown root temp			把文件temp的所有者修改为root。
    chown super:root temp	把文件temp的所有者修改super,所属组修改为root。
    
  • 修改目录或文件所属组

    chgrp root temp			修改文件所属组为root
    

数据操作

  • 搜索文本:grep
    • 可配合正则表达式
  • 文件统计:wc

流、管道、重定向

  • 大于>:将结果重定向到文件中 >>:追加到末尾
  • 将两个命令连成管道,也就是将一个命令的输出当成另外一个命令的输入:|

进程管理

软件:glances,htop

  • 显示系统当前活动的用户:w
  • 后台运行进程:&符号和nohup
    • 要运行的命令+&(后台与终端关联)
    • nohup:关闭终端后程序依然运行
    • 可以nohup&一起使用
  • 使前台转后台:先Ctrl+z:转到后台,并停止运行,然后用bg命令使进程重新运行起来
  • 显示后台进程状态:jobs
  • 使进程转到前台:fg

  • 查看在线用户状态

    who					查看当前在线用户的状态
    
  • 查看进程

    //进程静态列表
    ps aux					查看在线用户下所有进程
    ps aux | grep bash		进程过滤
    
  • 终止进程

    kill -l					查看所有信号
    kill -SIGKILL 5179		终止进程
    kill -9 4678			终止进程
    
  • 查看当前进程的环境变量

    env						查看所有环境变量
    env | grep PATH			只查看PATH环境变量
    
  • 进程动态列表:top

定时和延迟执行

  • 在制定时刻运行一次程序:at
  • 列出正在等待的at任务:atq
  • 删除正在等待的at任务:atrm
  • 定时执行程序:crontab(重复执行)
#安装crontab
sudo yum install vixie-cron crontabs
chkconfig crond on #开机自启
service crond start

网络与FTP

  • 下载文件:wegt
  • 网间拷贝:scp
#默认端口22
#从自己电脑拷贝文件到另一台电脑
scp file.txt root@192.168.1.5:/root

#从另一台电脑拷贝文件到自己电脑
scp root@192.168.1.5:/root/file.txt file_copy.txt

防火墙

待补充

搭建FTP

待补充

服务区管理

systemd

Apache

#安装Apache
sudo yum install httpd
#查看Apache运行状况
ps -aux | grep httpd
#开启Apache
systemctl start httpd
#开启后可用127.0.0.1访问

#按道理开启服务之后别的主机也应该能访问?但是因为防火墙80端口默认关闭。
#在自己电脑配置需要在同一局域网下去访问。互联网访问就需要一个公网IP
#查看开放的端口
sudo firewall-cmd --list-port
#开放80端口,两种方式。https默认端口443
systemctl stop firewalld #1 直接关闭防火墙
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent #2 只开放80端口
sudo firewall-cmd --reload #重载配置的防火墙策略


sudo systemctl reload  httpd #重新加载 Apache 服务的配置文件
sudo systemctl status httpd #状态查看详情信息

#放行数据库
firewall-cmd --zone=public --add-port=3306/tcp --permanent

Apache配置文件

主配置文件三类参数

  • 注释
  • 全局配置
  • 区域配置:Directory

SELINUX 安全子系统

  • 使得Apache只能访问指定的目录,别的文件不能访问。所以修改Apache配置后可能不能起作用
  • 查看状态:命令行sestatus
  • 通过semanage包去管理SELINUX

Vim

命令模式 -- 打开文件之后,默认进入命令模式

  • 移动光标
h           左
j           下
k           下
l           右
0           行首
$           行尾
gg          文件头部
G           文件尾部
5G          行跳转,移到第五行
  • 删除操作(不是真正意义上的删除,更象是剪切操作)
x           删除光标后一个字符
X           删除光标前一个字符
dw          删除光标后一个单词
d0          删除光标到行首的所有字符
D(d$)       删除光标到行尾的所有字符
dd          删除一行
5dd         删除五行
  • 撤消操作
u           撤消
ctrl+r      还原前一个操作
  • 复制粘贴
p           小写的p,粘贴到光标的下一行
P           大写的p,粘贴到光标的所在行
yy          复制一行
5yy         复制五行
  • 可视模式
v           切换到可视块模式
h/j/k/l     调整选中块
y           复制
d           删除
p           粘贴
  • 查找模式
/           切换到查找模式,向下查找
?           切换到查找模式,向上查找
n           下一个匹配
N           上一个匹配
#           移到要查找的单词上,按#号即可开启查找模式
  • 字符替换
r           单个字符替换
  • 行缩进
>>          向右缩进
<<          向左缩进

插入模式 -- 需要输入一些命令,切换到编辑模式

a       在光标所在位置的后边插入
A       在当前行的尾部插入

i       在光标所在位置的前边插入
I       在光标所在行的行首插入

o       在光标所在行的下边开辟一个新的行
O       在光标所在行的上边开辟一个新的行

s       删除光标后边的字符
S       删除光标所有的行

交互模式 -- 在末行模式下可以输入一些命令

:s/tom/jack/g           把光标所在行的tom替换成jack
:%s/tom/jack/g          把整个文档的tom替换成jack
:25,30s/tom/jack/g      把25到30行的tom替换成jack

:q          退出
:q!         强制退出
:w          保存
:wq         保存并退出
:x          相当于:wq
ZZ          相当于:wq

分屏操作

:sp [file]      将屏幕水平分成两部分
:vsp [file]     交屏幕垂直分成两部分
:wqall          同时保存打开文件
ctrl+ww         切换两个屏幕

vim打造成IDE

/etc/vim/vimrc      系统级配置文件
~/.vim/vimrc        用户级配置文件

GCC

  • gcc编译的四个阶段
  hello.c  ---->   hello.i  ----->    hello.s  ---->    hello.o  ---->    hello.out
       预处理编译器(cpp)   编译器(gcc)        汇编器(as)       链接器(ld)
          gcc -E            gcc -S             gcc -c            gcc
  • 编译工具链
预处理编译器:cpp     gcc -E hello.c -o hello.i   头文件展开,宏替换,注释去掉
编译器:gcc     gcc -S hello.i -o hello.s   c文件变成汇编文件
汇编器:as      gcc -c hello.s -o hello.o   汇编文件变成二进制文件
链接器:ld      gcc hello.o -o hello        将函数库中相应的代码组合到目标文件中
  • 直接编译生成可执行文件
gcc hello.c -o hello
  • 编译时指定头文件目录-I
gcc hello.c -I ./include hello
  • 编译时指定宏,通常用于调试代码-D
gcc hello.c -D DEBUG

在需要打印日志的代码中加上下面的语句:
#ifdef DEBUG
printf("debug info");
#endif
  • 编译时对代码进行优化-O3
gcc hello.c -o hello -O3 
级别:
0   没有优化
1   缺省值
3   优化级别最高
  • 编译时显示告警信息-Wall
gcc hello.c -o hello -Wall
  • 编译时包含调试信息-g(gdb)
gcc hello.c -o hello -g
  • 查看编译版本
gcc -v
gcc --version

静态库

  目录结构
  myCalc
  ├── include
  │   └── head.h
  ├── lib
  │   └── libMyCalc.a
  ├── main.c
  └── src
      ├── add.c
      ├── div.c
      ├── mul.c
      ├── sub.c
  • 命名格式
1 以lib开头
2 静态库名
3 .a结尾
示例 : libMyCalc.a
  • 描述
优点
寻址方便、速度快
库被打包到可执行程序中,直接发布可执行程序即可使用

缺点
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
如果静态函数库改变了,那么你的程序就必须重新编译

使用场合
在核心程序上使用,保证速度,忽略空间
主流应用于80、90年代,现在很少使用
  • 得到与位置有关的*.o
cd ~/myClac/src
gcc *.c -c -I ../include
  • 将生成的*.o文件打包成静态库libMyCalc.a
ar rcs libMyCalc.a *.o

ar工具不包含在一gcc中。
参数:
r       将文件夹插入到静态库中。
c       创建静态库,不管库是否存在。
s       写入一个目标文件索引到库中,或者更新一个存在的目标文件。

制作好以后移动到lib目录中
mv libMyCalc.a ../lib
  • 查看库中的符号(函数)
nm libMyCalc.a
  • 发布静态库,把includelib目录打包给用户
  • 使用
//在main.c中包含头文件
#inlcude "head.h"

//两种编译方式
gcc main.c lib/libMyCalc.a -I include -o myapp
gcc main.c -I include -L lib -l MyCalc -o myapp
  
//执行myapp
./myapp

动态库

  • 准备
  目录结构
  myCalc
  ├── include
  │   └── head.h
  ├── lib
  │   └── libMyCalc.so
  ├── main.c
  └── src
      ├── add.c
      ├── div.c
      ├── mul.c
      ├── sub.c
  • 命名格式
1 以lib开头
2 静态库名
3 .so结尾
示例 : libMyCalc.so
  • 描述
优点
执行程序体积小
动态库更新了,不需要重新编译程序,前提是函数接口不变

缺点
发布程序的时候,需要将动态库提供给用户
动态库没有被打包到应用程序中,加载速度相对较慢

使用场合
现代应用程序中常用
  • 生成与位置无关的*.o
cd ~/myClac/src
gcc -fPIC *.c -c -I ../include
  • 将生成的*.o文件打包成共享库(动态库)libMyCalc.so
gcc -shared -o libMyCalc.so *.o -I ../include

制作好以后移动到lib目录中
mv libMyCalc.so ../lib
  • 查看库中的符号(函数)
nm libMyCalc.so
  • 发布静态库,把includelib目录打包给用户
  • 使用
//在main.c中包含头文件
#inlcude "head.h"

//两种编译方式
gcc main.c lib/libMyCalc.so -I include -o myapp
gcc main.c -I include -L lib -l MyCalc -o myapp

//执行myapp
./myapp

//查看可执行文件夹所依赖的动态库
ldd myapp
  • 解决依赖的动态库无法加载的问题

    1 把libMyCalc.so拷贝到/lib目录下(不推荐使用,容易与系统库冲突)

cp lib/libMyCalc.so /lib

​ 2 设置环境变量LD_LIBRARY_PATH(测试时使用)

export LD_LIBRARY_PATH=./lib    只对当前会话有效

​ 3 设置环境变量LD_LIBRARY_PATH到~/.bashrc中(测试时使用)

vi ~/.bashrc
export LD_LIBRARY_PATH=/home/super/myCalc/lib       会话每次开启就会生效

​ 4 设置配置文件/etc/ld.so.conf(推荐使用),重启终端

//编辑动态连接器的配置文件
vi /etc/ld.so.conf
//动态库的路径写到配置文件中
/home/super/myCalc/lib
//更新动态库
ldconfig -v

gdb调试

启动gdb

gdb app

查看代码

>>>(gdb) l          #list
>>>(gdb) l 行号或函数名
>>>(gdb) l 文件名:行号或函数名

设置断点

  • 设置当前文件断点
>>>(gdb) b      #break
>>>(gdb) b 行号或函数名
>>>(gdb) b 文件名:行号或函数名
  • 设置条件断点
>>>(gdb) b 10 if value==19
  • 删除断点
>>>(gdb) d 断点的编号        #delete或del

查看设置的断点

>>>(gdb) i b            #info, 可以获取断点的编号,删除断点时用

开始执行gdb调试

>>>(gdb) start      #只执行一步
>>>(gdb) c          #continue,直接停在断点的位置
>>>(gdb) run        #有断点会停在断点处,没有会直接跑完程序,较少用

单步调试

>>>(gdb) s          #进入函数体内部
>>>(gdb) finish     #从函数体内部跳出
>>>(gdb) n          #不进入函数体内部
>>>(gdb) u          #退出当前循环

查看变量的值

>>>(gdb) p      print

查看变量的类型

>>>(gdb) ptype 变量名

设置变量的值

>>>(gdb) set var 变量=值

设置追踪变量

>>>(gdb) display 变量        #设置追踪变量
>>>(gdb) info display        #获取变量的编号
>>>(gdb) undisplay 编号       #取消追踪变量

退出gdb调试

>>>(gdb) quit

Git

Git连接GitHub

#初始化
git init

#激活颜色选项:
git config --global color.ui auto

git与github绑定:把本地的共钥复制到github中的ssh设置中

Nginx

Nginx 相关介绍(Nginx是什么?能干嘛?)

Django Linux+Nginx+uWSGI环境下部署(含Nginx返回400问题处理、防火墙管理)

#安装Nginx,默认80端口
#80与Apache可能冲突了,但是修改端口时要先把修改的端口用SELINUX子系统开放,并且打开防火墙
yum install epel-release
yum install nginx

#查看Nginx相关文件
rpm -ql nginx
/etc/nginx/nginx.conf为主要配置文件

Squid

待补充

Docker

寻找云平台操作Docker

待补充

Shell

#!/bin/bash
#第一行用来指明用那个shell运行脚本
#如果文件在环境变量所包含的文件夹下,那么可以直接输入文件名就能执行脚本了

运行之前要给脚本加可执行权限

使用./test.sh运行脚本test.sh

posted @ 2021-05-30 20:24  兔子翻书  阅读(100)  评论(0)    收藏  举报