Linux 学习笔记__Day3
十八、设置虚拟机的静态IP
1、VMware的三种网络模式
安装VMware Workstation Pro之后,会在Windows系统中虚拟出两个虚拟网卡,如下:
VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT模式(网络地址转换)和仅主机模式(Host Only)。

1)桥接模式(Bridged)
虚拟机和宿主机(Windows)是平等地位,其关系类似于连接同一交换机的两个主机。
该模式没有用到虚拟网卡,交换机/路由器会给虚拟机分配真实的IP地址、网关和子网掩码。
虚拟机可以与局域网中的主机互相访问,也可以访问互联网。
2)NAT模式(网络地址转换)
该模式将使用VMnet8虚拟网卡,由虚拟网卡VMnet8为虚拟机分配IP地址、网关和DNS。
虚拟机可以和宿主机进行相互通信,虚拟机可以访问局域网中其它的主机,也可以访问互联网。但是,其它主机不能访问此虚拟机。
该模式将使用VMnet1虚拟网卡,由虚拟网卡VMnet1为虚拟机分配IP地址、网关和DNS。
虚拟机只能和宿主机进行相互通信,不能访问局域网中其它的主机,也不能访问互联网。
1)缺省使用NAT模式(配置简单)。
2)如果你的Windows找不到虚拟网卡(VMnet1和VMnet8),可以试试桥接模式,因为桥接模式不需要虚拟网卡。
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字段:表示本服务应该在某服务之前启动。
After和Before字段只涉及启动顺序,不涉及依赖关系。设置依赖关系,需要使用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缺省开通ssh和dhcpv6-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(命令解析器,百度百科,了解基本概念即可)。
3)HOSTNAME
服务器的主机名。
4)HISTSIZE
保存历史命令的数目。
5)USER
当前登录用户的用户名。
6)HOME
当前登录用户的主目录。
7)PWD
当前工作目录。
8)PATH
可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。
9)LD_LIBRARY_PATH
C/C++语言的动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。
10)CLASSPATH
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之后,会在Windows系统中虚拟出两个虚拟网卡,如下: VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT…...
SOME/IP--协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…...
【方法论】ChatGPT与DeepSeek的联合应用,提升工作效率的新解决方案
标题:ChatGPT与DeepSeek的联合应用,提升工作效率的新解决方案 【表格】ChatGPT与DeepSeek联合应用流程 阶段工具主要任务优势备注初稿生成ChatGPT基于用户输入生成初步内容高效、快速生成内容,适应多种主题适合生成长篇文章、报告、分析等验…...
JWT实现单点登录
文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程:为gateway增加登录校验拦截器 另一种单点登录方法:Token+Redis实现单点登录 JWT实现单点登录 登录流程ÿ…...
使用Avalonia UI实现DataGrid
1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…...
特权模式docker逃逸
目录 1.环境 2.上线哥斯拉 3.特权模式逃逸 1.判断是否为docker环境 2.判断是否为特权模式 3.挂载宿主机磁盘到docker 4.计划任务反弹shell 1.环境 ubuntu部署一个存在CVE-2017-12615的docker: (ip:192.168.117.147) kali(ip:192.168.117.128) 哥斯拉 2.上线哥斯拉…...
Ollama+DeepSeek本地大模型部署
1、Ollama 官网:https://ollama.com/ Ollama可以干什么? 可以快速在本地部署和管理各种大语言模型,操作命令和dokcer类似。 mac安装ollama: # 安装ollama brew install ollama# 启动ollama服务(默认11434端口…...
公司的税收日期的确定(OBCK)
本文主要介绍在S4 HANA OP中S4 HANA公司的税收日期的确定(OBCK)相关设置。具体请参照如下内容: 如果税率是基于日期的,那么以上配置点用来确定基于什么日期来确定最终使用的税率。 如果勾选,则代表以“凭证日期”作为税率确定的日期如果不勾…...
通过高效的侦察发现关键漏洞接管整个IT基础设施
视频教程在我主页简介或专栏里 在这篇文章中, 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制,成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…...
PostGIS笔记:PostgreSQL中表、键和索引的基础操作
创建、查看与删除表 在数据库中创建一个表,使用如下代码: create table streets (id serial not null primary key, name varchar(50));这里的表名是streets,id是主键所以非空,采用serial数据类型,这个数据类型会自动…...
Yolo11 + OCR 营业执照识别+信息抽取(预期后续改用其他ocr更简单,推理预计使用onnxruntim加速,分c++和python两种方式部署)
目录 一 数据集制作 1 labelimg的安装与使用 2 标注方式 3 数据集制作 二 模型训练 三 使用Yolo11 + OCR 实现“营业执照”信息解析完整方案 1 cutLinesforcode.py 2 getBusinessLicenseContentPart.py 3 getPartWords.py 4 pdfTojpg.py 5 main.py 本项目可用于毕业…...
Linux 学习笔记__Day2
目录 十二、上传和下载文件 十三、软件包的安装和卸载 十四、打包和压缩 1、zip命令 2、tar命令 3、其它打包压缩的命令 十五、Linux进程 1、查看进程 2、终止进程 十六、性能分析top 1、top输出结果说明 2、top常用的选项 3、top交互命令 4、demo01.cpp 5、de…...
“腾讯、钉钉、飞书” 会议开源平替,免费功能强大
在数字化时代,远程办公和线上协作越来越火。然而,市面上的视频会议工具要么贵得离谱,要么功能受限,甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet,这可是我在网…...
接口技术-第4次作业
目录 作业内容 解答 1、设8255A接到系统中,端口A、B、C及控制口地址分别为304H、305H、306H及307H,工作在方式0,试编程将端口B的数据输入后,从端口C输出,同时,将其取反后从端口A输出。 2、下图中&#x…...
【Elasticsearch】Elasticsearch的查询
Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...
day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧
逛自己手机的社区:即(手机牌子)摄影社区 拍照时防止抖动可以控制自己的呼吸,不要大喘气 拍一张照片后,如何简单的用手机修图? HDR模式就是让高光部分和阴影部分更协调(拍风紧时可以打开&…...
wordpress代码结构解析
WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统(CMS),广泛用于构建网站和博客。要解析 WordPress 代码,首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南: --- ### 1. *…...
【Leetcode 热题 100】416. 分割等和子集
问题背景 给你一个 只包含正整数 的 非空 数组 n u m s nums nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 数据约束 1 ≤ n u m s . l e n g t h ≤ 200 1 \le nums.length \le 200 1≤nums.length≤200 1 ≤ n u m s [ i ] ≤ …...
Java定时任务实现方案(四)——Spring Task
Spring Task 这篇笔记,我们要来介绍实现Java定时任务的第四个方案,使用Spring Task,以及该方案的优点和缺点。 Spring Task是Spring框架提供的一个轻量级任务调度框架,用于简化任务调度的开放,通过注解或XML配置的…...
Linux - 进程间通信(2)
目录 2、进程池 1)理解进程池 2)进程池的实现 整体框架: a. 加载任务 b. 先描述,再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1: 解答1ÿ…...
langchain基础(二)
一、输出解析器(Output Parser) 作用:(1)让模型按照指定的格式输出; (2)解析模型输出,提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser:…...
解除阿里云盘压缩包分享限制的最新工具(2025年更新)
前言 前段时间,为了在阿里云盘分享一些资料,尝试了好多种方法:改文件名后缀,打包自解压,使用将压缩文件追加在图片文件后,还有的一些工具,虽然能伪装文件但并不太好用,最后自己写了…...
2025神奇的数字—新年快乐
2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。2025…...
PWM频率测量方法
测量PWM(脉宽调制)信号的频率是嵌入式系统中的常见需求,尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法:测频法与测周法。 1、测频(率)法 原理:在闸门…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
JavaScript系列(47)--音频处理系统详解
JavaScript音频处理系统详解 🎵 今天,让我们深入探讨JavaScript的音频处理系统。Web Audio API为我们提供了强大的音频处理和合成能力,让我们能够在浏览器中实现复杂的音频应用。 音频系统基础概念 🌟 💡 小知识&…...
【解决方案】VMware虚拟机adb连接宿主机夜神模拟器
1、本机(宿主机,系统windows10)ip为192.168.31.108 2、运行模拟器后本机cmd查看端口为62026 3、VMware虚拟机(系统,kali)adb连接192.168.31.108:62026报错 failed to connect to 192.168.31.108:16416: Co…...
DroneXtract:一款针对无人机的网络安全数字取证工具
关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件,该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…...
基于springboot+vue的流浪动物救助系统的设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
利用ue5制作CG动画笔记
tips: 按住鼠标中键可以拖动枢轴点 在曲线编辑器中按住shift可以使曲线编辑保持在x轴 专业术语: CGI:计算机生成图象(computer-generated imagery)真实的不算,计算机生成的 Compositing:合…...
