运维面试题详解(一)

1.RSA,DSA 和 ECDSA加密对钥

ssh-keygen 是一个用于生成 SSH 密钥对的命令,而 ssh-keygen -t rsa 是 ssh-keygen 命令的一个选项。选项 -t rsa 表示生成 RSA 类型的密钥对。

RSA 是一种非对称加密算法,用于生成公钥和私钥对。使用 ssh-keygen 命令生成 RSA 密钥对时,系统会生成一个 RSA 类型的密钥对,其中包括一个公钥文件和一个私钥文件。

ssh-keygen 命令还支持其他类型的密钥对生成,如 DSA、ECDSA 等。你可以使用不同的选项来指定生成不同类型的密钥对。

DSA(Digital Signature Algorithm)和 ECDSA(Elliptic Curve Digital Signature Algorithm)都是非对称加密算法,用于生成公钥和私钥对。它们与 RSA 不同,使用不同的数学原理和算法。

DSA 是早期的非对称加密算法,使用大整数运算和模幂运算。它提供了较高的安全性和效率,但相对于 RSA 和 ECDSA,它需要更长的密钥长度来提供相同的安全性。

ECDSA 是基于椭圆曲线的非对称加密算法。相比于 DSA 和 RSA,它可以提供相同安全性的密钥对,但使用更短的密钥长度,从而减少了存储和传输的负担。这使得 ECDSA 成为许多现代加密协议和应用中的首选算法。

在选择使用 DSA 或 ECDSA 时,你应该考虑以下因素:

  • 安全性:ECDSA 提供了与 RSA 和 DSA 相当的安全性,但使用更短的密钥长度,这有助于提高性能和减少资源消耗。

  • 兼容性:不同的系统和应用程序可能对不同算法的支持有所差异。你应该确认目标系统或应用程序是否支持你选择的算法。

  • 密钥管理:不同算法的密钥对可能需要不同的管理和处理方法。你应该了解所选算法的密钥管理最佳实践和操作要求。

总之,DSA 和 ECDSA 都是可行的选择,具体取决于你的具体需求和环境。如果你担心密钥的长度和性能,以及对现代加密标准的兼容性,ECDSA 可能是一个更好的选择。如果你在一个遗留系统或应用中使用,DSA 可能仍然是一个合适的选择。

2.请使用sed awk grep find这几个命令中的一个命令找出文本a.txt中匹配字符串(test)前5行的内容

可以使用grep命令来找出文本a.txt中匹配字符串(test)前5行的内容。命令如下:

grep -B 5 "test" a.txt

这个命令会在文本a.txt中查找匹配字符串"test"的行,并显示匹配行的前5行内容。

grep -B 5 "test" a.txt,这是什么意思?

抱歉给出的命令有误,正确的命令应该是:

grep -A 5 "test" a.txt

这个命令的意思是在文件a.txt中查找匹配字符串"test"的行,并显示匹配行以及它后面的5行内容。

  • -A 表示显示匹配行以及它后面的行。

  • 5 表示显示匹配行后的5行内容。

如果你想要显示匹配行以及它前面的5行内容,可以使用-B参数:

grep -B 5 "test" a.txt

这个命令会显示匹配行以及它前面的5行内容。

sed '/test/ ' a.txt |tail -5,这个对么?

你提供的命令几乎正确,但有一个小错误。应该使用head而不是tail来获取匹配行的前5行内容。所以正确的命令是:

sed '/test/ {p; :a; N; 1,5!ba;}' a.txt

这个命令的意思是在文件a.txt中查找匹配字符串"test"的行,并显示匹配行以及它前面的5行内容。

  • '/test/ 表示只处理包含字符串"test"的行。

  • {p; :a; N; 1,5!ba;} 是一个sed的代码块,意思是将匹配行打印出来(p),然后循环读取下一行(N),直到读取了5行(1,5!ba)。

这个命令会显示匹配字符串"test"的行以及它前面的5行内容。

3.请写出 $# $? S! $$ $1 $0的含义

