2024-08-16

要在Linux系统之间进行SSH免密登录,你需要生成一对SSH密钥,并将公钥复制到远程服务器。以下是具体步骤:

  1. 在本地机器上生成SSH密钥对:



ssh-keygen -t rsa

按照提示操作,也可以直接回车以接受默认设置。

  1. 将生成的公钥复制到远程服务器(将userremote_host替换为实际用户名和远程主机):



ssh-copy-id user@remote_host
  1. 登录远程服务器,验证免密登录是否成功。

确保~/.ssh目录的权限和所有权正确设置,~/.ssh目录的权限应该是700,~/.ssh/authorized_keys文件的权限应该是600。如果权限不正确,可以使用以下命令修复:




chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

以上步骤完成后,你应该能够从本地机器无密码SSH登录到远程服务器。

2024-08-16

Oracle Data Pump导出导入工具(expdp/impdp)是Oracle提供的一个高速数据和元数据移动工具,可以在数据库之间或者同一数据库中不同模式间移动数据和对象。

以下是使用expdp和impdp导出导入指定表的示例:

导出指定表:




expdp system/password@db11g schemas=scott directory=dpump_dir dumpfile=scott_tab.dmp logfile=scott_tab.log tables=emp,dept

在这个命令中,system是用户名,password是用户密码,db11g是数据库服务名,scott是模式名,directory是Oracle服务器上定义的目录,用于存放导出的文件,dumpfile是导出的文件名,logfile是日志文件名,tables是需要导出的表名列表。

导入指定表:




impdp system/password@db11g schemas=scott directory=dpump_dir dumpfile=scott_tab.dmp logfile=scott_tab_imp.log tables=emp,dept

导入命令与导出命令类似,只是将expdp改为impdp,并指定了导入的目录和文件。

注意:在实际操作中,需要确保Oracle用户有权限访问指定的目录,并且该目录已经在数据库中创建好了。




-- 创建目录
CREATE DIRECTORY dpump_dir AS '/u01/app/oracle/dpump_dir';

在Linux环境下,Oracle Data Pump的使用与在Windows环境下的使用基本相同,只是在命令行的执行和文件路径的表示上有细微差异。

2024-08-16

lrzsz 是一个用于实现Linux系统上文件传输的工具,包括从本地机器上发送文件到远程机器,以及从远程机器接收文件到本地机器。

安装lrzsz:

对于基于Debian的系统(如Ubuntu),使用以下命令:




sudo apt-get update
sudo apt-get install lrzsz

对于基于RPM的系统(如CentOS),使用以下命令:




sudo yum install lrzsz

使用lrzsz:

  • 要发送文件到远程系统,请使用以下命令:



rz

这将打开一个文件选择对话框,允许你选择要发送的文件。

  • 要从远程系统接收文件,请使用以下命令:



sz filename

filename替换为你想要发送的文件名。

注意:lrzsz 通常通过终端中的串行连接使用,如通过SSH客户端。如果你正在使用的是图形界面的SFTP客户端,它可能有自己的文件传输方法,不需要lrzsz。

2024-08-16

在Linux系统中,tree命令用于以树状图列出文件和目录。如果你需要在程序中使用类似的功能,你可以使用C语言编写一个简单的程序来实现。

以下是一个简单的C语言程序,使用opendirreaddir函数来遍历目录并以树状图列出文件和目录。




#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
 
void print_tree(const char *path, int depth) {
    struct dirent *entry;
    DIR *dir = opendir(path);
    if (!dir) {
        perror("opendir");
        return;
    }
 
    // 打印当前目录名
    printf("%*s%s/\n", depth, "", basename(path));
    depth += 4; // 增加缩进
 
    while ((entry = readdir(dir))) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
            continue;
 
        char entry_path[256];
        snprintf(entry_path, sizeof(entry_path), "%s/%s", path, entry->d_name);
 
        struct stat statbuf;
        if (stat(entry_path, &statbuf) == -1) {
            perror("stat");
            continue;
        }
 
        if (S_ISDIR(statbuf.st_mode)) {
            // 如果是目录,递归调用
            print_tree(entry_path, depth);
        } else {
            // 如果是文件,直接打印
            printf("%*s%s\n", depth, "", entry->d_name);
        }
    }
 
    closedir(dir);
}
 
