当前位置: 首页 > news >正文

Linux 学习笔记__Day3

十八、设置虚拟机的静态IP

1、VMware的三种网络模式

安装VMware Workstation Pro之后,会在Windows系统中虚拟出两个虚拟网卡,如下:

VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT模式(网络地址转换)和仅主机模式(Host Only)

1)桥接模式(Bridged)

虚拟机和宿主机(Windows)是平等地位,其关系类似于连接同一交换机的两个主机。

该模式没有用到虚拟网卡交换机/路由器会给虚拟机配真实的IP地址网关和子网掩码

虚拟机与局域网中的主机互相访问,也可以访问互联网。

2)NAT模式(网络地址转换

该模式使用VMnet8虚拟网卡,由虚拟网卡VMnet8为虚拟机分配IP地址网关和DNS

虚拟机可以和宿主机进行相互通信,虚拟机可以访问局域网中其的主机,也可以访问互联网。但是,其它主机不能访问此虚拟机。

3)仅主机模式(Host Only)

该模式使用VMnet1虚拟网卡,由虚拟网卡VMnet1为虚拟机分配IP地址网关和DNS

虚拟机只能和宿主机进行相互通信,不能访问局域网中其它的主机,也不能访问互联网

应用的经验

1)缺省使用NAT模式(配置简单)。

2)如果你的Windows找不到虚拟网卡(VMnet1VMnet8),可以试试桥接模式,因为桥接模式不需要虚拟网卡。

3)把虚拟机的网络参数改为静态IP。

2、修改主机名

执行命令:

hostnamectl set-hostname 主机名

修改主机名还有其它的方法,百度。

十九、网络故障诊断

1、网络连通性测试ping

ping可以用来测试本机与目标主机是否连通速度和网络的稳定性。

ping -c 5 -s 1024 目标主机的IP地址(域名)

Linux缺省一直ping下去,用-c选项可以指定ping包的个数。Windows缺省ping四个包,用-n选项指定ping包的个数。

Linux-s选项指定ping发送数据的字节数(Windows的选项是-l),默认是84字节(56字节的数据+28字节的报头),最大不超过65535字节。

示例:

2、CentOS禁止ping的设置方法

服务器攻击一般是从ping开始,黑客攻击网站前会先ping下服务器,看它是否在线,如果服务器禁止ping,可以一定程度的减少服务器被攻击次数。CentOS系统默认允许ping,可以修改内核参数禁止ping

vi /etc/sysctl.conf

在文件末尾加上一行:

net.ipv4.icmp_echo_ignore_all=1

保存后执行sysctl -p使配置生效。

配置生效后,ping服务器收不到任何响应。如果需要允许ping,去掉/etc/sysctl.conf文件中的net.ipv4.icmp_echo_ignore_all=1或者修改为net.ipv4.icmp_echo_ignore_all=0即可。

3、服务可用性测试telnet

telnet 目标主机的IP地址(域名) 端口号

telnet失败的情况有三种:

1)目标主机不存在或者没有运行。

2)目标主机没有提供指定端口的服务。

3)被防火墙拦截了。

二十、系统服务管理

CentOS7开始,采用systemctl命令管理系统服务,类似Windows的“计算机管理->服务和应用程序->服务”功能。

服务的配置文件存放在/usr/lib/systemd/system目录中。

重点关注的服务有防火墙(firewalld.service)、远程登录(sshd.service,SSH协议)、文件传输(vsftpd.service,FTP协议)。

1、systemctl常用命令

systemctl命令的风格是:

systemctl 操作 服务名

1启动服务

systemctl start name.service

注意name.service.service可以省略不写,以下两条命令的效果相同。

systemctl start firewalld             # 启动防火墙服务。

systemctl start firewalld.service      # 启动防火墙服务。

2停止服务

systemctl stop name.service

3重启服务

如果服务没有启动,就启动它。

systemctl restart name.service

4)服务是否已启动

systemctl is-active name.service

5)查看服务状态

systemctl status name.service

示例:

Loaded关于服务是否已经加载的信息,文件的绝对路径以及是否被启用的注释。

