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=demo01

After=network.target



[Service]

Type=simple

ExecStart=/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=simple

ExecStart=/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 其它的端口

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地&#xff0c;则理想运放输出为零&#xff0c;但实际的运放输出不为零&#xff0c;有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是&#xff0c;运算放大器内部元件尤…

基于springboot+vue的流浪动物救助系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

小阿卡纳牌

小阿卡纳牌 风&#xff1a;热湿 火&#xff1a;热干 水&#xff1a;冷湿 土&#xff1a;冷干 火风&#xff1a;温度相同&#xff0c;但是湿度不同&#xff0c;二人可能会在短期内十分热情&#xff0c;但是等待热情消退之后&#xff0c;会趋于平淡。 湿度相同、温度不同&#x…

DeepSeek R1学习

0.回顾&#xff1a; https://blog.csdn.net/Together_CZ/article/details/144431432?ops_request_misc%257B%2522request%255Fid%2522%253A%25226574a586f0850d0329fbb720e5b8d5a9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id…

能说说MyBatis的工作原理吗?

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

2024年记 | 凛冬将至

放弃幻想&#xff0c;准备斗争&#xff01; 考研or就业&#xff1f; 上大学以来&#xff0c;考研上名校在我的心里一直是一颗种子&#xff0c;2024年初&#xff0c;当时的想法是考研和就业两手抓。买了张宇的高数现代&#xff0c;想要死磕&#xff01; 也记了挺多笔记... 如果…

关联传播和 Python 和 Scikit-learn 实现

文章目录 一、说明二、什么是 Affinity Propagation。2.1 先说Affinity 传播的工作原理2.2 更多细节2.3 传播两种类型的消息2.4 计算责任和可用性的分数2.4.1 责任2.4.2 可用性分解2.4.3 更新分数&#xff1a;集群是如何形成的2.4.4 估计集群本身的数量。 三、亲和力传播的一些…

21款炫酷烟花合集

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现18款炫酷烟花的代码。 Python Python烟花① 完整代码&#xff1a;Python动漫烟花&#xff08;完整代码&#xff09; ​ Python烟花② 完整…

汇编基础语法及其示例

1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注&#xff1a;第一操作寄存器…

GWO优化决策树分类预测matlab

本次研究采用的是 Excel 格式的分类数据集。将该数据集按照 8:1:1 的比例&#xff0c;精准划分为训练集、验证集和测试集。 数据处理流程完备&#xff0c;涵盖了数据加载、划分以及标准化等关键步骤&#xff0c;对数据进行了全面的预处理&#xff0c;显著提升了模型的训练效果与…

RAG技术:通过向量检索增强模型理解与生成能力

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

菜鸟之路Day10一一集合进阶(三)

菜鸟之路Day10一一集合进阶&#xff08;三&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.1.28 文章目录 菜鸟之路Day10一一集合进阶&#xff08;三&#xff09;0.概述1.双列集合概述2.Map2.1Map的常见API2.2Map的遍历方式 3.HashMap4.LinkedHashMap5.TreeMap 0.概…

2001-2021年 全国各地级市宽带接入用户统计数据

2001-2021年 全国各地级市宽带接入用户统计数据.zip 2001-2021年 全国各地级市宽带接入用户统计数据.ziphttps://download.csdn.net/download/2401_84585615/89575921 2001-2021年全国各地级市宽带接入用户统计数据反映了中国各地宽带接入服务的发展趋势。随着互联网的普及和…

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…

C基础寒假练习(3)

一、求数组中的第二大值 #include <stdio.h> int main() {int arr[] {12, 35, 1, 10, 34, 1};int size sizeof(arr) / sizeof(arr[0]);if (size < 2) {printf("数组元素不足两个\n");return 0;}int first -2147483648, second -2147483648; // 使用IN…

Vue 响应式渲染 - 待办事项简单实现

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 待办事项简单实现 目录 待办事项简单实现 页面初始化 双向绑定的指令 增加留言列表设置 增加删除按钮 最后优化 总结 待办事项简单实现 页面初始化 对页面进行vue的引入、创建输入框和按钮及实例化V…

计算机毕业设计Django+Tensorflow音乐推荐系统 机器学习 深度学习 音乐可视化 音乐爬虫 知识图谱 混合神经网络推荐算法 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

新增文章功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 之前又偷懒几天。回老家没事干&#xff0c;玩也玩不好&#xff0c;一玩老是被家里人说。写代码吧还是&#xff0c;他们都看不懂&a…

Oracle PMON进程清洗功能

PMON进程 简介 1&#xff0c;在进程非正常中断后&#xff0c;做清理工作。例如&#xff1a;dedicated server失败了或者因为一些原因被杀死&#xff0c;这是PMON的工作分两种。第一&#xff0c;是对dedicated server所做的工作进行恢复或撤销。第二&#xff1a;是释放dedicate…

2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新

2025美赛数学建模C题&#xff1a;奥运金牌榜&#xff0c;完整论文代码模型目前已经更新&#xff0c;获取见文末名片