下面是对这些符号的含义的解释:

  • $#:表示命令行参数的个数。

  • $?:表示上一个命令的退出状态。如果上一个命令成功执行,则$?为0;如果上一个命令执行失败,则$?为非零值。

  • !:表示历史命令中与给定字符串匹配的最近命令。

  • $$:表示当前Shell进程的进程ID(PID)。

  • $1:表示命令行参数中的第一个参数。

  • $0:表示当前正在运行的脚本或命令的名称。

这些符号在Shell脚本中经常使用,用于获取命令行参数、检查命令的执行状态、获取进程ID等信息。

!符号在Shell中有两种用法:

  1. !作为历史命令的引导符号:在Shell中,可以使用!来执行历史命令。例如,!!表示执行上一个命令,!n表示执行第n个命令,!string表示执行最近的与给定字符串匹配的命令。

  2. !作为逻辑非运算符:在Shell脚本中,!可以用作逻辑非运算符,用于对逻辑表达式取反。

4.在Linux命令行中,可以使用多种方法进行整数运算,例如使用expr命令、使用let命令、使用$(( ))结构或者使用bc命令。

  1. 使用expr命令: 可以使用expr命令进行整数运算。例如,要计算2加3,可以输入以下命令:

    bashCopy code
    $ expr 2 + 3

    输出结果为5。

  2. 使用let命令: let命令也可以进行整数运算。例如,要计算5减去2,可以输入以下命令:

    bashCopy code$ let result=5-2
    $ echo $result

    输出结果为3。

  3. 使用$(( ))结构: 可以使用$(( ))结构进行整数运算。例如,要计算4乘以6,可以输入以下命令:

    bashCopy code
    $ echo $((4*6))

    输出结果为24。

  4. 使用bc命令: 如果需要进行更复杂的运算,可以使用bc命令。例如,要计算5除以2,可以输入以下命令:

    bashCopy code
    $ echo "scale=2; 5/2" | bc

    输出结果为2.50(scale=2用来指定小数位数)。

以上是一些常用的方法,可以根据具体需求选择适合的方法进行整数运算。

5.写出iptables规则,允许172.16.0.0/16 访问主机9000到9999的请求

您可以使用以下iptables规则来允许172.16.0.0/16网络的主机访问主机9000到9999的请求:

bashCopy code
sudo iptables -A INPUT -p tcp -s 172.16.0.0/16 --dport 9000:9999 -j ACCEPT

这条规则将添加到INPUT链中,它指定允许来自172.16.0.0/16网络的TCP流量通过主机的9000到9999端口。-p参数指定协议为TCP,-s参数指定源IP地址范围,--dport参数指定目标端口范围,-j参数指定动作为ACCEPT,表示接受该流量。

请注意,这是一条临时规则,重启后将失效。如需将规则持久化,可以根据使用的Linux发行版和防火墙配置工具进行保存。

iptables -A INPUT -p tcp -s 172.16.0.0/16 --dport 9000:9999 -j ACCEPT,解释下

这个iptables规则的含义是允许指定源IP地址范围为172.16.0.0/16的主机通过TCP协议访问主机的9000到9999端口。我来详细解释每个部分的含义:

  • iptables: 这是一个Linux系统中用于配置防火墙规则的命令。

  • -A INPUT: -A表示在INPUT链的末尾添加规则。INPUT链用于处理进入本地主机的流量。

  • -p tcp: -p参数指定要过滤的流量的协议类型,此处使用的是TCP协议。

  • -s 172.16.0.0/16: -s参数指定源IP地址范围,这里指定为172.16.0.0/16,表示允许来自这个网段内的主机访问。

  • --dport 9000:9999: --dport参数指定目标端口范围,这里指定为9000到9999,表示允许访问这个端口范围内的服务。

  • -j ACCEPT: -j参数指定动作,这里指定为ACCEPT,表示接受这个流量。

因此,这条规则的作用是允许172.16.0.0/16网络的主机通过TCP协议访问本地主机的9000到9999端口。

怎么查看它开放的端口?

要查看系统上已经开放的端口,可以使用以下命令:

plaintextCopy code
sudo netstat -tuln

该命令将显示所有当前在监听状态的TCP和UDP端口。你可以通过筛选结果来查找特定的端口。例如,如果你只对特定端口感兴趣,可以使用以下命令筛选结果:

plaintextCopy code
sudo netstat -tuln | grep <port_number>

<port_number> 替换为你要查找的具体端口号。例如,要查找端口9000至9999之间的端口,可以使用命令:

plaintextCopy code
sudo netstat -tuln | grep -E ":(900[0-9]|9[0-9]{3})\s"

这将显示与这些端口匹配的结果。如果某个端口在结果中显示为 LISTEN,则表示该端口是开放的。

用户

iptables -A INPUT -p tcp -s 172.16.0.0/16 --dport 9000:9999 -j ACCEPT,用这个开放的

这个命令是使用 iptables 开放端口范围 9000 到 9999,限定来源IP地址为 172.16.0.0/16 的 TCP 连接。这意味着从这个 IP 地址范围访问这些端口时,连接将被允许。

你可以将该命令输入到终端命令行中,确保具有足够的权限(如sudo),然后按下回车键执行该命令。执行后,iptables将更新防火墙规则,允许指定的连接。

请记住,iptables 规则设置是持久化的,也就是说它们会在系统重启后保持。如果你希望永久设置这些规则,你可能需要将其添加到适当的 iptables 配置文件中,以确保规则在系统重启后仍然生效。具体文件位置可能因操作系统的不同而有所不同。

6.要关闭iptables规则,您可以使用以下命令:

  1. 首先,打开终端或命令提示符。

  2. 输入以下命令以查看当前的iptables规则:

    sudo iptables -L

  3. 在输出中,找到包含您想要删除规则的行。在这种情况下,您可以搜索包含"-A INPUT -p tcp -s 172.16.0.0/16 --dport 9000:9999 -j ACCEPT"的行。

  4. 确定要删除的规则的编号。例如,如果该规则编号为2,您可以使用以下命令删除它:

    sudo iptables -D INPUT 2

    注意:请根据您实际的规则编号进行替换。

  5. 再次运行以下命令以确保规则已成功删除:

    sudo iptables -L

    您应该看到规则已不再显示。

这样,您已经成功关闭了指定的iptables规则。请记住,这些更改可能会影响您的网络安全,因此在进行任何更改之前,请确保您知道自己在做什么,并且对于网络安全有适当的了解。

一个tomcat启动脚本,手工执行ok,但是放入定时任务就是不执行,请问为什么