Active服务是否正在运行然后是启动时间信息。

Process进程额外信息。

Main PID服务主进程pid。

CGroup:Control Groups额外信息。

6)启用开机自启动服务

systemctl enable name.service

7)禁用开机自启动服务

systemctl disable name.service

8)查看服务是否为开机自启动

systemctl is-enabled name.service

9)只重启正在运行中的服务

systemctl try-restart name.service

10)显示所有的服务状态

systemctl list-units --type service –all

按空格键显示下一页,按q键退出。

11)查看启动成功的服务列表

systemctl list-unit-files|grep enabled

12)查看启动失败的服务列表

systemctl --failed

13)查看所有服务的状态

systemctl list-unit-files --type service

按空格键显示下一页,按q键退出。

14)列出在指定服务之前启动的服务(依赖)

systemctl list-dependencies --after name.service

按空格键显示下一页,按q键退出。

15、列出在指定服务之后启动的服务(被依赖)

systemctl list-dependencies --before name.service

按空格键显示下一页,按q键退出。

2、添加自定义系统服务

1)准备服务程序

/home/wucz/demo01.cpp的源代码:

#include <iostream>#include <unistd.h>using namespace std;int main(){while(1)     // 死循环。{int *ptr=new int[100000000];  // 申请100000000*sizeof(int)大小的内存。delete [] ptr;                // 释放内存。sleep(1);  // 休眠1秒。}}

2)编写自定义的系统服务脚本文件

/home/wucz/start.sh的内容如下:

/home/wucz/demo01

/home/wucz/restart.sh的内容如下:

killall demo01

/home/wucz/demo01

/home/wucz/stop.sh的内容如下:

killall demo01

给start.sh、restart.sh、stop.sh赋予可执行权限:

chmod +x /home/wucz/start.sh /home/wucz/restart.sh /home/wucz/stop.sh

3)编写自定义服务的配置文件

系统服务启动/重启/停止由它的配置文件决定,把demo01程序的服务命名为demo01.service

创建服务配置文件/usr/lib/systemd/system/demo01.service,内容如下:

[Unit]Description=demo01After=network.target[Service]Type=simpleExecStart=/usr/bin/su - wucz -c "/home/wucz/start.sh"ExecReload=/usr/bin/su - wucz -c "/home/wucz/restart.sh"ExecStop=/usr/bin/su - wucz -c "/home/wucz/stop.sh"RemainAfterExit=yes[Install]WantedBy=multi-user.target

3、自定义系统服务配置文件的含义

1)Unit部分

Unit部分是启动顺序与依赖关系。

[Unit]

Description=demo01

After=network.target

Description字段:给出当前服务的简单描述。

Documentation字段:给出文档位置。

After字段:表示本服务应该在某服务之后启动。

Before字段:表示本服务应该在某服务之前启动。

AfterBefore字段只涉及启动顺序,不涉及依赖关系。设置依赖关系,需要使用Wants字段和Requires字段。

Wants字段:表示本服务与某服务之间存在“依赖”系,如果被依赖的服务启动失败或停止运行,不影响本服务的继续运行。

Requires字段表示本服务与某服务之间存在“强依赖”系,如果被依赖的服务启动失败或停止运行,本服务也必须退出。

2)Service部分

Service部分定义如何启动/重启/停止服务。

[Service]Type=simpleExecStart=/usr/bin/su - wucz -c "/home/wucz/start.sh"ExecReload=/usr/bin/su - wucz -c "/home/wucz/restart.sh"ExecStop=/usr/bin/su - wucz -c "/home/wucz/stop.sh"RemainAfterExit=yes

启动类型(Type字段)

Type字段定义启动类型。它可以设置的值如下。

simple(默认值):ExecStart字段启动的进程为主进程

forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程

oneshot:类似于simple,但只执行一次,Systemd会等它执行完,才启动其他服务

dbus:类似于simple,但会等待D-Bus信号后启动

notify:类似于simple,启动结束后会发出通知信号,然后Systemd再启动其他服务

idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。

