• [技术干货] Linux系统中如何查看磁盘情况
    Linux不像windows系统那样方便的图形界面,特别是作为服务器使用的时候,只有命令行可以使用。我有个云服务器平时用来做一些数据分享用的,最近想看看磁盘和其中文件的占用情况,于是搜索并学习了一些查看磁盘空间信息的命令,命令虽然简单,但对我自己来说还是有些新的东西值得记录。1. df首先,登录服务器用df命令查看磁盘情况:/home/projects/databook# df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda1 51420828 14018512 35079240 29% / 输出包含当前文件系统的磁盘使用情况。df命令有个-h参数,可以更好的展示磁盘情况:/home/projects/databook# df -h . Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 14G 34G 29% /-h参数一般是用来显示帮助信息的,但是对于df命令,h表示human,也就是以人类易读的方式显示。上面的输出表示这个磁盘的使用量,包括我的虚拟服务器上的所有内容——可执行文件、库和支持文件等等。总容量 50G,目前只使用了29%,剩余的还比较充裕。2. du接下来,我想看看databook目录的文件占用情况。这需要使用 du 命令:/home/projects/databook# du -hd 1 . 24K ./certs 4.0K ./download 3.2M ./admin-ui 2.9M ./public 108K ./output 181M ./upload 472K ./markdown-files 207M . 同样,-h参数表示以人类易读的方式显示,-d 1参数表示 du 只进入一个目录级别(也就是当前目录)。从输出可以看出,upload目录稍微大点,其他目录都还好。最后一行 207M 是整个目录占用磁盘的大小。我希望按照文件/文件夹 占用磁盘空间大小的顺序来显示,这样可以快速定位到占用空间大的 文件/文件夹。3. du | sort但是,du命令并没有按磁盘空间排序的参数,所以尝试结合 sort 命令来排序。/home/projects/databook# du -hd 1 . | sort -n 2.9M ./public 3.2M ./admin-ui 4.0K ./download 24K ./certs 108K ./output 181M ./upload 207M . 472K ./markdown-filessort命令的-n参数表示按数字排序,不过文件夹大小不仅有数字,还有单位(比如M,K这些)。所以,这样排序对我们用处不大。接着,尝试所有文件统一用字节表示,然后在排序:/home/projects/databook# du -kd 1 . | sort -n 4 ./download 24 ./certs 108 ./output 472 ./markdown-files 2948 ./public 3224 ./admin-ui 184532 ./upload 211112 . du命令的-k参数表示用字节表示文件/文件夹的大小。这样虽然可以正常排序,但是可读性差,字节并不是人类易读的方式,还是MB,GB更好理解。进一步调查,发现sort命令居然也有-h参数,也是为了读取人类易读格式的值。/home/projects/databook# du -hd 1 . | sort -hr 207M . 181M ./upload 3.2M ./admin-ui 2.9M ./public 472K ./markdown-files 108K ./output 24K ./certs 4.0K ./download 这样就满足了我查询磁盘空间的要求。sort命令的-r参数表示从大到小排序,因为我关注的是大文件,所以想把它们排在前面。补充:-h参数是在2009年添加到GNU sort 的。
  • [技术干货] 升级openssh前安装zlib报异常configure aborting
    事情是这样的,因为系统漏洞问题,需要升级openssh,从OpenSSH_9.3p1升级到OpenSSH_9.3p2系统版本:CentOS 7升级OpenSSH_9.3p2之前需要先升级zlib从官网下载wget https://www.zlib.net/zlib-1.3.1.tar.gz解压tar -zxvf zlib-1.3.1.tar.gz cd zlib-1.3.1 ./configure --prefix=/usr/zlib执行配置的时候报错** ./configure aborting. 在其他服务器上执行的时候是没有报错的,查了一下,需要安装build-essential,但是CentOS没有build-essential,所以问题应该不在这里查看./configure.log提示libmpc.so.3不能打开find / -name libmpc.so.3没有找到这个文件 于是在之前正常配置的服务器上执行同样的命令查了一下在/usr/lib和/usr/lib64下有这两个文件,那么问题简单了,直接把这个文件从另一个服务器上考过来放到同样的地方应该就行了(因为是64位系统,所以只取lib64下的就行了)上传后重新执行./configure --prefix=/usr/zlib发现问题依然存在,继续查看日志 这次提示缺少libmpfr.so.4,同样的操作,再从别的服务器上把libmpfr.so.4平移过来,中间步骤省略了,依然是在/usr/lib64里再次执行./configure --prefix=/usr/zlib配置成功 其实写这个文章之所以把步骤写出来,就是不想让大家遇到问题只想到补充libmpc.so.3和libmpfr.so.4这两个文件,在操作的时候发现每个服务器其实缺少的文件不一定一样,所以有问题应该先分析日志,然后缺少哪个就去有文件的服务器上去找,然后平移过来就可以了转载自https://www.cnblogs.com/xiu123/p/18211147
  • Linux 防火墙只允许指定IP 端口访问
    开启和关闭防火墙命令如下:查看防火状态systemctl status firewalld2:暂时关闭防火墙systemctl stop firewalld3:永久关闭防火墙systemctl disable firewalldsystemctl stop firewalld.service4:重启防火墙systemctl enable firewalld5、查看防火墙已开通的端口:sudo firewall-cmd --list-ports6、开放指定端口:firewall-cmd --zone=public --add-port=80/tcp --permanent命令含义:–zone #作用域;–add-port=3306/tcp #添加端口,格式为:端口/通讯协议;–permanent #永久生效,没有此参数重启后失效7、从Linux防火墙中删除已开放的端口:firewall-cmd --zone=public --remove-port=6379/tcp给指定的IP开放/关闭指定的端口:添加规则// 允许ip127.0.0.1访问8888端口firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="8888" accept"//重新载入一下防火墙设置,使设置生效firewall-cmd --reload//查看已设置规则firewall-cmd --zone=public --list-rich-rules 删除规则 //限制IP为127.0.0.1的地址禁止访问8888端口即禁止访问机器firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="8888" reject" //删除已设置规则firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address=" 127.0.0.1" port protocol="tcp" port="8888" accept"转载自https://www.cnblogs.com/supyang/p/18213072
  • [常见问题汇总帖] 在虚拟机中ebpf程序跟踪socket得到的源IP地址和目的ip地址一样
    在虚拟机上进行编译和执行,得到的结果源地址IP和目的地址IP是一样的,网络用的桥接模式。在user程序中进行对百度的ping操作。而且监控网口改成了我自己的网口。但是得到的就有我虚拟机的地址,socket源和目的地址都是。这是负责储存信息的结构体,在map中作为键key。这是给结构体中源和目标地址赋值的操作函数部分。这是map,值为包的数量和大小的结构体。这是user态的输出。像是端口,协议号,包数和数据大小都能正常输出,就是这个源地址和目的地址是一样的。然后我把源和目的地址改成定值1和2.输出就是1和2,感觉这是对的(没有ping百度,是连接的vscode,走22端口)然后我又去看了这个struct __sk_buff的偏移量,确实也是不一样的,源地址n1的偏移量26,目的地址n2的偏移量30,理应得到两个不同的内容才对。这俩load_word函数得到的理应是不同的值才对。但输出的确实是同一个值。但输出就是一样的,就怀疑是struct __sk_buff结构体里面填充的源和目的地址是一样的。这个程序就是源码目录下/samples/bpf/sockex3.我不能理解为什么,也许是我没理解到程序在做什么,求救大佬指导。
  • Linux实现免密登录的配置方法【转】
    需求描述:192.168.31.10服务器的yunwei账号,想要免密登陆到192.168.31.15服务器上。直接ssh root@192.168.31.15这样登陆,不用输入密码。实现:1、在10机器上,创建运维账号。123456[root@docker01 ~]# id yunwei                检查yunwei账号是否存在id: yunwei: no such user[root@docker01 ~]# useradd yunwei           创建yunwei账号[root@docker01 ~]# su - yunwei              切换到yunwei账号[yunwei@docker01 ~]$ pwd/home/yunwei2、在yunwei账号下创建密钥123456789[yunwei@docker01 ~]$ ssh-keygen     创建密钥,一路回车Generating public/private rsa key pair.Enter file in which to save the key (/home/yunwei/.ssh/id_rsa):Created directory '/home/yunwei/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/yunwei/.ssh/id_rsa.Your public key has been saved in /home/yunwei/.ssh/id_rsa.pub.The key fingerprint is:3、复制密钥到15服务器4、验证免密登陆12[yunwei@docker01 .ssh]$ ssh root@192.168.31.15Last login: Sun Mar 26 11:21:02 2023 from 192.168.31.1补充:优化密钥创建方式,免交互创建密钥ssh-keygen -P '' -f id_rsa      免交互方式,创建密钥Generating public/private rsa key pair.Your identification has been saved in id_rsa.Your public key has been saved in id_rsa.pub.The key fingerprint is:参数说明:-t 指定要创建的密钥类型dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | RSA可能的值为“dsa”、“ecdsa”、“ecdsa-sk”、“ed25519”、“ed25519-sk”或“rsa”。当使用 RSA CA 密钥签署证书时,此标志还可用于指定所需的签名类型。可用的 RSA 签名变体是“ssh-rsa”(SHA1 签名,不推荐)、“rsa-sha2-256”和“rsa-sha2-512”(默认值)-P 密码提供(旧)密码。这里的密码,是密钥的密码,不是远程主机的密码,随便设置。但是,这就失去了免密登陆的意义。因为,设置了这个后,登陆远程主机时,就必须输入密钥密码。所以,一般这个指指定为空即可。-f 文件名指定密钥文件的文件名这里的文件名,必须指定为id_rsa,不然,把密钥推送到目标机器,依然无法实现免密登陆。总结:就三个命令123cd                          进入当前账号家目录ssh-keygen                  连续三次回车      ssh-copy-id 192.168.31.15   复制公钥到hadoop104服务器,这样,就可以免密访问hadoop104服务器这里用户账号省略,则使用当前账号进行免密登陆比如,当前账号是test1ssh-copy-id 192.168.31.15 等价与 ssh-copy-id test@192.168.31.15实现的效果是,当前服务器的test账号可以免密登陆15服务器的test账号、
  • [技术干货] Linux 服务器上配置基于SSH 密钥的身份验证及使用方法【转】
    介绍SSH(Secure Shell)是一种加密协议,用于管理和与服务器通信。在使用 Linux 服务器时,您经常会花费大量时间在通过 SSH 连接到服务器的终端会话中。虽然有几种不同的登录 SSH 服务器的方式,但在本指南中,我们将专注于设置 SSH 密钥。SSH 密钥提供了一种非常安全的登录服务器的方式。因此,这是我们建议所有用户使用的方法。SSH 密钥是如何工作的?SSH 服务器可以使用各种不同的方法对客户端进行身份验证。其中最基本的是密码身份验证,这种方法易于使用,但并不是最安全的。尽管密码以安全的方式发送到服务器,但它们通常不够复杂或长以抵御重复和持续的攻击者。现代处理能力结合自动化脚本使得破姐受密码保护的帐户成为可能。虽然还有其他方法可以增加额外的安全性(例如 fail2ban 等),但 SSH 密钥被证明是一种可靠和安全的替代方法。SSH 密钥对是两个密码安全的密钥,可用于对客户端进行 SSH 服务器身份验证。每个密钥对包括一个公钥和一个私钥。私钥由客户端保留,应绝对保密。私钥的任何泄露都将允许攻击者在不需要额外身份验证的情况下登录配置有相关公钥的服务器。作为额外的预防措施,密钥可以在磁盘上使用密码短语进行加密。相关的公钥可以自由共享,不会产生任何负面影响。公钥可用于加密只有私钥可以解密的消息。这一特性被用作使用密钥对进行身份验证的一种方式。公钥被上传到您希望能够通过 SSH 登录的远程服务器。该密钥被添加到您将要登录的用户帐户中的一个特殊文件中,称为 ~/.ssh/authorized_keys。当客户端尝试使用 SSH 密钥进行身份验证时,服务器可以测试客户端是否拥有私钥。如果客户端能够证明自己拥有私钥,将会生成一个 shell 会话或执行请求的命令。步骤 1 —— 创建 SSH 密钥配置 SSH 密钥身份验证到您的服务器的第一步是在本地计算机上生成 SSH 密钥对。为此,我们可以使用一个名为 ssh-keygen 的特殊实用程序,它包含在标准 OpenSSH 工具套件中。默认情况下,这将创建一个 3072 位的 RSA 密钥对。在本地计算机上,通过输入以下命令生成 SSH 密钥对:12[本地环境]ssh-keygen123[本地环境]生成公钥/私钥 rsa 密钥对。输入要保存密钥的文件(/home/username/.ssh/id_rsa):该实用程序将提示您选择要生成的密钥的位置。默认情况下,密钥将存储在用户主目录中的 ~/.ssh 目录中。私钥将被称为 id_rsa,相关的公钥将被称为 id_rsa.pub。通常,在这个阶段最好使用默认位置。这样做将允许您的 SSH 客户端在尝试进行身份验证时自动找到您的 SSH 密钥。如果您想选择非标准路径,请现在输入该路径,否则按 ENTER 接受默认值。如果您之前生成过 SSH 密钥对,您可能会看到类似以下的提示:123[本地环境]/home/username/.ssh/id_rsa 已经存在。覆盖(y/n)?如果选择覆盖磁盘上的密钥,您将无法再使用先前的密钥进行身份验证。在选择是时要非常小心,因为这是一个不可逆转的破坏性过程。1234[本地环境]创建目录 '/home/username/.ssh'。输入密码短语(留空表示没有密码短语):再次输入密码短语:接下来,您将被提示为密钥输入密码短语。这是一个可选的密码短语,可用于加密磁盘上的私钥文件。您可能会想知道,如果您仍然需要输入密码短语,SSH 密钥提供了哪些优势。其中一些优势包括:私有 SSH 密钥(可以受密码短语保护的部分)永远不会在网络上暴露。密码短语仅用于在本地机器上解密密钥。这意味着网络基础的破姐将无法针对密码短语进行。私钥保存在受限制的目录中。SSH 客户端将不会识别未保存在受限制目录中的私钥。密钥本身也必须具有受限制的权限(仅对所有者可用的读和写权限)。这意味着系统上的其他用户无法窥视。任何希望破解私有 SSH 密钥密码短语的攻击者必须已经访问系统。这意味着他们已经可以访问您的用户帐户或 root 帐户。如果您处于这种位置,密码短语可以防止攻击者立即登录到您的其他服务器。这将希望给您时间创建和实施新的 SSH 密钥对,并从受损的密钥中删除访问权限。由于私钥永远不会暴露在网络上,并且通过文件权限进行保护,因此该文件永远不应该对除您(和root用户)以外的任何人可访问。密码短语作为一个额外的保护层,以防这些条件被破坏。密码短语是一个可选的附加项。如果输入密码短语,您将需要在每次使用该密钥时提供它(除非您正在运行存储解密密钥的 SSH 代理软件)。我们建议使用密码短语,但如果您不想设置密码短语,可以按 ENTER 跳过此提示。1234567891011121314151617[本地环境]您的标识已保存在 /home/username/.ssh/id_rsa。您的公钥已保存在 /home/username/.ssh/id_rsa.pub。密钥指纹为:SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname密钥的随机艺术图像为:+---[RSA 3072]----+|o   ..oo.++o ..  || o o +o.o.+...   ||. . + oE.o.o  .  || . . oo.B+  .o   ||  .   .=S.+ +    ||      . o..*     ||        .+= o    ||        .=.+     ||       .oo+      |+----[SHA256]-----+现在您有了可以用于身份验证的公钥和私钥。下一步是将公钥放在您的服务器上,以便您可以使用 SSH 密钥身份验证登录。步骤 2 —— 将 SSH 公钥复制到您的服务器有多种方法可以将您的公钥上传到远程 SSH 服务器。您使用的方法在很大程度上取决于您可用的工具和当前配置的细节。以下方法都会产生相同的最终结果。最简单、最自动化的方法首先描述,其后的方法都需要额外的手动步骤。如果可以使用前面的方法,则应该遵循这些方法。使用 ssh-copy-id 复制您的公钥将公钥复制到现有服务器的最简单方法是使用一个名为 ssh-copy-id 的实用程序。由于其简单性,如果可用,建议使用此方法。ssh-copy-id 工具包含在许多发行版的 OpenSSH 软件包中,因此您的本地系统上可能已经有它。为使此方法工作,您必须当前具有基于密码的 SSH 访问权限到您的服务器。要使用此实用程序,您需要指定您想要连接到的远程主机和您具有基于密码的 SSH 访问权限的用户帐户。这是您的公共 SSH 密钥将被复制的帐户。语法是:12[本地环境]ssh-copy-id username@remote_host您可能会看到类似以下的消息:1234[本地环境]The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes这意味着您的本地计算机不认识远程主机。这将在您第一次连接到新主机时发生。输入 yes 并按 ENTER 继续。接下来,该实用程序将扫描您的本地帐户以查找我们之前创建的 id_rsa.pub 密钥。当它找到密钥时,它将提示您输入远程用户帐户的密码:1234[本地环境]/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysusername@203.0.113.1's password:输入密码(出于安全目的,您的输入不会显示)并按 ENTER。该实用程序将使用您提供的密码连接到远程主机上的帐户。然后,它将把您的 ~/.ssh/id_rsa.pub 密钥内容复制到远程帐户的主目录 ~/.ssh 中名为 authorized_keys 的文件中。您将看到以下输出:[本地环境]Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'username@203.0.113.1'"and check to make sure that only the key(s) you wanted were added.此时,您的 id_rsa.pub 密钥已上传到远程帐户。您可以继续下一节。使用 SSH 复制您的公钥如果您没有 ssh-copy-id,但是您具有基于密码的 SSH 访问权限到服务器上的某个帐户,您可以使用传统的 SSH 方法上传您的密钥。我们可以通过在本地计算机上输出我们的公共 SSH 密钥的内容,并通过 SSH 连接将其传输到远程服务器。在另一端,我们可以确保我们正在使用的帐户下存在 ~/.ssh 目录,然后将我们传输的内容输出到此目录中名为 authorized_keys 的文件中。我们将使用 >> 重定向符号来追加内容而不是覆盖它。这将允许我们添加密钥而不破坏先前添加的密钥。完整命令如下:12[本地环境]cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"您可能会看到类似以下的消息:[本地环境]The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes这意味着您的本地计算机不认识远程主机。这将在您第一次连接到新主机时发生。输入 yes 并按 ENTER 继续。之后,您将被提示输入您尝试连接的帐户的密码:[本地环境]username@203.0.113.1's password:输入密码后,您的 id_rsa.pub 密钥内容将被复制到远程用户帐户的 authorized_keys 文件的末尾。如果成功,继续下一节。手动复制公钥如果您的服务器没有基于密码的 SSH 访问权限,您将不得不手动执行上述过程。您的 id_rsa.pub 文件的内容将需要以某种方式添加到远程机器上的 ~/.ssh/authorized_keys 文件中。要显示 id_rsa.pub 密钥的内容,请在本地计算机上输入以下命令:12[本地环境]cat ~/.ssh/id_rsa.pub您将看到密钥的内容,可能类似于以下内容:12[本地环境]ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== username@hostname使用您可用的任何方法访问远程主机。这可能是您的基础设施提供商提供的基于 Web 的控制台。一旦您可以访问远程服务器上的帐户,您应该确保 ~/.ssh 目录已创建。如果需要,此命令将创建该目录,如果已存在则不执行任何操作:1mkdir -p ~/.ssh现在,您可以在该目录中创建或修改 authorized_keys 文件。您可以将 id_rsa.pub 文件的内容添加到 authorized_keys 文件的末尾,如果需要的话,可以使用以下命令创建它:1echo public_key_string >> ~/.ssh/authorized_keys在上述命令中,将 public_key_string 替换为您在本地系统上执行 cat ~/.ssh/id_rsa.pub 命令的输出。它应该以 ssh-rsa AAAA... 或类似的内容开头。如果这样操作成功,您可以继续测试您的新基于密钥的 SSH 认证。步骤 3 — 使用 SSH 密钥进行身份验证如果您已成功完成上述任一过程,您应该能够 无需 使用远程帐户的密码登录到远程主机。该过程基本上是相同的:12[本地环境]ssh username@remote_host如果这是您第一次连接到此主机(如果您使用了上述最后一种方法),您可能会看到类似以下内容:1234[本地环境]The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes这意味着您的本地计算机不认识远程主机。输入 yes 然后按 ENTER 继续。如果您没有为私钥提供密码,您将立即登录。如果您在创建密钥时为私钥提供了密码,您现在需要输入它。之后,将为您在远程系统上的帐户创建一个新的 shell 会话。如果成功,继续了解如何锁定服务器。步骤 4 — 在服务器上禁用密码身份验证如果你能够使用 SSH 无需密码登录到你的账户,那么你已经成功地为你的账户配置了基于 SSH 密钥的身份验证。然而,你的基于密码的身份验证机制仍然是激活状态,这意味着你的服务器仍然容易受到破姐攻击。在完成本节中的步骤之前,请确保你的服务器上要么已经为 root 账户配置了基于 SSH 密钥的身份验证,或者更好的是,你已经为服务器上具有 sudo 权限的账户配置了基于 SSH 密钥的身份验证。这一步将禁用基于密码的登录,因此确保你仍然能够获得管理员访问权限是至关重要的。一旦上述条件为真,请使用 SSH 密钥登录到远程服务器,可以是 root 用户,也可以是具有 sudo 权限的账户。打开 SSH 守护程序的配置文件:1sudo nano /etc/ssh/sshd_config在文件中,搜索一个名为 PasswordAuthentication 的指令。这可能是被注释掉的。通过删除行首的任何 # 号来取消注释,并将值设置为 no 来启用该选项,这将禁用使用账户密码通过 SSH 登录的功能:1PasswordAuthentication no完成后保存并关闭文件。要实际实施我们刚刚做的更改,你必须重新启动服务。在大多数 Linux 发行版上,你可以使用以下命令来执行:1sudo systemctl restart ssh完成这一步后,你已成功将你的 SSH 守护程序转换为只响应 SSH 密钥。
  • [技术干货] 深入解析:在Linux系统中实现硬盘的永久性挂载
    在Linux操作系统中,磁盘管理是一项至关重要的任务,尤其是当涉及到数据存储、备份和迁移时。临时挂载硬盘虽能满足短期需求,但为了确保系统重启后硬盘依然能够自动挂载并保持数据的持久访问,我们需要了解如何进行硬盘的永久性挂载。本文将详细阐述在Linux环境中实现硬盘永久挂载的步骤、相关概念以及最佳实践。一、理解Linux磁盘挂载在Linux中,文件系统被组织成一棵目录树结构,而每个磁盘或分区必须挂载到这棵目录树中的某个节点(称为挂载点)后,才能被用户和应用程序访问。临时挂载是指通过mount命令手动将磁盘或分区挂载到指定目录,这种挂载仅在当前会话有效,一旦系统重启,挂载关系就会丢失。与此相反,永久性挂载则是指通过配置文件/etc/fstab,使磁盘在系统启动时自动挂载到指定目录。这样,无论何时重启系统,硬盘都会按照预设规则自动挂载,无需用户干预,大大提升了数据访问的便捷性和系统的稳定性。二、实现硬盘永久挂载的步骤以下是实现Linux系统中硬盘永久挂载的详细步骤:1. 准备工作识别硬盘设备:使用lsblk命令列出系统中的块设备信息,确定待挂载的硬盘设备,如/dev/sdb。如果硬盘已分区,挂载的是具体分区,如/dev/sdb1。创建挂载点:使用mkdir命令在文件系统中创建用于挂载硬盘的目录,如/mnt/data。2. 格式化硬盘(如有必要)如果硬盘尚未格式化或需要更改文件系统,使用mkfs系列命令进行格式化。例如,使用EXT4文件系统格式化/dev/sdb1:sudo mkfs.ext4 /dev/sdb13. 临时挂载测试在正式配置永久挂载前,先通过mount命令临时挂载硬盘以验证其工作正常:sudo mount /dev/sdb1 /mnt/data现在,你可以访问/mnt/data目录,查看硬盘内容。无误后,执行umount /mnt/data卸载硬盘,准备进行永久挂载配置。4. 编辑/etc/fstab打开/etc/fstab文件(建议使用nano、vim等文本编辑器),在文件末尾添加新的一行,指定硬盘设备、挂载点、文件系统类型、挂载选项、dump备份标志和fsck检查顺序:/dev/sdb1 /mnt/data ext4 defaults 0 0各字段含义如下:/dev/sdb1:待挂载的硬盘设备或分区。/mnt/data:挂载点,即硬盘将挂载到的目录。ext4:文件系统类型,根据实际情况填写,如XFS、Btrfs等。defaults:挂载选项,包括rw(读写)、auto(自动挂载)、exec(允许执行)、suid(保留SUID位)等默认设置。可根据需要添加其他选项,如noatime、nodiratime优化性能。0:dump备份工具的检查级别,0表示不进行备份。0:fsck磁盘检查顺序,根分区为1,其余按需递增,0表示不进行检查。5. 测试fstab配置保存并关闭/etc/fstab后,使用mount -a命令重新加载所有fstab条目,检查新增的挂载配置是否正确:sudo mount -a `` 若无错误提示,说明配置成功。重启系统后,硬盘将自动挂载到指定目录。 **三、最佳实践与注意事项** - **使用UUID而非设备名**:设备名(如`/dev/sda1`)可能会因系统环境变化而改变,导致fstab配置失效。使用`blkid`命令获取硬盘UUID,并在fstab中使用UUID代替设备名,可确保挂载的稳定性。 - **合理设置挂载选项**:根据硬盘用途调整挂载选项,如对日志盘设置`noatime`以减少不必要的I/O操作,对数据库数据盘设置`data=ordered`确保数据一致性等。 - **定期备份fstab**:修改`/etc/fstab`前做好备份,防止误操作导致数据无法访问。同时,定期审查fstab配置,确保其与实际硬件、存储需求相符。 - **监控挂载状态**:借助`dmesg`、`journalctl`、`systemctl status`等命令或工具监控系统启动时的挂载过程,及时发现并解决挂载问题。
  • [技术干货] Linux系统编程-(pthread)线程创建与使用
    1. 前言前面文章介绍了Linux下进程的创建、管理、使用、通信,了解了多进程并发;这篇文章介绍Linux下线程的基本使用。线程与进程的区别 (1)进程: 是操作系统调度最小单位。 Linux下可以通过ps、top等命令查看进程的详细信息。 (2)线程: 是进程调度的最小单位,每个进程都有一个主线程。在进程里主要做事情就是线程。(3)在全系统中,进程ID是唯一标识,对于进程的管理都是通过PID来实现的。每创建一个进程,内核去中就会创建一个结构体来存储该进程的全部信息,每一个存储进程信息的节点也都保存着自己的PID。需要管理该进程时就通过这个ID来实现(比如发送信号)。当子进程结束要回收时(子进程调用exit()退出或代码执行完),需要通过wait()系统调用来进行,未回收的消亡进程会成为僵尸进程,其进程实体已经不复存在,但会虚占PID资源,因此回收是有必要的。对于线程而言,若要主动终止需要调用pthread_exit() ,主线程需要调用pthread_join()来回收(前提是该线程没有设置 “分离属性”)。像线发送线程信号也是通过线程ID实现进程间的通信方式: A.共享内存 B.消息队列 C.信号量 D.有名管道 E.无名管道 F.信号 G.文件 H.socket 线程间的通信方式: A.互斥量 B.自旋锁 C.条件变量 D.读写锁 E.线程信号 F.全局变量进程间采用的通信方式要么需要切换内核上下文,要么要与外设访问(有名管道,文件)。所以速度会比较慢。而线程采用自己特有的通信方式的话,基本都在自己的进程空间内完成,不存在切换,所以通信速度会较快。也就是说,进程间与线程间分别采用的通信方式,除了种类的区别外,还有速度上的区别。说明: 当运行多线程的进程捕获到信号时,只会阻塞主线程,其他子线程不会影响会继续执行。2. 线程相关函数介绍2.1 创建线程pthread_create是Unix操作系统(Unix、Linux等)的创建线程的函数。 编译时需要指定链接库:-lpthread 函数原型#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);参数介绍第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。默认可填NULL。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。不需要参数可填NULL。 Linux下查看函数帮助:# man pthread_create返回值: 若线程创建成功,则返回0。若线程创建失败,则返回出错编号。 线程创建成功后, attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向线程工作函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。示例:#include <stdio.h>#include <pthread.h>​//线程函数1void *pthread_func1(void *arg){ while(1) { printf("线程函数1正在运行.....\n"); sleep(2); }}​//线程函数2void *pthread_func2(void *arg){ while(1) { printf("线程函数2正在运行.....\n"); sleep(2); }}​int main(int argc,char **argv){ pthread_t thread_id1; pthread_t thread_id2; /*1. 创建线程1*/ if(pthread_create(&thread_id1,NULL,pthread_func1,NULL)) { printf("线程1创建失败!\n"); return -1; } /*2. 创建线程2*/ if(pthread_create(&thread_id2,NULL,pthread_func2,NULL)) { printf("线程2创建失败!\n"); return -1; } /*3. 等待线程结束,释放线程的资源*/ pthread_join(thread_id1,NULL); pthread_join(thread_id2,NULL); return 0;}​//gcc pthread_demo_code.c -lpthread2.2 退出线程线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针,该返回值可以通过pthread_join函数的第二个参数得到。函数原型#include <pthread.h>void pthread_exit(void *retval);参数解析 线程的需要返回的地址。 注意: 线程结束必须释放线程堆栈,就是说线程函数必须调用pthread_exit()结束,否则直到主进程函数退出才释放2.3 等待线程结束pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable(结合属性)属性。 函数原型#include <pthread.h>int pthread_join(pthread_t thread, void **retval);参数 第一个参数: 线程标识符,即线程ID,标识唯一线程。 最后一个参数: 用户定义的指针,用来存储被等待线程返回的地址。 返回值 0代表成功。 失败,返回的则是错误号。 接收线程返回值示例://退出线程pthread_exit ("线程已正常退出");//接收线程的返回值void *pth_join_ret1;pthread_join( thread1, &pth_join_ret1);2.4 线程分离属性创建一个线程默认的状态是joinable(结合属性),如果一个线程结束运行但没有调用pthread_join,则它的状态类似于进程中的Zombie Process(僵死进程),即还有一部分资源没有被回收(退出状态码),所以创建线程者应该pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于进程的wait,waitpid)。但是调用pthread_join(pthread_id)函数后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。pthread_detach函数可以将该线程的状态设置为detached(分离状态),则该线程运行结束后会自动释放所有资源。 函数原型#include <pthread.h>int pthread_detach(pthread_t thread);参数 线程标识符 返回值 0表示成功。错误返回错误码。 EINVAL线程并不是一个可接合线程。 ESRCH没有线程ID可以被发现。2.5 获取当前线程的标识符pthread_self函数功能是获得线程自身的ID。 函数原型#include <pthread.h>pthread_t pthread_self(void);返回值 当前线程的标识符。 pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。2.6 自动清理线程资源线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序。用于程序异常退出的时候做一些善后的资源清理。 在POSIX线程API中提供了一个pthread_cleanup_push()/pthread_cleanup_pop()函数用于自动释放资源。从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作(包括调用 pthread_exit()和异常终止)都将执行pthread_cleanup_push()所指定的清理函数。注意:pthread_cleanup_push函数与pthread_cleanup_pop函数需要成对调用。 函数原型void pthread_cleanup_push(void (*routine)(void *),void *arg); //注册清理函数void pthread_cleanup_pop(int execute); //释放清理函数参数 void (*routine)(void *) :处理程序的函数入口。 void *arg :传递给处理函数的形参。 int execute:执行的状态值。 0表示不调用清理函数。1表示调用清理函数。导致清理函数调用的条件:调用pthread_exit()函数pthread_cleanup_pop的形参为1。 注意:return不会导致清理函数调用。2.7 自动清理线程示例代码#include <stdio.h>#include <pthread.h>#include <stdlib.h>​//线程清理函数void routine_func(void *arg){ printf("线程资源清理成功\n");} //线程工作函数void *start_routine(void *dev){ pthread_cleanup_push(routine_func,NULL);​ //终止线程 // pthread_exit(NULL); pthread_cleanup_pop(1); //1会导致清理函数被调用。0不会调用。​}​int main(int argc,char *argv[]){ pthread_t thread_id; //存放线程的标识符 /*1. 创建线程*/ if(pthread_create(&thread_id,NULL,start_routine,NULL)!=0) { printf("线程创建失败!\n"); } /*2.设置线程的分离属性*/ if(pthread_detach(thread_id)!=0) { printf("分离属性设置失败!\n"); } while(1){} return 0; }2.8 线程取消函数pthread_cancel函数为线程取消函数,用来取消同一进程中的其他线程。头文件: #include <pthread.h>函数原型:pthread_cancel(pthread_t tid);
  • [问题求助] 买了服务器连接不上去为什么?有没有大佬知道的
    为什么会显示认证失败密码是正确的
  • [容器类] acl.rt.set_device报507033错误
    """[EVENT] PROFILING(78,python):2024-03-11-02:22:20.914.096 [msprof_callback_impl.cpp:199] >>> (tid:78) Started to register profiling ctrl callback.[EVENT] PROFILING(78,python):2024-03-11-02:22:25.859.341 [msprof_callback_impl.cpp:78] >>> (tid:78) MsprofCtrlCallback called, type: 255[EVENT] PROFILING(78,python):2024-03-11-02:22:25.859.666 [prof_acl_mgr.cpp:1190] >>> (tid:78) Init profiling for dynamic profiling[ERROR] DRV(78,python):2024-03-11-02:22:34.958.504 [ascend][curpid: 78, 78][drv][tsdrv][drvDeviceOpen 360]open devdrv_device(0) failed, fd(-1), errno(14), error(Bad address).[ERROR] DRV(78,python):2024-03-11-02:22:34.958.716 [ascend][curpid: 78, 78][drv][tsdrv][share_log_read 569]invalid para, vdevid(0), devid(0), fid(0) invalid mode(1) or ctx is null.[ERROR] RUNTIME(78,python):2024-03-11-02:22:34.958.800 [npu_driver.cc:2012]78 DeviceOpen:[drv api] drvDeviceOpen failed: deviceId=0, drvRetCode=4![ERROR] RUNTIME(78,python):2024-03-11-02:22:34.958.809 [device.cc:227]78 Init:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:34.958.814 [device.cc:227]78 Init:Failed to open device, retCode=0x7020014, deviceId=0.[ERROR] RUNTIME(78,python):2024-03-11-02:22:34.958.833 [runtime.cc:2109]78 DeviceRetain:Failed to init device.[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.725.754 [runtime.cc:2133]78 DeviceRetain:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.725.935 [runtime.cc:2133]78 DeviceRetain:Check param failed, dev can not be NULL![ERROR] RUNTIME(78,python):2024-03-11-02:22:35.725.988 [runtime.cc:1946]78 PrimaryContextRetain:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.725.992 [runtime.cc:1946]78 PrimaryContextRetain:Check param failed, dev can not be NULL![ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.001 [runtime.cc:1973]78 PrimaryContextRetain:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.005 [runtime.cc:1973]78 PrimaryContextRetain:Check param failed, ctx can not be NULL![ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.013 [api_impl.cc:1315]78 NewDevice:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.017 [api_impl.cc:1315]78 NewDevice:Check param failed, context can not be null.[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.025 [api_impl.cc:1336]78 SetDevice:report error module_type=0, module_name=EE9999[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.029 [api_impl.cc:1336]78 SetDevice:new device failed, retCode=0x7010006[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.037 [logger.cc:615]78 SetDevice:Set device failed, device_id=0, deviceMode=0.[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.067 [api_c.cc:1469]78 rtSetDevice:ErrCode=507033, desc=[device retain error], InnerCode=0x7010006[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.071 [error_message_manage.cc:49]78 FuncErrorReason:report error module_type=3, module_name=EE8888[ERROR] RUNTIME(78,python):2024-03-11-02:22:35.726.079 [error_message_manage.cc:49]78 FuncErrorReason:rtSetDevice execute failed, reason=[device retain error][ERROR] ASCENDCL(78,python):2024-03-11-02:22:35.726.091 [device.cpp:66]78 aclrtSetDevice: open device 0 failed, runtime result = 507033.[EVENT] IDEDH(78,python):2024-03-11-02:22:39.586.549 [adx_server_manager.cpp:27][tid:78]>>> start to deconstruct adx server manager"""
  • [课程学习] LINUX学习随笔
    操作系统概述:操作系统就是计算机的灵魂通过操作系统来进行各种调度LINUX系统组成:内核:提供最核心的IO功能,实现各种调度系统级应用程序:出场自带程序,可以完成简单的上手 LINUX基础命令1.LINUX系统的目录结构/根目录,LINUX中唯一一个顶级目录,所有文件都在根目录下面/bin:包含可执行的二进制文件,基本命令行工具/sbin:存放的是系统管理员使用的系统管理工具和命令/boot:存放启动所需要的文件/dev:包含系统所有的硬件设备文件/etc:存储常见应用程序和系统服务需要的重要配置文件/home:默认的用户工作目录,每一个用户在home下面都会有一个以文件名命名的用户/lib:多个程序和库所依赖的共享文件/opt:是用于安装第三方应用程序,组件和依赖库,同时是一些大型文件安装包的默认位置/tmp:是一个存放临时文件和目录的地方,需要时常清空来释放磁盘空间/usr:usr目录下面也是有很多常见的目录,但是usr和根目录比起来的命令不是必须的- `/usr/bin`: 存放系统管理员和用户使用的二进制可执行文件;- `/usr/sbin`: 存放系统管理员使用的二进制可执行文件,需要 root 权限才能访问;- `/usr/lib`: 存放共享库文件,即许多程序共用的代码库;- `/usr/share`: 存放应用程序的资源文件、文档等共用数据文件;- `/usr/local`: 存放本地安装的软件及其相关的资源文件、文档等共用数据文件;/var:用于存储变化的文件数据,比如日志文件,邮件,临时文件等 ls命令:-a:ALL,包括隐藏文件夹-l:以列表来展示-h:以易读的方式,一定和-l一起使用+路径cd命令:切换工作路径pwd命令:显示当前的工作目录相对路径:从根目录开始作为起点绝对路径:从当前的目录作为七点,直接去下面的目录特殊路径符:Cd ..:回退上一级Cd ~:直接回到home目录mkdir命令:创建文件夹-p :表示创建多级目录+路径:相对,绝对都可以文件操作命令:touch命令来创建文件cat命令查看文件内容more命令支持翻页查看内容cp复制文件文件夹-r 复制文件夹时候使用+被复制的文件/夹 +复制去的地方/夹mv移动文件文件夹+被移动的文件/夹 +移动去的地方/夹若目标不存在则有改名的效果rm删除文件文件夹一次可以删除任意个-r:删除文件夹-f:强制删除可以使用*来做模糊匹配Test*:匹配任何以test开头的*test:匹配任何以test结尾的*test*:匹配任何含有test的查找相关命令:which:查找命令的程序文件放在哪里find:查找指定文件(文件名,大小find 起始路径 -name "文件名"同时也可以使用通配符来查找find 起始路径 -size +/-具体的大小(K/M/G)(+就是大于,-就是小于grep命令:可以文件中通过关键字过滤文件行-n 表示显示匹配结果的行号+“关键字”表示过滤的关键字+文件路径 /作为内容的输入端接口(在使用管道符的时候管道符 |(通常结合grep来实现过滤将左边输入的结果作为右边输入的内容eg:cat text.txt | grep 关键词管道符同时可以实现嵌套使用wc命令:统计文件的行数,单词数量,字节数等等-c:字节数-m:字符数-l:行数-w:单词数+文件路径echo+”输出的内容“(在命令行输出指定的内容,类似于print反引号符:echo ·命令·=运行echo里面的命令重定向符>/>>(只要是可以产生结果的都可以往右边的文件写>:将左侧的文件覆盖写入右侧指定的文件中>>:将左侧的文件追加写入右侧的文件中Eg:echo "内容" >> test.txttail命令:查看文件尾部的内容和持续追踪文件的更改-number( 查看尾部的行数,默认表示10行-f 表示持续跟踪文件的状态+文件路径Vi/vim编辑器(vim是vi的plus版本/:进入搜索模式n:光标向下搜索shift+G:跳到文件最后一行gg:跳到文件首行 用户和权限如何从普通用户切换到root用户Su root:切换到root用户Exit :退出到普通用户sudo:临时获得root身份的授权来实现命令的配置Visudo打开文件之后在尾部添加用户名 ALL=(ALL)     NOPASSWD:ALL保存退出此时该用户有写权限来实现配置查看权限控制通过ls-l显示的内容里面第一个表示文件,文件夹的权限信息Drwxr-xr-x第一段第一个d表示是文件夹/-表示文件r,w,x,r表示的是读权限(读文件内容w表示的是写权限(修改文件内容x表示的是执行权限(执行文件内容第一段其余表示所属用户的权限第二段表示所属用户组的权限第三段表示的是其他用户的权限 第二个表示文件,文件夹的属于的用户第三列表示文件,文件夹属于的用户组chmod修改权限信息-R:对文件夹里面所有文件都是同样的操作权限文件或者文件夹(权限分为三类:用户,用户组,其他,每一位三个字符,所以可以使用三个数字来表示chown修改文件文件夹的所属用户和用户组-R:对全部文件相同+用户:用户组(只有前面的时候只修改用户,只有后面时候只修改用户组+文件/文件夹 使用操作技巧ctrl+c:强制停止程序的运行ctrl+r:搜索之前配置过的命令history:显示历史输入过的命令linux系统安装软件Yum命令:RPM包软件管理器,用于自动化安装linux软件,并且可以自动解决依赖问题RPM包就是linux的安装包格式,就和windows中的.exe一样Install:安装Remove:卸载search:搜索systemctl命令:通过systemctl命令来实现服务的启动,开机自启,关闭,查看状态(内置服务和部分第三方服务Firewalld:防火墙服务Networkmanager:主网络服务Network:副网络服务Sshd:ssh服务软链接:类似于linux的快捷方式Ln -s 被链接的文件  链接的目的地时间:Date :之间显示日期,可以添加下面的字符串来修改%Y:年份%y:年份后面两位%m:月份%d:日%H:小时%M:分钟%S:秒时间自动校准ntp服务,联网自动校准时间yum下载使用systemctl来启动手动校准时间Ntpdate -u ntp.aliyun.comIP地址Ens33:centos的网卡Ifconfig:查看IP地址修改主机名:Hostnamectl set-hostname +名字网络请求:ping检测指定网络服务器是否联通wget:下载网络文件-b:在后台下载+url地址Curl:发送http请求,可以用于下载,获取信息-o:下载文件的时候使用+url,要发起的网络请求端口:nmap:查看端口占用需要先通过yum来下载nmapNmap+IP地址netstat:查看指定端口的占用情况通过yum来下载net-toolsNetstat -anp | grep 端口号显示所有和22相关的端口的情况进程管理:程序运行就会有一个进程Ps 查看进程:ps -ef | grep +服务-e:显示全部的进程-f:显示详细的信息+管道符过滤看到想看的进程的信息关闭进程:Kill-9:强制关闭+进程ID(PID监控主机状态top查看cpu,内存的占用情况第二行:进程第三行:cpu占用第四行:物理内存第五行:虚拟内存-p:只显示某个进程的信息-u:查找特定用户的进程-i:不显示闲置的命令 磁盘信息监控df -h,更加人性化的显示信息环境变量:记录的关键性信息辅助系统执行是一种键值结构如何取得环境变量的值?echo $+环境变量名字自行配置环境变量:Export 变量名=变量值(在/etc/profile文件最后面添加即可 上传下载:建议直接用wincp压缩解压linux常见的压缩格式Tar,Gzip(.tar/.gztar格式的压缩效果一般gz格式文件压缩效果好Tar 命令来实现压缩和被压缩压缩-cvf:压缩常用.tar格式-zcvf:压缩,但是.gz格式+文件,可以添加n个解压缩-xvf:解压tar包-zxvf:解压gz包+文件名-C +目的路径:将文件指定到目的路径zip命令压缩-r:在包含文件夹的时候使用+文件解压Unzip :解压到当前文件夹-d +目的路径:将文件指定到目的路径   
  • [课程学习] 简单认识Linux
    今天带大家简单认识一下Linux,它和我们日常用的Windows有什么不同呢?Linux介绍Linux内核&发行版Linux内核版本内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。Linux内核版本又分为稳定版和开发版,两种版本是相互关联,相互循环:稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些bug或加入一些新的驱动程序。开发版:由于要试验各种解决方案,所以变化很快。内核源码网址:cid:link_0 所有来自全世界的对Linux源码的修改最终都会汇总到这个网站,由Linus领导的开源社区对其进行甄别和修改最终决定是否进入到Linux主线内核源码中。Linux发行版本Linux发行版 (也被叫做 GNU/Linux 发行版) 通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。linux和windows区别Linux是一种开源操作系统,可以根据需要更改源代码,而Windows操作系统没有访问源代码的权限,因为它是商业操作系统。由于其出色的安全性,Linux可以更轻松地检测并修复错误,而Windows的大量用户群易受到黑客攻击。Windows运行缓慢,特别是在旧硬件上运行,而Linux运行速度显著更快。在Windows操作系统中,打印机、CD-ROM和硬盘被视为设备。Linux外围设备,包括打印机、CD-ROM和硬盘被视为文件。Windows使用数据驱动器(C:D:E:)和文件夹来存储文件。Linux使用以根目录为开头的树形结构来组织文件。在Linux中,同一目录中可以有两个名称相同的文件。在Windows中,用户不能在同一文件夹中使用完全相同的名称拥有两个文件。在Microsoft Windows中,程序和系统文件几乎总是存储在C:驱动器中,而Linux上的程序和系统文件可以在不同的目录中找到。Linux目录结构/:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。/bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。/boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。/dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录,edu 表示用户 edu 的家目录。/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。/lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。/mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。/opt:给主机额外安装软件所摆放的目录。/proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。/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: 程序说明文件存放目录。/var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。Linux终端命令终端命令格式command [-options] [parameter]说明:command :命令名,相应功能的英文单词或单词的缩写[-options] :选项,可用来对命令进行控制,也可以省略parameter :传给命令的参数,可以是 零个、一个 或者 多个学习Linux终端命令的原因Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如磁盘操作、文件存取、目录操作、进程管理、文件权限 设定等在职场中,大量的 服务器维护工作 都是在 远程 通过 SSH 客户端 来完成的,并没有图形界面,所有的维护工作都需要通过命令来完成在职场中,作为后端程序员,必须要或多或少的掌握一些 Linux 常用的终端命令Linux 发行版本的命令大概有 200 多个,但是常用的命令只有 10 多个而已Shell●Linux系统中运行的一种特殊程序 ●在用户和内核之间充当“翻译官” ●用户登录Linux系统时,自动加载一个Shell程序 ●Bash是Linux系统中默认使用的Shell程序,Bash文件位于 /bin/bash 常用Linux命令的基本使用序号命令对应英文作用01lslist查看当前文件夹下的内容02pwdprint work directory查看当前所在文件夹03cd[目录名]changge directory切换文件夹04touch[文件名]touch如果文件不存在,新建文件05mkdir[目录名]make directory创建目录06rm[文件名]remove删除指定文件07clearclear清屏小技巧:ctrl + shift + = 放大终端窗口的字体显示ctrl + - 缩小终端窗口的字体显示自动补全在敲出 文件 / 目录 / 命令 的前几个字母之后,按下 tab 键如果输入的没有歧义,系统会自动补全如果还存在其他 文件 / 目录 / 命令 ,再按一下 tab 键,系统会提示可能存在的命令 小技巧按 上 / 下 光标键可以在曾经使用过的命令之间来回切换如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl + c具体命令的使用ls 常用选项参数含义-a显示指定目录下所有子目录与文件,包括隐藏文件-l以列表方式显示文件的详细信息-h配合 -l 以人性化的方式显示文件大小ls通配符的使用通配符含义*代表任意个数个字符?代表任意一个字符,至少 1 个[]表示可以匹配字符组中的任一一个[abc]匹配 a、b、c 中的任意一个[a-f]匹配从 a 到 f 范围内的的任意一个字符注意:以 . 开头的文件为隐藏文件,需要用 -a 参数才能显示切换目录cdcd 是英文单词 change directory 的简写,其功能为更改当前的工作目录,也是用户最常用的命令之一 注意:Linux 所有的 目录 和 文件名 都是大小写敏感的命令含义cd切换到当前用户的主目录(/home/用户目录)cd ~切换到当前用户的主目录(/home/用户目录)cd .保持在当前目录不变cd -可以在最近两次工作目录之间来回切换cd . .切换到上级目录相对路径和绝对路径相对路径 在输入路径时,最前面不是 / 或者 ~,表示相对 当前目录 所在的目录位置 绝对路径 在输入路径时,最前面是 / 或者 ~,表示从 根目录/家目录 开始的具体目录位置创建和删除操作touch创建文件或修改文件时间 如果文件 不存在,可以创建一个空白文件 如果文件 已经存在,可以修改文件的末次修改日期mkdir创建一个新的目录选项含义-p可以递归创建目录新建目录的名称 不能与当前目录中 已有的目录或文件 同名rm删除文件或目录 使用 rm 命令要小心,因为文件删除后不能恢复选项含义-f强制删除,忽略不存在的文件,无需提示-r递归地删除目录下的内容,删除文件夹 时必须加此参数查看文件内容序 号命令对应英文作用01cat 文件名concatenate查看文件内容、创建文件、文件合并、追加文件内容等功能02more 文件名more分屏显示文件内容03grep 搜索文本 文件名grep搜索文本文件内容catcat 命令可以用来 查看文件内容、创建文件、文件合并、追加文件内容 等功能 cat 会一次显示所有的内容,适合 查看内容较少 的文本文件选项含义-b对非空输出行编号-n对输出的所有行编号Linux 中还有一个 nl 的命令和 cat -b 的效果等价moremore 命令可以用于分屏显示文件内容,每次只显示一页内容适合于 查看内容较多的文本文件使用 more 的操作键:操作键功能空格键显示手册页的下一屏Enter键 一次滚动手册页的一行b回滚一屏f前滚一屏q退出/word搜索 word 字符串grepLinux 系统中 grep 命令是一种强大的文本搜索工具 grep 允许对文本文件进行 模式查找,所谓模式查找,又被称为正则表达式。选项含义-n显示匹配行及行号-v显示不包含匹配文本的所有行(相当于求反)-i忽略大小写常用的两种模式查找参数含义^a行首,搜寻以 a 开头的行ke$行尾,搜寻以 ke 结束的行拷贝和移动文件序号命令对应英文作用01tree [目录名]tree以树状图列出文件目录结构02cp 源文件目标文件copy复制文件或者目录03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名treetree 命令可以以树状图列出文件目录结构选项含义-d只显示目录cpcp 命令的功能是将给出的 文件 或 目录 复制到另一个 文件 或 目录 中,相当DOS 下的 copy命令选 项含义-i覆盖文件前提示-r若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必须为一个目录名mvmv 命令可以用来 移动 文件 或 目录,也可以给 文件或目录重命名选项含义-i覆盖文件前提示查找文件find 命令功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件序号命令作用01find [路径] -name “*.py”查找指定路径下扩展名是 .py 的文件,包括子目录如果省略路径,表示在当前文件夹下查找之前学习的通配符,在使用 find 命令时同时可用通配符表示一个任意字符——?表示0个或多个任意字符——*演练目标1.搜索桌面目录下,文件名包含 1 的文件find -name "*1*" 12.搜索桌面目录下,所有以 .txt 为扩展名的文件find -name "*.txt" 13.搜索桌面目录下,以数字 1 开头的文件find -name "1*" 1软链接序 号命令作用1ln -s 被链接的源文件 链接文件建立文件的软链接,用通俗的方式讲类似于 Windows 下的快捷方式注意:没有 -s 选项建立的是一个 硬链接文件两个文件占用相同大小的硬盘空间,工作中几乎不会建立文件的硬链接源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用未完待续……
  • [课程学习] apache学习随笔
    使用apache服务来部署静态网站Apache特点:跨平台,安全性nginx特点:轻量级,高并发 apache的服务名称叫做httpd通过systemctl来实现对http的各种操作httpd服务各个配置文件存放的位置我们可以修改httpd.conf文件下面来实现对访问路径的修改/文件但是在修改之后我们发现界面为这里就是SElinux在起作用了,下面讲讲selinux SElinux安全子系统Security-enhanced LINUX:对资源的访问提供限制的保险,打个比方:防火墙是窗户,那么SELinux就是防护栏服务模式 作用enforcing强制启动安全模式,将拦截的服务不合法请求permissive对于不合法请求只发出警告不会强制拦截disabled对于越权的行为不警告也不拦截如何查看安全模式?/etc/selinux/config里面,修改后重启生效 回归上文,为什么会出现禁止访问呢?因为/home目录是存放用户数据的目录而不是httpd服务的目录,所以SELINUX会禁止访问这个目录下面的文件解决这个问题有几个方法1:关闭Selinux2:修改http.conf,然后将文件复制到原来的路径下面(笨蛋方法3:通过semanage命令来实现添加对访问权限的添加一般来说bash下面不一定有semanage这条命令,需要我们下载安装包yum  install policycoreutils-python之后可以使用semanage命令了semanage fcontext -a -t httpd_sys_content /home/wwwtestsemanage fcontext -a -t httpd_sys_content /home/wwwtest/*向网站数据下面加一条SELINUX上下文,使得目录和里面的数据可以被httpd服务访问到restorecon -Rv /home/wwwtest/对目录进行递归,最后可以访问得到页面内容4:还有可能是selinux域安全策略密钥放行,这里通过getsebool和查找来找到相关服务getsebool -a | grep httpd我们将安全策略修改就可以实现(这里设置的为个人博客,当然做不同的东西可能会碰到不同得到东西就是了,原理相同setsebool httpd_enable_homedirs=on 
  • [专题汇总] 快进来宝子们,二月份干货汇总来了。
     大家好,二月的合集又来了,本次涵盖了java,linux,spirng诸多内容供大家学习。 1.Vue中的$nextTick有什么作用?【转】 https://bbs.huaweicloud.com/forum/thread-02109144317537776031-1-1.html  2.基于Python的地图绘制教程【转】 https://bbs.huaweicloud.com/forum/thread-0240144319944756030-1-1.html  3.hcache 介绍(1)--Ehcache 功能特性 【转】 https://bbs.huaweicloud.com/forum/thread-0268144320319800023-1-1.html  4.Java 操作 XML(1)--DOM 方式处理 XML【转】 https://bbs.huaweicloud.com/forum/thread-02109144320463478034-1-1.html  5.Java操作XML(3)--StAX方式处理XML 【转】 https://bbs.huaweicloud.com/forum/thread-0240144320615655031-1-1.html  6.Java操作XML(4)--使用woodstox处理XML【转】 https://bbs.huaweicloud.com/forum/thread-0270144320690142025-1-1.html  7.Java操作XML(5)--使用JDOM处理XML【转】 https://bbs.huaweicloud.com/forum/thread-0240144320817429032-1-1.html  8.Java操作XML(6)--使用dom4j处理XML【转】 https://bbs.huaweicloud.com/forum/thread-02101144320893290020-1-1.html  9.基于原生Go语言开发一个博客系统【转】 https://bbs.huaweicloud.com/forum/thread-0269144558086016006-1-1.html  10.详解Golang如何使用Debug库优化代码【转】 https://bbs.huaweicloud.com/forum/thread-0225144558556243005-1-1.html  11.Python3中的指针你了解吗【转】 https://bbs.huaweicloud.com/forum/thread-0274144558593208011-1-1.html  12.Python绘图实现坐标轴共享与复用详解【转】 https://bbs.huaweicloud.com/forum/thread-02104144558721772010-1-1.html  13.使用Golang开发一个简易版shell【转】 https://bbs.huaweicloud.com/forum/thread-0226144559187797004-1-1.html  14.python导入其它py文件的实现步骤【转】 https://bbs.huaweicloud.com/forum/thread-0284144559442791006-1-1.html  15.Python property函数的具体使用【转】 https://bbs.huaweicloud.com/forum/thread-0259144559705810008-1-1.html  16.正则表达式的神奇世界之表达、匹配和提取全解析【转】 https://bbs.huaweicloud.com/forum/thread-02104144569438876012-1-1.html  17.正则去除中括号(符号)及里面包含的内容(最新推荐)【转】 https://bbs.huaweicloud.com/forum/thread-0226144569604407008-1-1.html  18.Javaweb项目启动Tomcat常见的报错解决方案【转】 https://bbs.huaweicloud.com/forum/thread-0274144571948983013-1-1.html  19.SpringBoot+Vue前后端分离实现审核功能的示例【转】 https://bbs.huaweicloud.com/forum/thread-0269144572025869007-1-1.html  20.Java中Collections.sort()排序方法举例详解【转】 https://bbs.huaweicloud.com/forum/thread-0269144572170830008-1-1.html  21.Java中回调函数 (callback) 及其实际应用场景【转】 https://bbs.huaweicloud.com/forum/thread-0259144572260172012-1-1.html  22.Redis实现商品秒杀的示例代码【转】 https://bbs.huaweicloud.com/forum/thread-0274144574350854015-1-1.html 
  • [技术干货] Linux socket函数详解【转】
    什么是协议在网络编程中,协议是指计算机系统之间进行通信和交互所遵循的规则和约定。它定义了数据的格式、传输方式、错误处理、认证和授权等方面的规范,以确保不同计算机之间能够正确地交换信息。协议分为多个层次,每个层次负责不同的功能。常见的协议包括物理层协议、数据链路层协议、网络层协议、传输层协议和应用层协议等。这些协议共同构成了网络通信的基础,使得不同类型的计算机和设备能够互相通信。在网络编程中,使用协议可以确保数据的可靠传输、安全性和互操作性。开发者需要根据具体需求选择合适的协议,并按照协议规范进行编码和解码,以实现网络通信功能。常见的网络协议包括TCP/IP协议、HTTP协议、FTP协议、SMTP协议等。总之,协议在网络编程中起着举足轻重的作用,它定义了通信双方的行为规范,确保了网络通信的顺利进行。scoket函数在Linux系统中,使用socket函数进行网络编程时,需要包含 <sys/socket.h> 头文件,并使用以下格式进行函数声明:#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);这里的 socket 函数用于创建一个套接字(socket),返回一个整数值作为套接字的文件描述符。参数含义如下:domain:套接字的地址族,可以是 AF_INET(IPv4),AF_INET6(IPv6)等。type:套接字的类型,可以是 SOCK_STREAM(面向连接的可靠字节流,如TCP),SOCK_DGRAM(无连接的不可靠数据报,如UDP)等。protocol:协议类型,通常为0表示选择默认协议。在IPv4网络协议家族中,数据传输方式为SOCK_STREAM的协议只有IPPROTO_TCP,数据传输方式为SOCK_DGRAM的协议只有IPPROTO_UDP。函数调用成功时,返回套接字的文件描述符,即一个非负整数,表示成功创建了一个套接字。如果出现错误,返回值为-1,并设置相应的错误码,例如通过 errno 变量进行获取。在函数声明之后,可以使用返回的文件描述符进行各种网络通信操作,如连接到远程主机、发送和接收数据等。需要注意的是,socket函数的具体用法和参数可能会因不同的操作系统和编译环境而有所差异。TCP和UDPTCP和UDP是两种常用的网络传输协议,它们在传输数据时有以下区别:1.连接性:TCP是面向连接的协议,而UDP是面向无连接的协议。对于TCP来说,通信双方需要先建立连接,然后才能进行数据传输;而UDP则不需要建立连接,可以直接发送数据。2.可靠性:TCP提供可靠的数据传输,它使用确认机制和重传机制,确保数据的完整性和按序传输。如果数据丢失或损坏,TCP会重新发送丢失的数据;而UDP不提供可靠性保证,它不进行数据确认和重传,可能会导致数据丢失或乱序。3.效率:由于TCP保证数据的可靠性,所以在传输过程中会引入一定的额外开销,例如确认和重传的处理。相比之下,UDP的开销较小,传输效率更高。4.应用场景:由于TCP具有可靠性的特点,适合用于需要保证数据完整性和顺序的应用,如文件传输、网页浏览、电子邮件等。而UDP适用于实时性要求较高的应用,如音视频传输、在线游戏等,它们对数据的实时性要求比数据的完整性更重要。