2024-08-09

在Linux中,我们经常需要处理文件和文件内容。以下是一些常用的命令来查看和处理文件内容:

  1. cat:显示文件内容



cat filename
  1. lessmore:分页显示文件内容



less filename



more filename
  1. headtail:查看文件开头或结尾的内容



head -n 5 filename  # 显示文件开头5行



tail -n 5 filename  # 显示文件结尾5行
  1. grep:搜索文件中的内容



grep "search_term" filename
  1. wc:统计文件的行数、单词数和字符数



wc -l filename  # 统计行数



wc -w filename  # 统计单词数



wc -c filename  # 统计字符数
  1. sortuniq:排序和去重文件中的行



sort filename | uniq  # 排序并去重
  1. diff:比较两个文件的差异



diff file1 file2
  1. cut:按列切割文件内容



cut -d',' -f1 filename  # 以逗号分隔,取第一列
  1. tr:转换或删除字符



tr '[a-z]' '[A-Z]' < filename  # 大小写转换
  1. tee:将输出写入文件和屏幕



echo "Hello World" | tee filename

这些命令是处理文件和文本内容的基础工具,每个命令都有其特定的选项和用法,可以根据需要进行深入学习和使用。

2024-08-09



# 安装mosquitto
sudo apt-update
sudo apt-get install -y mosquitto
 
# 编辑mosquitto配置文件以允许匿名访问和非本地连接
sudo nano /etc/mosquitto/mosquitto.conf
# 确保以下行是这样的,去掉注释并修改为yes
# allow_anonymous true
# password_file /etc/mosquitto/passwd
# allow_anonymous true
 
# 重启mosquitto服务
sudo systemctl restart mosquitto
 
# 设置防火墙允许MQTT端口(默认1883)
sudo ufw allow 1883/tcp
sudo ufw enable
sudo ufw status
 
# 内网穿透部分,使用cpolar建立的内网穿透
# 下载并安装cpolar客户端
curl -L https://www.cpolar.com/static/downloads/cpolar-stable-linux-amd64.zip -o cpolar.zip
unzip cpolar.zip
sudo ./cpolar-stable-linux-amd64/cpolar install
 
# 登录cpolar账号
./cpolar-stable-linux-amd64/cpolar login
 
# 创建隧道,映射到MQTT端口
./cpolar-stable-linux-amd64/cpolar tcp 1883
 
# 查看隧道信息,获取公网地址
./cpolar-stable-linux-amd64/cpolar status
 
# 使用MQTT客户端测试远程连接,例如使用Mosquitto_sub和Mosquitto_pub
# 替换下面命令中的 <公网地址> 为cpolar提供的公网地址
# 订阅消息
mosquitto_sub -h "<公网地址>" -t "test_topic" -p 2883
 
# 发布消息
mosquitto_pub -h "<公网地址>" -t "test_topic" -m "Hello, Mosquitto" -p 2883

在这个例子中,我们首先通过apt安装mosquitto,然后修改mosquitto的配置文件以允许匿名访问,并启动mosquitto服务。之后,我们设置了防火墙以允许MQTT端口的流量。最后,我们使用cpolar建立内网穿透,从而能够远程接入我们的MQTT服务器。

2024-08-09

在Linux中,TCP套接字编程通常涉及以下步骤:

  1. 创建套接字(socket)。
  2. 绑定套接字到一个特定的地址和端口(bind)。
  3. 监听连接请求(listen)。
  4. 接受连接(accept)。
  5. 发送/接收数据(send/recv)。
  6. 关闭套接字(close)。

以下是一个简单的TCP服务器和客户端示例代码:

TCP 服务器端示例代码:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    const char *greeting = "Hello from server";
 
    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
 
    // 绑定套接字到地址和端口
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);
 
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
 
    // 监听连接请求
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
 
    // 接受连接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
 
    // 发送数据
    send(new_socket, greeting, strlen(greeting), 0);
  
    // 接收数据
    if (recv(new_socket, buffer, 1024, 0) == 0) {
        printf("Client disconnected\n");
    } else {
        printf("Received message: %s\n", buffer);
    }
 
    // 关闭套接字
    close(new_socket);
    close(server_fd);
    return 0;
}