启动服务(ExecStart字段

启动服务时执行的命令,可以是可执行程序、系统命令或shell脚本。

重启服务(ExecReload字段

重启服务时执行的命令,可以是可执行程序、系统命令或shell脚本。

停止服务(ExecStop字段)

停止服务时执行的命令,可以是可执行程序、系统命令或shell脚本。

如果 RemainAfterExit字段设为yes,表示进程退出以后,服务仍然保持执行。

3)Install部分

Install部分定义如何安装这个配置文件,即怎样做到开机启动。

[Install]

WantedBy=multi-user.target

WantedBy字段:表示该服务所在的Target。 

Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,demo01所在的Target是multi-user.target(多用户模式)

这个设置非常重要,因为执行systemctl enable demo01.service命令时demo01.service会被链接到/etc/systemd/system/multi-user.target.wants目录之中,实现开机启动的功能。

4、使用自定义的服务

1)重新加载服务配置文件

每次修改了服务配置文件后,需要执行以下命令重新加载服务的配置文件。

systemctl daemon-reload

2)启动/停止/启重demo01服务

systemctl start demo01   # 启动demo01服务

systemctl restart demo01 # 重启demo01服务

systemctl stop demo01   # 关闭demo01服务

3)把demo01服务设置为开机/关机自启动/停止

systemctl is-enabled demo01 # 查看demo01服务是否是开机自启动。

systemctl enable demo01   # 把demo01服务设置为开机自启动。

二十一、配置防火墙

1、防火墙的基本概念

防火墙技术是用于安全管理的软件和硬件设备,在计算机内/外网之间构建一道相对隔绝的保护屏障,以保护数据和信息安全性的一种技术。

防火墙分网络防火墙和主机防火墙。

网络防火墙由硬件加软件组成,可以保护整个网络,价格也很贵,从几万到几十万的都有,功能非常强大,主要包括入侵检测网络地址转换网络操作的审计监控强化网络安全服务等功能。

主机防火墙只有软件部分(操作系统和杀毒软件自带),用于保护本操作系统,功能比较简单,只能防范简单的攻击。

这节课将介绍主机防火墙(CentOS7以上版本)的使用和配置。

2、查看防火墙的命令

1查看防火墙服务状态(普通用户可执行),CentOS缺省启用防火墙。

systemctl status firewalld

2)查看防火墙已开通的端口,CentOS缺省不开通任何端口。

firewall-cmd --list-port

3)查看防火墙已开通的服务(CentOS缺省开通sshdhcpv6-client服务)。

firewall-cmd --list-service

4查看防火墙全部的信息。

firewall-cmd --list-all

5查看防火墙支持的服务列表(普通用户可执行)。

firewall-cmd --get-services

6查看防火墙服务是否开机启动

systemctl is-enabled firewalld

7查看防火墙的状态

firewall-cmd --state

8)查看防火墙的版本。

firewall-cmd --version

3、配置防火墙的命令

 1)、重启、关闭防火墙服务

# 启

systemctl start firewalld

# 重启

systemctl restart firewalld

# 关闭

systemctl stop firewalld

2)移去端口

# 开80端口

firewall-cmd --zone=public --add-port=80/tcp --permanent

# 移去80端口

firewall-cmd --zone=public --remove-port=80/tcp --permanent

3)开通、移去服务。

# 开ftp服务

firewall-cmd --zone=public --add-service=ftp --permanent

# 移去http服务

firewall-cmd --zone=public --remove-service=http --permanent

常用服务的端口:ssh(22)、HTTP(80、8080)、MySQL(3306)、Oracle(1521) 、ftp(21)

telnet(23)

4移去范围端口

# 开通5000-5500之间的端口

firewall-cmd --zone=public --add-port=5000-5500/tcp --permanent

# 移去5000-5500之间的端口

firewall-cmd --zone=public --remove-port=5000-5500/tcp --permanent

5)新加载防火墙配置参数(修改配置后要重新加载防火墙配置或重启防火墙服务)。

firewall-cmd --reload

6)设置开机时启用、禁用防火墙服务

# 启用服务

systemctl enable firewalld

# 禁用服务

systemctl disable firewalld

二十二、环境变量