![助理](https://static.ttext.cn/00011.png

可能有以下几个原因导致定时任务中的Tomcat启动脚本不执行:

  1. 定时任务配置有误:请确保定时任务的配置正确,包括设置了正确的执行时间、执行命令等。可以尝试在定时任务中先执行一条简单的命令,如打印一条日志信息,看是否执行成功。

  2. 环境变量设置问题:如果Tomcat启动脚本中依赖了某些环境变量,而定时任务中无法识别这些环境变量,可能导致脚本执行失败。可以尝试在定时任务指定的命令中设置环境变量(如source命令)或者在脚本中设置绝对路径。

  3. 权限问题:请确保定时任务具有执行Tomcat启动脚本的权限。可以尝试手动执行定时任务中指定的命令,看是否存在权限限制。

  4. 相对路径问题:如果Tomcat启动脚本或其依赖的文件使用了相对路径,而定时任务的执行路径不同于手工执行时的路径,可能导致找不到文件而执行失败。可以尝试使用绝对路径来指定文件路径。

在定位问题时,可以查看定时任务的日志来获取更多的错误信息,以帮助定位问题所在。

7.一个tomcat启动脚本,手工执行ok,但是放入定时任务就是不执行,请问为什么

可能有以下几个原因导致定时任务中的Tomcat启动脚本不执行:

  1. 定时任务配置有误:请确保定时任务的配置正确,包括设置了正确的执行时间、执行命令等。可以尝试在定时任务中先执行一条简单的命令,如打印一条日志信息,看是否执行成功。

  2. 环境变量设置问题:如果Tomcat启动脚本中依赖了某些环境变量,而定时任务中无法识别这些环境变量,可能导致脚本执行失败。可以尝试在定时任务指定的命令中设置环境变量(如source命令)或者在脚本中设置绝对路径。

  3. 权限问题:请确保定时任务具有执行Tomcat启动脚本的权限。可以尝试手动执行定时任务中指定的命令,看是否存在权限限制。

  4. 相对路径问题:如果Tomcat启动脚本或其依赖的文件使用了相对路径,而定时任务的执行路径不同于手工执行时的路径,可能导致找不到文件而执行失败。可以尝试使用绝对路径来指定文件路径。

在定位问题时,可以查看定时任务的日志来获取更多的错误信息,以帮助定位问题所在。

8.当磁盘报错 "No space left on device",但是 df -h 命令显示磁盘空间并没有满的时候,可能是由于以下原因:

  1. 硬链接导致的磁盘空间占用:硬链接是多个文件名指向同一个文件的情况。当使用 df -h 命令查看磁盘空间时,只能统计每个文件的空间占用,并不能准确统计多个文件指向同一数据块的情况。因此,如果有多个硬链接指向同一个文件,磁盘空间占用只会计算一次,导致实际占用空间大于显示的磁盘空间占用。

  2. 进程持有文件但已被删除:当一个文件被一个进程持有,但是该文件已经被删除,空间仍然被该进程使用。通过 lsof 命令可以查看被删除的文件所属进程,并尝试重启该进程或者删除该进程。

  3. 磁盘空间不足导致磁盘空闲块过小:磁盘使用的文件系统超过预定的阈值,可能导致无法创建新的文件或者写入新增数据。在这种情况下,尽管磁盘空间还有剩余,但是无法正常写入新的数据。

  4. 文件系统损坏:文件系统的数据结构损坏可能导致错误的磁盘空间显示。可以使用 fsck 或者其他文件系统检查工具来修复文件系统错误。

如果以上方法仍然无法解决问题,建议联系系统管理员或磁盘供应商获取进一步的支持和辅助。

9.要统计nginx日志中访问最多的前10个IP,你可以使用以下命令:

######

shellCopy code
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

解释一下这个命令:

  1. cat /var/log/nginx/access.log 将nginx日志文件的内容输出到标准输出。

  2. awk '{print $1}' 使用awk命令提取出每行日志中的第一个字段,也就是IP地址。

  3. sort 对提取出的IP地址进行排序。

  4. uniq -c 统计相同的IP地址出现的次数。

  5. sort -nr 对统计结果进行逆序排序,即从访问次数最多到最少排序。

  6. head -n 10 输出前10行,即访问最多的前10个IP。

执行完上述命令后,你将会得到一个包含访问最多的10个IP地址及其访问次数的列表。

9./var/log/messages日志出现kernel: nf_conntrack table full,dropping.是什么原因导致的?如何解决?

"kernel: nf_conntrack table full,dropping"是Linux系统中的内核日志消息,它表示nf_conntrack表已满,无法继续跟踪更多的网络连接。

nf_conntrack表用于跟踪活动的网络连接,以便执行网络地址转换(NAT)和包过滤等任务。当nf_conntrack表满了,新的连接就无法跟踪,从而导致丢弃一些连接。

nf_conntrack表变满的原因可能是以下几种:

  1. 系统并发连接数过高,超过了nf_conntrack表的容量。

  2. 系统没有足够的内存来为新的连接分配nf_conntrack表项。

  3. 系统运行的应用程序或服务创建了大量的短时连接,导致nf_conntrack表变满。

为了解决nf_conntrack表满的问题,你可以尝试以下方法:

  1. 增加nf_conntrack表的容量:

    • 修改sysctl.conf文件,增加或修改以下参数:

      plaintextCopy code
      net.netfilter.nf_conntrack_max = 65536

      然后执行

      sysctl -p

      命令使设置生效。请根据实际情况调整

      nf_conntrack_max

      的值。

    • 可能还需要修改其他地方的配置,如防火墙等,以确保所有相关组件均支持更大的nf_conntrack表容量。

  2. 优化系统内存配置:

    • 检查系统内存使用情况,确保有足够的内存可供分配给连接追踪。

    • 根据实际需求和系统规模,调整内存分配(如增加物理内存,调整swap空间)。

  3. 检查和优化应用程序或服务:

    • 检查系统中运行的应用程序或服务,特别是可能创建大量短时连接的应用程序,例如DDoS攻击、爬虫等。

    • 尝试优化应用程序或服务配置、限制并发连接数或减少连接的存活时间。

请注意,在使用以上方法之前,建议你仔细分析系统的运行环境和连接需求,以选择适合的解决方案。并且,在进行任何系统配置更改之前,务必做好备份并小心操作。

10.Nginx+Keepalived 如何搭建高可用集群?需要描述出各个组件承担的作用

要搭建Nginx和Keepalived的高可用集群,需要以下组件及其作用:

  1. Nginx:作为高可用集群的负载均衡器和应用服务器。

    • Nginx负责接收来自客户端的请求,并根据负载均衡算法将请求分发到后端的应用服务器。

    • Nginx还可以提供HTTP缓存、SSL终端、反向代理等功能。

  2. Keepalived:用于实现Nginx的高可用性。

    • Keepalived可进行故障检测和故障切换,确保高可用集群中的主备节点之间的状态同步。

    • Keepalived通过虚拟路由冗余协议(VRRP)提供了一个虚拟的IP地址,该地址会漂移到当前活跃节点上,使客户端请求可被正确路由。

  3. 后端应用服务器:提供真实的应用服务和内容。

    • 后端服务器运行实际的应用代码和处理业务逻辑。

    • 后端服务器可以是多个,Nginx会根据负载均衡算法将请求发送到后端服务器上。

搭建步骤如下:

  1. 在多个服务器上安装并配置Nginx:每个Nginx节点上的配置文件基本相同,包含负载均衡算法、后端服务器列表等。

  2. 在Nginx节点上安装Keepalived:使用Keepalived配置文件指定虚拟IP地址和其他配置参数。

  3. 配置主备节点:在Nginx和Keepalived配置中指定主节点和备节点。

  4. 启动Nginx和Keepalived:分别在每个节点上启动Nginx和Keepalived服务。

  5. 验证高可用性:通过手动停止主节点上的Nginx或断开其网络连接,观察虚拟IP是否漂移到备节点并服务是否正常。

通过以上步骤,可以搭建一个Nginx和Keepalived的高可用集群,实现请求的负载均衡和故障切换。

11.CDN(内容分发网络)

当然,我很乐意帮助您解决关于CDN(内容分发网络)的问题。CDN是一种用于提供高速、可靠和安全内容传输的网络架构。下面是解决您的问题的步骤:

  1. 确定您的需求:首先,您需要明确为什么想要使用CDN以及您希望实现的目标。这可能包括提高网站的加载速度、降低服务器负载、提供全球内容分发等。

  2. 选择合适的CDN提供商:市场上有许多CDN提供商,您需要根据您的需求和预算来选择最合适的。一些知名的CDN提供商包括阿里云CDN、腾讯云CDN、Fastly等。

  3. 配置CDN:一旦选择了CDN提供商,您需要按照他们的指导配置CDN。通常,您需要将您的域名解析到CD提供商的服务器上,并配置缓存规则、安全策略等。

  4. 测试和优化:配置完成后,您应该对CDN进行测试以确保它正常工作,并评估其性能。您可以使用一些工具来测试网站的加载速度、缓存命中率等指标,并根据结果进行优化。

  5. 监测和维护:一旦CDN开始运行,您应该定期监测其性能和可用性。您可以使用CDN提供商提供的监测工具或第三方工具来监测网站的访问情况和性能指标。

12.NAT表示网络地址转换

NAT表示网络地址转换(Network Address Translation),是一种将私有IP地址转换为公共IP地址的技术。它可以帮助解决IPv4地址不足的问题,通过为内部网络中的设备分配私有IP地址,并在与外部网络通信时将私有IP地址转换为公共IP地址,实现内部设备与外部网络的通信。NAT还可以提供网络安全性,隐藏内部网络的真实IP地址,减少被攻击的风险。

13.NAT使用的几种情况包括:

  1. 缺少公共IP地址:由于IPv4地址空间有限,当公共IP地址不足时,使用NAT可以将多个内部设备共享一个公共IP地址。

  2. 隐藏内部网络:NAT可以将内部设备的真实IP地址隐藏起来,保护网络的安全性,减少遭受攻击的风险。

  3. 访问互联网:NAT可以将内部设备的私有IP地址转换为公共IP地址,使其能够与互联网上的其他设备通信。

  4. 连接多个内部网络:当有多个私有网络需要连接时,使用NAT可以实现这些网络之间的通信。

  5. 减少IPv4地址的使用:通过使用NAT,可以在内部网络中使用私有IP地址,节约公共IP地址的使用。

\1. 连接到INTERNET,但却没有足够的合法地址分配给内部主机; 2.更改到一个需要重新分配地址的ISP; 3.有相同的IP地址的两个INTRANET合并;4.想支持负载均衡(主机);

14.当用户在浏览器当中输入一个网站,说说计算机对dns解释结果哪些流程?注:本机跟本地DNS还没有缓存

www.baidu.com.

1.用户输入网址到浏览器;

2.浏览器发出DNS请求信息;

3.计算机首先查询本机HOST文件,不存在,继续下一步;

4.计算机按照本地DNS的顺序,向区域dns服务器查询IP结果;区域dns服务器查询不到时会从根域开始,按照DNS层次结构向下搜索,直至对于信息具有权威性;

5.将返回dns结果给本地dns和本机,本机和本地dns并缓存本结果,直到TTL过期,才再次查询此结果;

6.返回IP结果给浏览器;并给本地的DNS一份结果;

7.浏览器根据IP信息,获取页面;

15.*单独修改某一个账户的配置?**

进入/etc/目录下或者conf.d 目录下等修改配置文件

user_config_dir=/etc/vsftpd/userconf #vim /etc/vsftpd/userconf/zhanghu local_root=/zhanghu

16.我们都知道dns既采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么时候采用udp协议?为什么要这么设计?

dns有两个情况,一种是区域传输,一种是域名解析

1.区域传输时,一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息,传输协议是tcp。问:tcp

2.域名解析时,首选的通讯协议是udp

使用udp传输,不用经过TCP三次握手,这样DNS服务器负载更低,响应更快

但是当域名解析的反馈报文的长度超过512字节时,将不能使用udp协议进行解析,此时必须使用tcp回:udp

17.nfs(Network File System)

####

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

1.2NFS的文件传输

NFS这个服务器的端口开在2049,但由于文件系统非常复杂,因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了RPC服务(portmap 或rpcbind服务)

1.3什么是RPC服务?

RPC(Remote Procedure Call)即远程过程调用。RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的port上去

18.进程和线程的区别?

1.要先开启进程,才能开启线程

2.进程独占内存,线程是多个线程使用内存

3.使用线程可以减少内存资源消耗,单进程会消耗更多的内存

18.DHCP服务器

DHCP服务器是一种网络服务,用于分配IP地址、子网掩码、默认网关以及其他网络配置信息给网络中的设备。它在局域网中起到关键作用,为客户端设备提供动态网络配置。

DHCP服务器通常具有以下功能:

  1. IP地址池管理:维护可用的IP地址池,通过向客户端分配可用的IP地址,避免了手动配置IP地址的繁琐工作。

  2. 动态地址分配:当客户端设备加入网络时,DHCP服务器动态为其分配可用的IP地址。一旦设备离开网络,分配的IP地址返回到IP地址池中,可供下一个设备使用。

  3. 自动配置其他网络参数:除了IP地址外,DHCP服务器还可以自动配置子网掩码、默认网关、DNS服务器等其他网络参数,使客户端设备能够顺利地与网络通信。

  4. 地址冲突检测:DHCP服务器会检测网络上是否有其他设备使用了分配给客户端的IP地址,以避免发生地址冲突,保证每个设备都具有唯一的IP地址。

  5. 配置租约管理:DHCP服务器可以对分配给客户端的IP地址进行租约管理,设定客户端使用该IP地址的有效时间。一旦租约到期,客户端必须向DHCP服务器请求续租或重新获取IP地址。

通过使用DHCP服务器,网络管理员可以更加灵活地管理和维护大量设备上的网络配置,极大简化了网络管理工作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值