2024-08-12

在Linux中,文件和目录的权限可以通过ls -l命令查看。权限分为三组:所有者权限、组权限和其他用户权限。每组权限又分为读(r)、写(w)和执行(x)。

权限可以用数字表示:读是4,写是2,执行是1。所有者权限是所有权数值的总和,组权限是组权限数值的总和,其他用户权限是其他用户权限数值的总和。

例如,如果所有者有读写权限,组有读权限,其他用户没有权限,可以用数字表示为:所有者权限是4+2=6,组权限是4,其他用户权限是0。

更改文件或目录的权限,可以使用chmod命令。

例如,给所有者添加执行权限:




chmod u+x 文件名或目录名

移除组的写权限:




chmod g-w 文件名或目录名

设置其他用户的权限为读和执行:




chmod o+rx 文件名或目录名

也可以用数字表示权限:




chmod 755 文件名或目录名

这里的755表示所有者权限是4+2+1=7,组权限是4+1=5,其他用户权限是4+1=5。

更改文件或目录的所有者,可以使用chown命令。

例如,将文件的所有者更改为用户名为newuser的用户:




sudo chown newuser 文件名或目录名

将文件的所有者和组更改为newusernewgroup




sudo chown newuser:newgroup 文件名或目录名

更改文件或目录的组,可以使用chgrp命令。

例如,将文件的组更改为名为newgroup的组:




sudo chgrp newgroup 文件名或目录名

这些是在Linux中管理文件和目录权限的基本命令。

2024-08-12

在CentOS 8上搭建Socks5代理服务器,可以使用dante-server。以下是安装和配置的步骤:

  1. 安装dante-server



sudo dnf install dante-server
  1. 编辑配置文件 /etc/danted.conf,配置Socks5代理:



logoutput: stderr
user.privileged: root
user.unprivileged: nobody
 
# 设置监听地址和端口
listener:
 0.0.0.0:1080
 
# 允许的客户端范围
client:
  # 允许所有地址
  pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
  }
 
# 代理规则
socks5:
  # 允许所有地址通过Socks5
  pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
  }
 
# 认证方式
auth:
  # 无认证
  none {
    from: 0.0.0.0/0 to: 0.0.0.0/0
  }
  1. 启动dante-server



sudo systemctl start danted
  1. 设置dante-server开机自启:



sudo systemctl enable danted

现在你的Socks5代理服务器已经运行在CentOS 8上,监听1080端口。你可以使用任何支持Socks5代理的应用程序来配置这个服务器。

2024-08-12

在Linux上搭建FTP服务,我们可以选择使用vsftpd,这是一个非常安全和快速的FTP服务器。以下是从安装到配置的基本步骤:

  1. 安装vsftpd:



sudo apt-update
sudo apt-get install vsftpd
  1. 备份原始配置文件:



sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
  1. 编辑配置文件:



sudo nano /etc/vsftpd.conf
  1. 确保以下配置(可根据需求修改):



anonymous_enable=NO  # 禁用匿名用户
local_enable=YES     # 允许本地用户登录
write_enable=YES     # 允许修改权限
local_umask=022      # 设置上传文件的默认权限掩码
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftp_data_port=20  # 如果使用主动模式连接,则需要这个设置
  1. 重启vsftpd服务以应用更改:



sudo systemctl restart vsftpd
  1. 创建一个FTP用户(如果你不想使用系统现有的用户):



sudo adduser ftpuser
  1. 设置FTP用户的密码:



sudo passwd ftpuser
  1. 你可能还想创建一个专门用于FTP的目录,并为该用户设置权限:



sudo mkdir /home/ftpuser/ftp
sudo chown nobody:nogroup /home/ftpuser/ftp
sudo chmod a-w /home/ftpuser/ftp
sudo mkdir /home/ftpuser/ftp/files
sudo chown ftpuser:ftpuser /home/ftpuser/ftp/files
sudo chmod 770 /home/ftpuser/ftp/files
  1. 配置vsftpd.conf以使用创建的目录:



user_sub_token=$USER
local_root=/home/$USER/ftp
  1. 确认FTP用户可以通过FTP连接到服务器:



ftp your_server_ip

请注意,这只是一个基本的FTP服务器设置,你可能需要根据自己的安全需求进行更多的配置。例如,你可以设置用户的最大上传/下载速度、用户可以访问的目录、用户数量限制等。

2024-08-12



#!/bin/sh
 
# 定义用户名和密码变量
username="newuser"
password="newpassword"
 
# 添加用户
useradd $username
 
# 设置用户密码
echo "$username:$password" | chpasswd
 
# 设置用户权限
usermod -aG sudo $username
 
# 打印结果
echo "用户 $username 已创建并添加到 sudo 组。"

这段代码首先定义了用户名和密码变量,然后使用useradd命令添加新用户,chpasswd命令设置用户密码,usermod命令将用户添加到sudo组,以便用户可以使用sudo执行命令。最后,打印出用户创建和权限设置的结果。

2024-08-12

在Linux上安装pip通常只需几个步骤。以下是一个简单的指南,适用于大多数基于Debian的系统(如Ubuntu)和基于Red Hat的系统(如Fedora和CentOS)。

对于基于Debian的系统:




sudo apt-get update
sudo apt-get install python3-pip

对于基于Red Hat的系统:




sudo yum update
sudo yum install python3-pip

如果你使用的是旧版本的Fedora或CentOS,可能需要使用yum替换为dnf

安装完成后,你可以通过运行以下命令来验证pip是否成功安装:




pip3 --version

或者对于旧版本的Python 2.x系统:




pip --version

这些命令会显示已安装的pip版本,从而证明安装成功。

2024-08-12

在Linux中,您可以使用hostnamectl命令或者编辑/etc/hostname文件来修改系统的主机名。

使用hostnamectl命令:




sudo hostnamectl set-hostname 新主机名

编辑/etc/hostname文件:

  1. 使用文本编辑器打开/etc/hostname文件,例如使用nano



sudo nano /etc/hostname
  1. 将文件中的内容替换为您想要的新主机名。
  2. 保存并关闭文件。

重启网络服务:

在更改主机名后,您可能需要重启网络服务来确保所有的服务都使用新的主机名:




sudo systemctl restart network-manager.service

或者重启整个系统来完成更改。

请注意,主机名应该是唯一的,并且不应该与网络中的其他设备冲突。此外,主机名应该只包含字母、数字和短横线(不包含空格、下划线或其他特殊字符)。

2024-08-12

在Linux系统中,僵尸进程和孤儿进程是两个相关但不同的概念:

  1. 孤儿进程(Orphan Process):一个父进程退出,而它的一个或多个子进程还在运行,这些子进程就会成为孤儿进程。孤儿进程将被init进程(进程ID通常为1)收养,并由init进程负责清理这些进程。
  2. 僵尸进程(Zombie Process):一个子进程已经退出,但是它的父进程还没有调用wait()或waitpid()来为它收尸(获取它的退出状态),这样子进程的进程描述符仍然保留在系统中,这个子进程就是僵尸进程。

在编写代码处理这两个问题时,可以使用以下方法:

  1. 避免产生孤儿进程:父进程在创建子进程之前先fork()一个子进程,然后立即exit(),这样子进程就不会成为孤儿进程,因为init进程会接管这些子进程。
  2. 避免产生僵尸进程:父进程可以使用wait()或waitpid()系统调用来等待子进程结束,这样子进程就不会变成僵尸进程。

示例代码:




#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
 
int main() {
    pid_t pid = fork();
 
    if (pid < 0) {
        // 错误处理
        perror("fork failed");
        exit(EXIT_FAILURE);
    } else if (pid > 0) {
        // 父进程
        wait(NULL); // 等待子进程结束,避免产生僵尸进程
        printf("父进程结束\n");
    } else {
        // 子进程
        printf("子进程ID: %d, 父进程ID: %d\n", getpid(), getppid());
        sleep(10); // 睡眠10秒,确保父进程先退出
        exit(EXIT_SUCCESS); // 子进程结束
    }
 
    return 0;
}