程序(操作系统命令或应用程序)的执行需要参数,如果多个程序需要同一个参数,则应该把该参数设置为环境变量。

1、查看环境变量

1)env命令

shell下,用env命令查看当前用户全部的环境变量。

env

env|less

env|grep LANG

2)echo命令

echo $环境变量名

2、常用的环境变量

1)LANG

Linux系统的语言字符集,缺省的中文字符zh_CN.UTF-8,是主流。

如果出现乱码,SecureCRT与Linux系统的字符集不一致,百度解决。

2)SHELL

用户当前使用的shell(命令解析器,百度百科,了解基本概念即可)。

3HOSTNAME

服务器的主机名。

4)HISTSIZE

保存历史命令的数目。

5USER

当前登录用户的用户名。

6HOME

当前登录用户的主目录。

7PWD

当前工作目录。

8)PATH

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。

9)LD_LIBRARY_PATH

C/C++语言的动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。

10CLASSPATH

JAVA语言的库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要。

3、设置环境量

变量名='值'

export 变量名

export 变量名='值'

如果环境变量的值没有空格等特殊符号,值可以不用单引号包含。

环境变量在退出shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在脚本文件中配置。

设置PATH环境变量要注意:

export PATH=$PATH:新增的目录1:新增的目录2:新增的目录n:.

1$PATH表示包含原有PATH的值;

2)目录之间用:分隔;

3.表示当前目录。

4、设置系统环境变量

系统环境变量对全部的用户生效,设置系统环境变量有三种方法。

1)在/etc/profile.d目录中增加设置环境变量脚本文件,这是Linux推荐的方法。

2)在/etc/profile文件中设置。

用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。

/etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。

/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除 /etc/profile.d下对应的 shell 脚本即可

3)在/etc/bashrc文件中设置环境变量。

该文件配置的环境变量将会影响全部用户。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

5、设置用户环境变量

用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。

在用户的主目录,有几个隐藏的文件,用ls -l .bash*可以看见。

1.bash_profile(推荐首选)

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量

2.bashrc

当用户登录时以及每次打开新的shell时该文件都将被读取,不推荐在里配置用户专用的环境变量,因为每开一个shell,该文件都会被读取一次,效率肯定受影响。

3).bash_logout

当每次退出shell时执行该脚本文件。

4).bash_history

保存了当前用户使用过的历史命令。

6、su命令与环境变量

su命令可以切换到新用户,如果没有-选项,将使用之前的环境,如果有-选项,将使用新用户的环境,一般需要新用户的环境。

-c选项用于执行命令(脚本或程序)

二十三、开机启动程序

在CentOS7中,配置/etc/rc.local脚本文件,也可以实现开机启动程序。

1、/etc/rc.local是/etc/rc.d/rc.local的软链接

执行ls -l /etc/rc.local查看。

2、rc.local文件的原始内容

#!/bin/bash

# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES

#

# It is highly advisable to create own systemd services or udev rules

# to run scripts during boot instead of using this file.

#

# In contrast to previous versions due to parallel execution during boot

# this script will NOT be run after all other services.

#

# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure

# that this script will be executed during boot.

#

touch /var/lock/subsys/local

中文意思如下:

# 添加此文件是为了兼容。

# 强烈建议创建自己的systemd服务或udev规则,以便在引导期间运行脚本,而不是使用此文件。

# 与以前版本不同,由于在引导期间并行执行,此脚本不会在所有其他服务之后运行。

# 请注意,必须运行'chmod +x /etc/rc.d/rc.local',以确保在引导期间执行此脚本。

虽然Linux强烈建议采用自定义的系统服务实现开机自启动程序,但是,在实际工作中,配置/etc/rc.local脚本文件启动程序也是一个不错的方法,简单明了,仍被广泛的采用。

3、rc.local文件的配置

rc.local本质上是一个shell脚本文件,可以把系统启动时需要运行的程序写在里面,启动时将按顺序执行。

1)在rc.local中添加以下脚本。

/usr/bin/date >> /tmp/date1.log # 把当前时间追加写入到/tmp/date1.log中。

/usr/bin/sleep 10 # 睡眠10秒。