int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        return 1;
    }
 
    print_tree(argv[1], 0);
    return 0;
}

这个程序定义了一个print_tree函数,它接受一个路径和当前的缩进深度,并以递归方式打印该路径下的目录和文件。主函数中,你可以指定你想要打印树状图的目录。

编译和运行这个程序,你需要使用gcc,并且确保你传入一个有效的目录路径作为参数。例如:




gcc -o tree tree.c
./tree /path/to/directory

这将会打印出指定目录下的树状文件和目录列表。

2024-08-16

在Linux中,初始化进程地址空间涉及设置代码、数据、堆和栈的初始内存区域。这通常在创建新进程时通过fork()系统调用完成,随后通过exec()系统调用加载具体的执行文件。

以下是一个简化的示例,描述了在创建新进程后如何初始化其地址空间:




#include <unistd.h>
#include <sys/mman.h>
 
int main() {
    pid_t pid = fork();
 
    if (pid == -1) {
        // 错误处理
    } else if (pid == 0) {
        // 子进程
        // 初始化进程地址空间
        // 这里可以添加更多初始化代码,例如设置堆、栈等
 
        // 加载并执行实际的程序
        execl("/path/to/program", "program_name", NULL);
 
        // 如果exec调用失败,则子进程将退出
    } else {
        // 父进程
        // 父进程可以继续执行其他任务
    }
 
    return 0;
}

在这个示例中,fork()创建了一个子进程,该子进程与父进程共享代码段。然后子进程通过execl()加载并执行指定的程序。在execl()调用之后,子进程的地址空间将被新的程序替换,之前的数据段、堆和栈将不再可用。

实际的地址空间初始化过程比这复杂得多,包括设置特定的内存保护标志、处理高地址空间(例如栈)的扩展、处理动态库的加载等。这些细节通常由操作系统内核在创建新进程时自动处理。

2024-08-16

grep 是一种在 Linux 或 Unix 系统中用于文本搜索的强大工具。它的名字来自 "Global Regular Expressions Print"(全局正则表达式打印),它的作用是对文本文件进行搜索,并打印出匹配特定模式的行。

基本语法:




grep [options] pattern [file...]

常用选项:

  • -i:不区分大小写。
  • -v:显示不包含匹配文本的所有行。
  • -n:显示匹配行及其行号。
  • -c:只输出匹配的行数。
  • -l:只列出包含匹配文本的文件名。
  • -R--recursive:递归地搜索每个指定目录下的文件。
  • -A num:显示匹配行以及之后的 num 行。
  • -B num:显示匹配行以及之前的 num 行。
  • -C num:显示匹配行以及之前后的 num 行。
  • --color:高亮显示匹配的文本。

使用实例:

  1. 在文件中搜索特定模式:



grep "error" log.txt
  1. 在多个文件中搜索:



grep "error" log1.txt log2.txt
  1. 不区分大小写地搜索:



grep -i "error" log.txt
  1. 只列出匹配的文件名:



grep -l "error" log1.txt log2.txt
  1. 显示匹配行及其行号:



grep -n "error" log.txt
  1. 显示匹配行前后各两行:



grep -C 2 "error" log.txt
  1. 统计匹配行数:



grep -c "error" log.txt
  1. 递归搜索目录中所有文件:



grep -R "error" /path/to/directory/
  1. 高亮显示匹配文本:



grep --color "error" log.txt
  1. 显示不包含特定模式的所有行:



grep -v "error" log.txt

grep 是一种强大的文本搜索工具,可以通过各种选项和正则表达式进行复杂的搜索。

2024-08-16

在Linux系统中,可以使用du命令来查看目录的大小。以下是一些常用的du命令选项和示例:

  • -h:以人类可读的格式显示(例如,自动选择KB、MB、GB)。
  • -s:显示总计大小,而不显示子目录的大小。
  • --max-depth=N:显示N级子目录的大小。

查看当前目录的大小:




du -sh

查看当前目录中各个子目录的大小:




du -h --max-depth=1

查看特定目录(例如/var)的大小:




du -sh /var

这些命令会提供目录的大小信息,帮助你管理和优化你的Linux系统。

2024-08-16

在Linux系统中,要设置Nginx服务开机自启动,通常可以使用系统的服务管理工具。大多数现代的Linux发行版使用systemd作为初始化系统和服务管理器。以下是设置Nginx开机自启的步骤:

  1. 确保Nginx已安装。
  2. 启用Nginx服务,以便在开机时自动启动。
  3. (可选)检查Nginx服务的启动状态。

以下是相应的命令:




# 安装Nginx(如果尚未安装)
sudo apt-get update
sudo apt-get install nginx
 
# 启用Nginx开机自启
sudo systemctl enable nginx
 
# 启动Nginx服务
sudo systemctl start nginx
 
# (可选)检查Nginx服务状态
sudo systemctl status nginx

systemctl enable命令将Nginx设置为开机自启动。systemctl start命令立即启动Nginx服务。systemctl status命令可以用来检查Nginx的运行状态。

请根据您使用的Linux发行版和版本,适当调整上述命令。例如,在Red Hat系的发行版中,可能需要使用yumdnf代替apt-get

2024-08-16

Linux是一种开源的操作系统,广泛用于服务器和嵌入式系统。以下是一些重要的Linux知识点:

  1. 文件系统:Linux使用目录和文件的层次结构来组织数据。重要的目录包括/, /home, /etc, /var, /usr等。
  2. 权限管理:Linux使用user, group和权限位来管理文件访问。chmod, chown, chgrp等命令用于修改权限。
  3. 进程管理:Linux通过ps, top, htop等命令查看进程状态,kill, pkill, killall等命令终止进程。
  4. 服务管理:使用systemctl管理服务的启动、停止、重启、查看状态等。
  5. 软件包管理:使用apt, yum等工具安装、更新、卸载软件包。
  6. Shell:Linux命令行界面的核心,包括BashZsh等。使用alias, functions, pipelines等功能提高效率。
  7. 网络配置:使用ifconfig, ip, netstat等工具查看和配置网络接口。
  8. 正则表达式:在Linux中,正则表达式被广泛用于文本处理。
  9. 文本处理工具:如grep, sed, awk等,用于处理文本数据。
  10. 系统安全:理解用户认证、访问控制、安全工具如sudo, firewalld, iptables等。
  11. 日志系统journalctl, dmesg, syslog等用于查看系统日志。
  12. 性能监控top, htop, vmstat, iostat, mpstat等工具监控系统性能。
  13. 硬件管理lshw, lsblk, fdisk, parted等工具用于查看和管理硬件。
  14. 批处理shell script可以将多个命令组合成一个自动化脚本。
  15. 高级技巧:如ssh远程登录,scp远程文件复制,rsync远程同步工具等。
  16. 虚拟化KVM, Docker, VirtualBox等虚拟化技术。
  17. 高级文件系统btrfs, ZFS等新型文件系统提供更高级的功能。
  18. 系统更新和升级do-release-upgrade等工具用于更新系统。
  19. 故障排查:具备使用strace, gdb, lsof等工具排查问题的能力。
  20. 内核和模块:理解内核及其模块,如sysctl, modprobe等工具。

这些是Linux学习中的一些重要概念。在实际应用中,还需要根据具体需求学习相关工具和服务的使用。

2024-08-16



#!/bin/bash
# 安装iptables-persistent包
sudo apt-update
sudo apt-get install -y iptables-persistent
 
# 清空现有的规则
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -X
 
# 默认策略:允许所有本地流量,拒绝所有外部流量
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
 
# 保存规则并退出
sudo netfilter-persistent save
sudo netfilter-persistent reload

这段代码首先确保iptables-persistent包已安装,然后清空所有现有的iptables规则并设置默认策略。接着,它允许本地回环接口流量,并且允许与已经建立的连接相关的流量。还允许ICMP(用于ping)和SSH连接,并最终拒绝所有其他入站连接。这为Ubuntu 22.04系统提供了一个基本的安全规则集。