在这个例子中,父进程通过调用wait()系统调用来等待子进程结束,这样子进程在退出时不会变成僵尸进程。如果父进程不调用wait()或waitpid(),孤儿进程在其终止时会被init进程(进程ID为1)收养,并由init进程清理。

2024-08-12

在Linux中增加SWAP空间可以通过以下步骤完成:

  1. 创建一个SWAP文件或者分区。
  2. 将新的SWAP空间添加到现有的SWAP空间中。

以下是一个示例,演示如何创建一个新的SWAP文件并将其添加到现有的SWAP空间中:




# 使用dd命令创建一个新的SWAP文件,例如创建一个为1G大小的文件
dd if=/dev/zero of=/swapfile bs=1G count=1
 
# 使用mkswap命令设置新的SWAP文件
sudo mkswap /swapfile
 
# 启用新的SWAP文件
sudo swapon /swapfile
 
# 确保在重启后也启用该SWAP文件,编辑/etc/fstab文件
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

这些命令会创建一个1GB大小的SWAP文件,设置它为SWAP格式,启用它,并确保在系统重启后自动启用。

请注意,SWAP空间大小应该根据您的具体需求来设置,并且添加过多的SWAP空间可能会影响性能。此外,添加SWAP空间前请确保系统有足够的空间。

2024-08-12



#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
 
static int of_example_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    const char *string;
    int ret, len;
    u32 value;
 
    // 获取并打印 "example,string-property" 字符串属性
    ret = of_property_read_string(np, "example,string-property", &string);
    if (ret) {
        dev_err(&pdev->dev, "Could not read string property\n");
        return ret;
    }
    dev_info(&pdev->dev, "String property: %s\n", string);
 
    // 获取并打印 "example,int-property" 整数属性
    ret = of_property_read_u32(np, "example,int-property", &value);
    if (ret) {
        dev_err(&pdev->dev, "Could not read int property\n");
        return ret;
    }
    dev_info(&pdev->dev, "Integer property: %d\n", value);
 
    // 获取并打印 "example,array-property" 数组属性
    ret = of_property_read_u32_array(np, "example,array-property", &value, 1);
    if (ret < 0) {
        dev_err(&pdev->dev, "Could not read array property\n");
        return ret;
    }
    dev_info(&pdev->dev, "Array property: %d\n", value);
 
    return 0;
}
 
static const struct of_device_id of_example_match[] = {
    { .compatible = "example,device" },
    {},
};
MODULE_DEVICE_TABLE(of, of_example_match);
 
static struct platform_driver of_example_driver = {
    .probe = of_example_probe,
    .driver = {
        .name = "of_example",
        .of_match_table = of_example_match,
    },
};
module_platform_driver(of_example_driver);

这段代码展示了如何在Linux内核驱动中使用设备树属性。它首先通过of_property_read_string获取字符串属性,然后通过of_property_read_u32获取整数属性,并且使用of_property_read_u32_array获取数组属性。这些属性的名称和类型都是根据设备树中定义的来获取的。这个例子是基于平台总线,但是这些API同样适用于其他总线(如I2C, SPI等)。

2024-08-12

在Linux中,如果你想要杀死占用某个端口的进程,你可以按照以下步骤操作:

  1. 找出占用端口的进程ID(PID)。
  2. 使用kill命令终止该进程。

下面是具体的命令操作:




# 找出占用端口的进程ID
sudo lsof -i :端口号
 
# 使用kill命令杀死进程
sudo kill -9 PID

替换端口号为你想要关闭的端口号,PID为上一步骤找到的占用端口的进程ID。

例如,如果你想要关闭占用端口8080的进程,你可以这样做:




# 找出占用端口8080的进程ID
sudo lsof -i :8080
 
# 假设PID为1234,杀死该进程
sudo kill -9 1234

-9选项用于发送SIGKILL信号,强制终止进程。请谨慎使用,因为这可能会导致数据丢失或者其他问题。