/usr/bin/date >> /tmp/date2.log # 把当前时间追加写入到/tmp/date2.log中。

2)修改/etc/rc.d/rc.local的可执行权限。

chmod +x /etc/rc.d/rc.local

3)重启服务器。

4)查看日志文件/tmp/date1.log/tmp/date2.log的内容。

4、应用经验

1)rc.local脚本在操作系统启动时只执行一次。

2)环境变量的问题。

在rc.local中执行程序时是没有环境变量的,如果执行的程序需要环境变量,可以在脚本中设置环境变量,也可以用su切换用户来执行程序。

3)不要让rc.local挂起。

rc.local中的内容是按顺序执行的,执行完一个程序后才会执行下一个程序,如果执行的不是后台程序,就应该加&让程序运行在后台,否则rc.local会挂起。

可以用以下脚本来测试,rc.local的内容如下:

/usr/bin/date >> /tmp/date1.log  # 把当前时间追加写入到/tmp/date1.log中。

/usr/bin/sleep 100 # 睡眠100秒。

/usr/bin/date >> /tmp/date2.log  # 把当前时间追加写入到/tmp/date2.log中。

如果采用了以上脚本,Linux系统在启动完成100后,才会出现以下的登录界面。

二十四、计划任务

linux系统用crond服务来提供计划任务,用于周期性的执行程序或脚本。

systemctl status crond

 

crond服务每分钟都会检查是否有需要执行的任务,如果有则执行该任务。

Linux下的计划任务分为两种:用户计划任务和系统计划任务。

1、用户计划任务

Linux的每个用户都可以定义自己的计划任务,用于周期性的执行程序或脚本。计划任务的内容存放在crontab文件中,每个用户都有自己的crontab文件。

1)查看crontab文件

crontab -l [-u 用户名]

root用户可以用-u选项查看指定用户的计划任务,如果没有-u选项,表示查看自己的计划任务。普通用户只查看自己的计划任务,不允许使用-u选项。

2)编辑crontab文件

crontab -e [-u 用户名]

root用户可以用-u选项编辑指定用户的计划任务,如果没有-u选项,表示编辑自己的计划任务。普通用户只能编辑自己的计划任务,不允许使用-u选项。crontab缺省的编辑工具是vi

3)删除crontab文件

crontab -r [-u 用户名]

root用户可以用-u选项删除指定用户的计划任务,如果没有-u选项,表示删除自己的计划任务。普通用户只删除自己的计划任务,不允许使用-u选项。

4、crontab文件格式

crontab文件中的每个任务由两部分组成,执行时间(周期)和执行命令。

执行时间有5个字段:

字段1:分钟(minute),取值0-59。

字段2:小时(hour),取值0-23

字段3:月当中的天(day of month),取值1-31,。

字段4:月份(month),取值1-12,或采用月份单词的英文简写。

字段5:星期中的天(day of week),取值0-6,或采用星期单词的英文简写。

以上还可以使用特殊字符:

星号(*):代表全部的值,例如day of month字段如果是星号,则表示在满足其它字段的制约条件后每天执行该任务。

逗号(,):可以用逗号分隔开的值指定一个列表,例如,“1,2,5,7,8,9”。

中杠(-):可以中杠表示一个范围,例如“2-6”表示“2,3,4,5,6”。

正斜线(/):可以用正斜线指定时间的间隔频率,例如minute字段,“0-30/5”表示在0-30的范围内每5分钟执行一次;“*/5”表示每5分钟执行一次。

2、crontab示例

1)每两分钟执行一次date命令,结果输出到/tmp/date.log文件(下同)。

*/2 * * * * /usr/bin/date > /tmp/date.log

2)在每个小时的05、10、15分执行一次date命令。

5,10,15 * * * * /usr/bin/date > /tmp/date.log

3)在每个小时20-30分之间的每一分钟执行一次date命令。

20-30 * * * * /usr/bin/date > /tmp/date.log

4)在每天的10:30分执行一次date命令。

30 10 * * * /usr/bin/date > /tmp/date.log

5)在每个月1号的02:30分执行一次date命令。