TCP 客户端示例代码:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
int main(int argc, char *argv[]) {
    int sock;
    struct sockaddr_in serv_addr;
    char buffer[1024] = {0};
 
    if (argc < 2) {
        printf("Please provide the server ip address as first argument\n");
        return 1;
    }
 
    // 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation error");
        return 1;
    }
 
    memset(&serv_addr, '0', sizeof(serv_addr));
 
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);
 
    if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {
        per
2024-08-09

要实现无需公网IP使用SSH远程连接Linux CentOS服务器,可以使用内网穿透工具,如frpngrokzerotier等。以下以frp为例进行说明。

  1. 下载并配置frp:

    • frp官网下载对应系统的frp二进制包。
    • 在服务器上解压并编辑frp_0.xx.0_linux_amd64/frps.ini,启用SSH服务端。



[common]
bind_port = 7000
 
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
  1. 启动frp服务端:



./frps -c frps.ini
  1. 在客户端机器上,下载并编辑frp客户端配置文件frpc.ini



[common]
server_addr = <your-server-ip>
server_port = 7000
 
[ssh]
type = tcp
remote_port = 6000
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
  1. 在客户端机器上启动frp客户端:



./frpc -c frpc.ini
  1. 现在,你可以通过SSH连接到服务器,但是连接目标地址是你的客户端机器,端口是6000



ssh -p 6000 user@<your-client-ip>

确保你的服务器和客户端机器之间的网络连接是正常的,并且在客户端机器上运行frp客户端。

注意:此方案需要你拥有服务器的控制权限,并且需要在服务器和客户端机器上安装frp。此外,使用内网穿透工具会带来安全风险,应确保你的网络环境安全。

2024-08-09

解释:

这个错误表明在Linux系统中,尝试重启NetworkManager服务时失败了,因为系统中没有找到对应的服务单元文件。NetworkManager是一个管理网络设置的守护进程,它可能没有安装在你的系统上,或者服务单元文件损坏或被移动。

解决方法:

  1. 检查NetworkManager是否安装:

    执行nmcli命令看是否能正常工作,如果不能,可能没安装。如果已安装,继续以下步骤。

  2. 安装NetworkManager:

    如果确定系统中没有安装NetworkManager,可以使用包管理器安装它。例如,在基于Debian的系统上,可以使用sudo apt-get install network-manager

  3. 检查服务单元文件:

    确认NetworkManager.service文件是否存在于/etc/systemd/system//usr/lib/systemd/system/目录中。如果文件丢失,可能需要重新安装NetworkManager。

  4. 重新启动服务:

    如果服务单元文件存在,尝试重新加载systemd守护进程配置,然后再次尝试重启服务:

    
    
    
    sudo systemctl daemon-reload
    sudo systemctl restart NetworkManager.service
  5. 检查系统更新:

    有时候,系统的软件包可能没有更新到最新,导致服务单元文件不一致。运行系统更新可能会解决这个问题:

    
    
    
    sudo apt-get update
    sudo apt-get upgrade
  6. 查看日志:

    如果问题仍然存在,查看systemd日志可能会提供更多线索:

    
    
    
    sudo journalctl -u NetworkManager.service

如果以上步骤都不能解决问题,可能需要进一步检查系统配置或寻求专业帮助。

2024-08-09

在Linux中,环境变量是一组由环境变量名和对应值组成的字符串,它们定义了shell或者程序运行时的信息,如路径、用户身份等。在程序地址空间中,环境变量通常被用来配置程序运行的环境。

在C语言中,可以通过getenv函数获取环境变量的值,通过setenv函数设置或修改环境变量。




#include <stdlib.h>
 
int main() {
    // 获取环境变量HOME的值
    char* home = getenv("HOME");
    if (home) {
        printf("HOME: %s\n", home);
    }
 
    // 设置环境变量TEST的值为123
    int ret = setenv("TEST", "123", 1);
    if (ret == 0) {
        printf("TEST set to 123\n");
    }
 
    return 0;
}

在程序地址空间中,除了环境变量,还有代码段、数据段、堆、栈等区域。

代码段:存放程序的可执行代码。

数据段:存放程序的全局变量、常量数据等。

堆:动态分配内存,如使用malloc函数申请的内存。

栈:存放局部变量、函数调用信息等,函数调用结束后,其栈空间可被再利用。




int globalVar = 100; // 全局变量,位于数据段
 
void stackFunc() {
    int stackVar = 200; // 局部变量,位于栈
}
 
void heapFunc() {
    int* heapVar = malloc(sizeof(int)); // 动态分配内存,位于堆
}
 
int main() {
    int codeVar = 300; // 局部变量,位于栈
    stackFunc();
    heapFunc();
    return 0;
}

以上代码演示了局部变量、全局变量、动态内存分配和代码段在程序地址空间中的位置。

2024-08-09

要删除在Linux系统上占用特定端口的进程,你可以使用以下步骤:

  1. 使用netstatlsof命令找出占用端口的进程ID(PID)。
  2. 使用kill命令通过PID杀死相应的进程。

下面是具体的命令示例:




# 找出占用端口的进程ID(以8080端口为例)
netstat -tulnp | grep :8080
 
# 或者使用lsof命令
lsof -i :8080
 
# 杀死占用端口的进程(以得到的PID为例,如1234)
kill 1234
 
# 如果进程不结束,可以尝试更强制的方式
kill -9 1234

请确保你有权限杀死这些进程,并且要小心使用kill -9,因为这会立即停止进程,可能导致数据丢失或者其他问题。

2024-08-09



#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
 
int main() {
    pid_t pid;
 
    // 创建一个子进程
    pid = fork();
 
    if (pid < 0) {
        // 如果fork()调用失败
        perror("fork failed");
        exit(1);
    }
 
    if (pid == 0) {
        // 子进程
        printf("子进程PID: %d, 父进程PID: %d\n", getpid(), getppid());
        // 子进程正常退出,不会成为僵尸进程
        exit(0);
    } else {
        // 父进程
        sleep(5); // 让父进程暂停5秒钟,以便于观察僵尸进程
        printf("父进程等待子进程结束...\n");
        wait(NULL); // 等待子进程结束,通常这是清理僵尸进程的方法
        printf("父进程结束!\n");
    }
 
    return 0;
}

这段代码首先调用fork()创建一个子进程。在子进程中,我们打印出子进程和父进程的PID,然后正常退出,不会成为僵尸进程。父进程则在5秒后结束,通过调用wait()函数来等待子进程结束,以避免子进程变成僵尸进程。这是处理僵尸进程的一种常见方法。

2024-08-09

在Linux下配置MongoDB并设置账号密码的步骤如下:

  1. 安装MongoDB:



sudo apt-update
sudo apt-get install -y mongodb
  1. 启动MongoDB服务:



sudo systemctl start mongodb
  1. 开启MongoDB的认证机制:

    编辑MongoDB的配置文件/etc/mongod.conf,在net部分添加bindIpsecurity配置:




net:
  port: 27017
  bindIp: 127.0.0.1,localhost
 
security:
  authorization: enabled
  1. 重启MongoDB服务以应用配置更改:



sudo systemctl restart mongodb
  1. 连接到MongoDB shell:



mongo
  1. 创建管理员用户(可选):



use admin
db.createUser({
  user: 'admin',
  pwd: 'adminpassword',
  roles: [{ role: 'userAdminAnyDatabase', db: 'admin' }]
})
  1. 登录管理员账号:



db.auth('admin', 'adminpassword')
  1. 创建新的数据库用户和密码:



use your_db
db.createUser({
  user: 'your_username',
  pwd: 'your_password',
  roles: [{ role: 'readWrite', db: 'your_db' }]
})

完成以上步骤后,MongoDB将启用用户认证,并设置了一个名为your_username的用户,其密码为your_password,具有对your_db数据库的读写权限。记得替换示例中的your_db, your_username, your_passwordadminpassword为您自己的数据库名、用户名和密码。

2024-08-09

Linux是一种开源的操作系统,它可以在大多数的硬件设备上运行,包括个人电脑、服务器和超级计算机等。Linux操作系统的核心由Linus Torvalds在1991年开发,并且它是自由的和开源的,这意味着任何人都可以查看、修改和分发其内核。

Linux有许多不同的发行版,每个发行版都有自己的特色和目标用户群,例如Ubuntu,CentOS,Fedora,Debian等。

Linux的基本命令包括:

  1. ls:列出目录的内容
  2. cd:改变目录
  3. pwd:打印工作目录
  4. cat:连接并打印文件
  5. cp:复制文件
  6. mv:移动或重命名文件
  7. rm:删除文件或目录
  8. mkdir:创建目录
  9. touch:创建空文件
  10. chmod:改变文件或目录的权限

以下是一些基本命令的示例代码:




# 列出当前目录的内容
ls
 
# 列出指定目录的内容
ls /path/to/directory
 
# 改变当前工作目录
cd /path/to/directory
 
# 打印当前工作目录
pwd
 
# 连接并打印文件内容
cat filename.txt
 
# 复制文件
cp source.txt destination.txt
 
# 移动或重命名文件
mv oldname.txt newname.txt
 
# 删除文件
rm filename.txt
 
# 删除目录
rm -r directoryname
 
# 创建新目录
mkdir newdirectory
 
# 创建空文件
touch newfile.txt
 
# 改变文件或目录的权限
chmod 755 filename.txt

这些命令是Linux操作的基础,对于开发者来说,熟悉这些命令对于使用和管理Linux系统是非常有帮助的。