30 02 1 * * /usr/bin/date > /tmp/date.log

6)在每星期天的02:30分执行一次date命令。

30 02 * * 0 /usr/bin/date > /tmp/date.log

3、用户计划任务的环境变量

用户的计划任务无法设置环境变量,那么如何在用户计划任务中执行需要环境变量的程序呢?可以这么做:

1)编写一个shell脚本;

2)在脚本中设置环境变量;

3)在脚本中执行需要环境变量的程序。

4、系统计划任务

系统计划任务在/etc/crontab文件配置,以下缺省/etc/crontab文件的内容:

系统计划任务的/etc/crontab文件中,可以设置环境变量,可以指定执行任务的用户。系统计划任务的执行时间的与用户计划任务的执行时间含义相同,不再描述。

网上很多文章认为系统计划任务是执行系统级别的周期性任务例如系统备份、把缓存数据写入硬盘、清理日志文件等。这些说法有些片面,我不这么认为。用户计划任务和系统计划任务没有本质的区别,都可以达到相同的目的。

二十五、云服务器网络设置

1、server.cpp

#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>int main(int argc,char *argv[]){if (argc!=2){printf("Using:./server port\nExample:./server 5005\n\n"); return -1;}// 第1步:创建服务端的socket。int listenfd;if ( (listenfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }// 第2步:把服务端用于通信的地址和端口绑定到socket上。struct sockaddr_in servaddr;    // 服务端地址信息的数据结构。memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;  // 协议族,在socket编程中只能是AF_INET。servaddr.sin_addr.s_addr = htonl(INADDR_ANY);          // 任意ip地址。//servaddr.sin_addr.s_addr = inet_addr("192.168.190.134"); // 指定ip地址。servaddr.sin_port = htons(atoi(argv[1]));  // 指定通信端口。if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 ){ perror("bind"); close(listenfd); return -1; }// 第3步:把socket设置为监听模式。if (listen(listenfd,5) != 0 ) { perror("listen"); close(listenfd); return -1; }// 第4步:接受客户端的连接。int  clientfd;                  // 客户端的socket。int  socklen=sizeof(struct sockaddr_in); // struct sockaddr_in的大小struct sockaddr_in clientaddr;  // 客户端的地址信息。clientfd=accept(listenfd,(struct sockaddr *)&clientaddr,(socklen_t*)&socklen);printf("客户端(%s)已连接。\n",inet_ntoa(clientaddr.sin_addr));// 第5步:与客户端通信,接收客户端发过来的报文后,回复ok。char buffer[1024];while (1){int iret;memset(buffer,0,sizeof(buffer));if ( (iret=recv(clientfd,buffer,sizeof(buffer),0))<=0) // 接收客户端的请求报文。{printf("iret=%d\n",iret); break;   }printf("接收:%s\n",buffer);strcpy(buffer,"ok");if ( (iret=send(clientfd,buffer,strlen(buffer),0))<=0) // 向客户端发送响应结果。{ perror("send"); break; }printf("发送:%s\n",buffer);}// 第6步:关闭socket,释放资源。close(listenfd); close(clientfd);}

2、client.cpp

#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>int main(int argc,char *argv[]){if (argc!=3){printf("Using:./client ip port\nExample:./client 127.0.0.1 5005\n\n"); return -1;}// 第1步:创建客户端的socket。int sockfd;if ( (sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }// 第2步:向服务器发起连接请求。struct hostent* h;if ( (h = gethostbyname(argv[1])) == 0 )   // 指定服务端的ip地址。{ printf("gethostbyname failed.\n"); close(sockfd); return -1; }struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2])); // 指定服务端的通信端口。memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);if (connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)  // 向服务端发起连接清求。{ perror("connect"); close(sockfd); return -1; }char buffer[1024];// 第3步:与服务端通信,发送一个报文后等待回复,然后再发下一个报文。for (int ii=0;ii<3;ii++){int iret;memset(buffer,0,sizeof(buffer));sprintf(buffer,"这是第%d个超级女生,编号%03d。",ii+1,ii+1);if ( (iret=send(sockfd,buffer,strlen(buffer),0))<=0) // 向服务端发送请求报文。{ perror("send"); break; }printf("发送:%s\n",buffer);memset(buffer,0,sizeof(buffer));if ( (iret=recv(sockfd,buffer,sizeof(buffer),0))<=0) // 接收服务端的回应报文。{printf("iret=%d\n",iret); break;}printf("接收:%s\n",buffer);}// 第4步:关闭socket,释放资源。close(sockfd);}

二十六、云服务器的安全问题

云服务器暴露在互联网上,一定会受到攻击(用于挖矿、发广告邮件、游戏外挂)。

如果云服务器有黑客行为,可能会被云平台强制收回(不会退钱)。

1、设置强密码

例如:#87alp123(*&BE563DT99T=H%AJED#

2、禁用root用户远程登录

创建普通用户,以普通用户的身份远程登录云服务器,如果需要用到root用户的权限,su -即可。

修改ssh服务的配置文件/etc/ssh/sshd_config

#PermitRootLogin yes

改为

PermitRootLogin no

3、修改ssh的端口

把ssh的端口改为其它的,不要用22

修改/etc/ssh/sshd_config

#Port 22

改为

Port 其它的端口

注意:还需要开通云服务器的主机防火墙和云平台的安全组。

相关文章:

Linux 学习笔记__Day3

十八、设置虚拟机的静态IP 1、VMware的三种网络模式 安装VMware Workstation Pro之后&#xff0c;会在Windows系统中虚拟出两个虚拟网卡&#xff0c;如下&#xff1a; VMware提供了三种网络模式&#xff0c;分别是&#xff1a;桥接模式&#xff08;Bridged&#xff09;、NAT…...

Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)

一、编译SDL2-2.0.9 &#xff08;1&#xff09;&#xff0c; ./configure --prefix/home/z/Desktop/sdl2 --enable-sharedyes --enable-nasmno --enable-audiono --enable-ossno --enable-alsano --enable-alsa-sharedno --enable-pulseaudiono --enable-pulseaudio-sharedno …...

【时时三省】(C语言基础)文件的随机读写

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例&#xff1a; 这个输出的就是ade seek&#xff3f;cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK&#xff3f;CUR…...

HPO3:提升模型性能的高效超参数优化工具

引言 在当今快速发展的数据科学和机器学习领域中&#xff0c;超参数优化&#xff08;Hyperparameter Optimization, HPO&#xff09;是构建高性能模型不可或缺的一环。为了简化这一复杂过程&#xff0c;恒通网络科技团队推出了HPO3模块——一个专为Python开发者设计的强大库&a…...

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…...

AIGC(生成式AI)试用 19 -- AI Agent

AI Agent&#xff1a;自主完成特定目标任务。 AI Agent&#xff1a;以大语言模型为大脑驱动的系统&#xff0c;具备自主理解、感知、规划、记忆和使用工具的能力&#xff0c;能够自动化执行完成复杂任务的系统。AI Agent不同于传统的人工智能&#xff0c;它具备通过独立思考、调…...

LeetCode:70. 爬楼梯

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的…...

《Trustzone/TEE/安全从入门到精通-标准版》

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...

2025神奇的数字—新年快乐

2025年&#xff0c;一个神奇的数字&#xff0c;承载着数学的奥秘与无限可能。它是45的平方&#xff08;45&#xff09;&#xff0c;上一个这样的年份是1936年&#xff08;44&#xff09;&#xff0c;下一个则是2116年&#xff08;46&#xff09;&#xff0c;一生仅此一次。2025…...

第一个3D程序!

运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...

Hive:内部表和外部表,内外转换

内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆&#xff08;优先级队列&#xff09; 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…...

能说说MyBatis的工作原理吗?

大家好&#xff0c;我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助&#xff1b; 能说说MyBatis的工作原理吗&#xff1f; MyBatis 是一款流行的持久层框架&#xff0c;它通过简化数据库操作&#xff0c;帮助开发者更高效地与数据库进行交互。MyBatis…...

简单的SQL语句的快速复习

语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…...

Spring Boot多环境配置实践指南

在开发Spring Boot应用时&#xff0c;我们常常需要根据不同的运行环境&#xff08;如开发环境、测试环境和生产环境&#xff09;来配置不同的参数。Spring Boot提供了非常灵活的多环境配置机制&#xff0c;通过使用profile-specific properties文件&#xff0c;我们可以轻松地管…...

微信小程序中实现进入页面时数字跳动效果(自定义animate-numbers组件)

微信小程序中实现进入页面时数字跳动效果 1. 组件定义,新建animate-numbers组件1.1 index.js1.2 wxml1.3 wxss 2. 使用组件 1. 组件定义,新建animate-numbers组件 1.1 index.js // components/animate-numbers/index.js Component({properties: {number: {type: Number,value…...

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用&#xff1f; ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点&#xff08;RPO&#xff0c;Recoyery Point Objective&#xff09; ② 应用恢复时间&#xff08;RTO&#xff0c;Recoyery Time Objective&#xff09; 4…...

Vue.js组件开发-实现下载时暂停恢复下载

在 Vue 中实现下载时暂停和恢复功能&#xff0c;通常可以借助 XMLHttpRequest 对象来控制下载过程。XMLHttpRequest 允许在下载过程中暂停和继续请求。 实现步骤 创建 Vue 组件&#xff1a;创建一个 Vue 组件&#xff0c;包含下载、暂停和恢复按钮。初始化 XMLHttpRequest 对…...

TCP是怎么判断丢包的?

丢包在复杂的网络环境中&#xff0c;是一种常见的现象。 TCP&#xff08;传输控制协议&#xff09;作为一种可靠传输协议&#xff0c;内置了多种机制来检测和处理丢包现象&#xff0c;从而保证数据的完整性和传输的可靠性。本文将介绍TCP判断丢包的原理和机制。 一、TCP可靠传…...

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序

目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子&#xff1a; POST请求的例子&#xff1a; 3. 案例&#xff1a;…...

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

复古壁纸中棕色系和米色系哪个更受欢迎?

根据最新的搜索结果&#xff0c;我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析&#xff1a; 棕色系 受欢迎程度&#xff1a;棕色系在复古壁纸中非常受欢迎&#xff0c;因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…...

编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)

编译安装 前置需求&#xff1a; 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧&#xff0c;pip编译安装的时候&#xff0c;可以加上--jobs64来多核编译。 注意先升级pip版本&#xff1a;pip install pip -U pip3 install faiss-cpu --config-s…...

t113_can增加驱动

1 基于太极派的SDK添加 //设备树添加can0: can2504000 {compatible "allwinner,sun20i-d1-can";reg <0x0 0x02504000 0x0 0x400>;interrupts <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;clocks <&ccu CLK_BUS_CAN0>;resets <&ccu RST_BUS_…...

达梦数据库建用户,键库脚本

-- 1.创建表空间 CREATE TABLESPACE "表空间名称" DATAFILE /dmdata/data/DAMENG/表空间名称.DBF SIZE 512 AUTOEXTEND ON NEXT 512 MAXSIZE UNLIMITED; -- 2.创建用户 CREATE USER "表空间名称" IDENTIFIED BY "表空间名称" HASH WITH SHA512 S…...

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…...

MySQL 的索引类型【图文并茂】

基本分类 文本生成MindMap:https://app.pollyoyo.com/planttext <style> mindmapDiagram {node {BackgroundColor yellow}:depth(0) {BackGroundColor SkyBlue}:depth(1) {BackGroundColor lightGreen} } </style> * MySQL 索引** 数据结构角度 *** B树索引*** 哈…...

天聚地合:引领API数据流通服务,助力数字经济发展

天聚地合&#xff1a;引领API数据流通服务,助力数字经济发展 爱企猫01月24日消息&#xff1a;天聚地合&#xff08;苏州&#xff09;科技股份有限公司,成立于2010年,总部位于苏州,是一家综合性API数据流通服务商。公司旗下品牌‘聚合数据’已开发超过790个API,服务百万企业级客…...

【反悔堆】【hard】力扣871. 最低加油次数

汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处&#xff0c;并且有 fueli 升汽油。 假设汽车油…...