文章851
标签121
分类10

Linux 分区下误删的文件恢复全记录

在 Linux 系统中,误删文件是一个常见问题。无论是由于操作失误还是脚本错误,文件的丢失都可能导致数据损失。为了有效地恢复这些文件,了解恢复方法以及如何记录恢复过程是非常重要的。本文将介绍在 Linux 中恢复误删文件的步骤及注意事项。

1. 文件删除的原理

在 Linux 系统中,当您删除一个文件时,文件的内容并不会立即从磁盘上消失。相反,文件的 inode(索引节点)和目录项被删除,但文件数据仍然存在,直到被新的数据覆盖。利用这一点,您可以尝试恢复被误删的文件。

2. 恢复工具

在 Linux 中,有多个工具可以帮助您恢复误删的文件。以下是一些常用的工具:

2.1 TestDisk

TestDisk 是一个强大的开源数据恢复工具,能够恢复丢失的分区和修复启动问题。

安装

sudo apt install testdisk  # Ubuntu/Debian
sudo yum install testdisk  # CentOS/RHEL

使用

  1. 启动 TestDisk:

    sudo testdisk
  2. 选择 “Create” 来创建一个日志文件。
  3. 选择要恢复的磁盘。
  4. 进行分析,查找丢失的分区。
  5. 按照屏幕提示进行操作,找到并恢复文件。

2.2 extundelete

extundelete 是专门用于 ext3 和 ext4 文件系统的恢复工具。

安装

sudo apt install extundelete  # Ubuntu/Debian
sudo yum install extundelete  # CentOS/RHEL

使用

  1. 确保要恢复的分区未被挂载:

    sudo umount /dev/sdX1
  2. 使用 extundelete 恢复文件:

    sudo extundelete /dev/sdX1 --restore-file /path/to/deleted/file

    或者恢复整个目录:

    sudo extundelete /dev/sdX1 --restore-directory /path/to/deleted/directory
  3. 恢复的文件会被保存到 RECOVERED_FILES 目录中。

2.3 PhotoRec

PhotoRec 是 TestDisk 的附带工具,专注于恢复文件,尤其是媒体文件。

使用

  1. 启动 PhotoRec:

    sudo photorec
  2. 选择磁盘,选择文件系统类型。
  3. 选择 “Whole” 来扫描整个磁盘。
  4. 选择恢复的文件类型和目标位置。

3. 恢复过程记录

在恢复文件时,建议记录整个过程,以便后续参考和分析。您可以使用以下方式进行记录:

  • 命令行日志:使用 script 命令记录整个终端会话:

    script recovery_log.txt

    进行恢复操作后,输入 exit 结束记录。

  • 手动记录:在恢复过程中,手动记录每个步骤,包括使用的命令、遇到的问题以及恢复的结果。

4. 注意事项

  • 尽量避免写入:在误删文件后,尽量避免对磁盘写入新数据,以减少数据覆盖的风险。
  • 使用 Live CD:在一些情况下,使用 Live CD 启动系统以避免对磁盘的写入操作是一个好主意。
  • 定期备份:定期备份重要数据是防止数据丢失的最佳策略。

5. 结论

在 Linux 系统中恢复误删文件并不是一件不可能的事情。借助合适的工具和方法,您可以有效地找回丢失的数据。希望本文能够帮助您理解文件恢复的过程,并为您提供实用的恢复方法和记录技巧。

实践 Nginx 平滑升级 流程及失败处理方案

环境 阿里云 Centos 6.5 nginx/1.10.3

查看当前Nginx 版本及编译信息 :

[root@xxx nginx]#/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.3
built by gcc 6.1.0 (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/src/make/software/pcre-8.38 --add-module=/usr/src/make/software/redis2-nginx-module-master --add-module=../ngx_devel_kit-0.3.0 --add-module=../lua-nginx-module-0.10.8

挑选最新版本nginx (个人使用不考虑稳定性, 使用jishu)

[root@xxx src]#wget http://nginx.org/download/nginx-1.13.9.tar.gz
--2018-03-02 10:57:14--  http://nginx.org/download/nginx-1.13.9.tar.gz
Resolving nginx.org... 206.251.255.63, 95.211.80.227, 2606:7100:1:69::3f, ...
Connecting to nginx.org|206.251.255.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 994802 (971K) [application/octet-stream]
Saving to: “nginx-1.13.9.tar.gz”

100%[======================================================================================================================================================================================================================================>] 994,802     84.8K/s   in 16s     

2018-03-02 10:57:32 (59.1 KB/s) - “nginx-1.13.9.tar.gz” saved [994802/994802]

个人习惯安装软件在 /usr/local/src

[root@xxx src]#pwd
/usr/local/src

解压

[root@xxx src]#tar zxvf nginx-1.13.9.tar.gz
[root@xxx src]#cd nginx-1.13.9
[root@xxx nginx-1.13.9]#ll
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src

开始编译老套路 中间有插曲 编译参数错误了 所以生成了Makefile 文件 使用 make clean 清理编译文件

[root@xxx nginx-1.13.9]#make clean
rm -rf Makefile objs

开始编译参数

./configure  --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/src/make/software/pcre-8.38 --add-module=/usr/src/make/software/redis2-nginx-module-master --add-module=../ngx_devel_kit-0.3.0 --add-module=../lua-nginx-module-0.10.8

沮丧又出问题了 缺少第三方模块 ngx_devel_kitlua 从网上查来安装教程

下载ngx_devel_kit(NDK)模块 :https://github.com/simpl/ngx_devel_kit/tags,不需要安装

wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar -xzvf v0.3.1rc1.tar.gz

下载最新的lua-nginx-module 模块 :https://github.com/openresty/lua-nginx-module/tags,不需要安装

wget https://github.com/openresty/lua-nginx-module/archive/v0.10.12rc2.tar.gz
tar -xzvf v0.10.12rc2.tar.gz

重新编译

./configure  --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module  --with-pcre=/usr/src/make/software/pcre-8.38 --add-module=/usr/src/make/software/redis2-nginx-module-master --add-module=/usr/local/src/ngx_devel_kit-0.3.1rc1 --add-module=/usr/local/src/lua-nginx-module-0.10.12rc2

Configuration summary
  + using PCRE library: /usr/src/make/software/pcre-8.38
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

终于ok了 可以开始 make 了 平滑升级 记住 只能make 千万别 make install

[root@xxx nginx-1.13.9]#make
make -f objs/Makefile
make[1]: Entering directory `/usr/local/src/nginx-1.13.9'
cd /usr/src/make/software/pcre-8.38 \
    && if [ -f Makefile ]; then make distclean; fi \
    && CC="cc" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
    ./configure --disable-shared
/bin/sh: line 0: cd: /usr/src/make/software/pcre-8.38: No such file or directory
make[1]: *** [/usr/src/make/software/pcre-8.38/Makefile] Error 1
make[1]: Leaving directory `/usr/local/src/nginx-1.13.9'
make: *** [build] Error 2

哦 抛错了 不要慌 看看什么问题

[root@xxx nginx-1.13.9]#cd /usr/src/make/software/pcre-8.38 
-bash: cd: /usr/src/make/software/pcre-8.38: No such file or directory 没有'-'
#把准备好的pcre包解压
[root@xxx software]#tar zxf pcre-8.38.tar.gz

make 正在运行中 我的服务器配置太低 如果你是多核 make -j 加速编译速度

make[1]: Leaving directory `/usr/local/src/nginx-1.13.9'

终于编译完了 . 查看objs 目录下 生成了新的nginx

[root@xxx nginx-1.13.9]#ls objs/
addon  autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src

保存并替换nginx

[root@xxx nginx-1.13.9]#mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-20180302
[root@xxx nginx-1.13.9]#cp objs/nginx /usr/local/nginx/sbin/nginx

执行升级 失效 通知 kill -user2 通知主进程失败 正常到这步就结束了 但通知主进程失败 未生成

/usr/local/nginx/logs/nginx.pid.oldbin 文件老nginx 进程在垂死挣扎

[root@xxx nginx-1.13.9]#make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
make: *** [upgrade] Error 1
You have mail in /var/spool/mail/root

手动试下 还是没用 中午了 吃饭去 回来再看看 进程死没死

[root@xxx nginx-1.13.9]#kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
[root@xxxx nginx-1.13.9]#test -f /usr/local/nginx/logs/nginx.pid.oldbin && echo OK!

介绍下Nginx的信号控制

  • TERM,INT 快速关闭
  • QUIT 从容关闭
  • HUP 平滑重启,重新加载配置文件
  • USR1 重新打开日志文件,在切割日志时用途较大
  • USR2 平滑升级克执行程序
  • WINCH 从容关闭工作进程

出现异常 USR2 失效了.

最终也没有成功做到平滑升级.

推荐失败后解决方案

先写个简单的监控脚本 查看服务器是否断连

#!/bin/bash

while [ 0 ]
    do
        curl -I 'http://localhost:80/'
        sleep 1
    done

尝试多次nginx -s reload 进程ID仍未改变.

采用方案

  • kill -WINCH #先关闭工作进程 后观察 脚本输出停止了
  • kill -HUP #平滑重启 观察 脚本重新输出 但并未做到更新
  • kill -QUIT #从容关闭 观察 脚本输出 连接错误

nginx #重启成功

HTTP/1.1 200 OK
Server: nginx/1.13.9
Date: Fri, 02 Mar 2018 08:41:53 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding

总结: 本次平滑升级失败 . 失败原因受个人能力问题未找到.

后记: 模块加载错了 我又重新编译安装错误仍然存在. kill -USR2 无效 未生成 nginx.pid.oldbin

CSV 转 PHP 数组格式

更新下代码 原来写的有坑 这个测试使用 需要注意不同操作系统平台换行符不同

<?php

// 铺单csv 文件解析生成sql
$csvFile = '/Users/admin/Desktop/铺单Sql.csv';


/**
 * @param $csvFile
 * @param string $eol 根据平台选择
 * windows平台相当于         "\r\n";
 * unix\linux平台相当于      "\n";
 * mac平台相当于             "\r";
 * @return mixed
 * ------------------------------------------------------------
 */
function csvFileToArray($csvFile, $isHead = true, $eol = "\r")
{
    $contents = file_get_contents($csvFile);
    // 分行
    $lineArray = explode($eol, encodeToUtf8($contents));

    if ($lineArray) {
        $lineArray = array_map(function ($line) {
            return array_map('trim', explode(',', $line));
        }, $lineArray);
    }

    // 第一行当做头部处理
    $fieldList = array_shift($lineArray);

    if ($isHead) {

        foreach ($lineArray as $key => $data) {
            $lineArray[$key] = array_combine($fieldList, $data);
        }
    }

    return $lineArray;
}

$data = csvFileToArray($csvFile);
var_dump($data);

/**
 * @编码格式转换
 * @param $content
 * @return string
 * @throws Exception
 * ------------------------------------------------------------
 */
function encodeToUtf8($content)
{
    $newContent = iconv('', 'UTF-8', $content);
    if (is_bool($newContent)) {
        throw new Exception('编码错误' . $content, 500);
    }

    return $newContent;
}

`du` 查找已 G 为单位的文件

在 Linux 和 Unix 系统中,du(disk usage)命令用于查看文件和目录的磁盘使用情况。当我们需要查找特定大小(如以 G 为单位)的文件时,du 命令非常有用。本文将介绍如何使用 du 查找特定大小(以 G 为单位)的文件。

1. du 命令简介

du 命令用于估算文件和目录所占用的磁盘空间。它可以递归地显示每个目录的大小,也可以仅显示指定文件的大小。du 的基本语法如下:

du [options] [file...]

2. 查找特定大小的文件

要查找大小为 G 的文件,我们可以结合使用 du 和其他命令(如 findgrep)。以下是一些常用的方法。

2.1 使用 du 列出所有文件

您可以使用 du 命令列出当前目录及其子目录中所有文件的大小,并以 G 为单位显示:

du -h --max-depth=1
  • -h:以人类可读的形式显示(如 K、M、G)。
  • --max-depth=1:仅显示当前目录下的文件和目录大小。

2.2 查找大于 1G 的文件

要查找大于 1G 的文件,可以使用 find 命令结合 du

find . -type f -exec du -h {} + | grep 'G'
  • find .:从当前目录开始查找。
  • -type f:仅查找文件。
  • -exec du -h {}:对每个找到的文件执行 du -h
  • grep 'G':只显示包含 'G' 的行,即大小为 G 的文件。

2.3 直接使用 find 查找文件大小

您还可以直接使用 find 命令查找特定大小的文件,而不使用 du

find . -type f -size +1G
  • -size +1G:查找大于 1G 的文件。

2.4 查找小于 1G 的文件

要查找小于 1G 的文件,可以使用:

find . -type f -size -1G

3. 示例

假设您想要查找当前目录下所有大于 2G 的文件,可以运行:

find . -type f -size +2G

运行后,系统将列出所有符合条件的文件。

4. 注意事项

  • 权限问题:确保您对要查找的目录和文件具有适当的访问权限。
  • 性能:在大目录中运行 dufind 命令可能会导致性能问题,建议在较小的目录或使用特定的过滤条件进行查找。

5. 结论

使用 dufind 命令结合,可以方便地查找到特定大小(以 G 为单位)的文件。这对于管理磁盘空间和清理不必要的文件非常有帮助。希望本文能帮助您更好地使用 dufind 命令。

Ajax 请求中添加请求头(Request Header)和 Token

在现代 web 应用中,Ajax 技术广泛用于实现异步数据交互。在进行 Ajax 请求时,安全性是一个重要的考虑因素。通过在请求头中添加 Token,您可以有效地保护 API,确保只有经过身份验证的用户可以访问受保护的资源。本文将介绍如何在 Ajax 请求中添加请求头和 Token。

1. 什么是 Ajax?

Ajax(Asynchronous JavaScript and XML)是一种用于创建异步 web 应用的技术。它允许网页在不重新加载整个页面的情况下与服务器进行数据交换,从而提供更流畅的用户体验。

2. 为什么使用 Token?

Token 通常用于身份验证和授权。通过在请求头中包含 Token,您可以:

  • 确保请求的合法性。
  • 保护敏感数据,防止未授权访问。
  • 支持无状态的身份验证,减少服务器负担。

3. 如何在 Ajax 请求中添加 Token

3.1 使用 jQuery

如果您使用 jQuery 进行 Ajax 请求,可以通过 beforeSend 选项在请求头中添加 Token:

$.ajax({
    url: 'https://api.example.com/data',
    type: 'GET',
    beforeSend: function(xhr) {
        xhr.setRequestHeader('Authorization', 'Bearer YOUR_TOKEN_HERE');
    },
    success: function(data) {
        console.log(data);
    },
    error: function(xhr, status, error) {
        console.error('请求失败:', error);
    }
});

3.2 使用原生 JavaScript

如果您不使用 jQuery,可以使用原生的 XMLHttpRequestfetch API:

3.2.1 使用 XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.setRequestHeader('Authorization', 'Bearer YOUR_TOKEN_HERE');

xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
        console.log(JSON.parse(xhr.responseText));
    } else {
        console.error('请求失败:', xhr.statusText);
    }
};

xhr.onerror = function() {
    console.error('请求失败:', xhr.statusText);
};

xhr.send();

3.2.2 使用 fetch

fetch('https://api.example.com/data', {
    method: 'GET',
    headers: {
        'Authorization': 'Bearer YOUR_TOKEN_HERE'
    }
})
.then(response => {
    if (!response.ok) {
        throw new Error('网络响应失败');
    }
    return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('请求失败:', error));

4. 服务器端处理

在服务器端,您需要相应地处理请求头。以下是一个使用 PHP 的示例:

if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'];
    // 解析 Token,进行身份验证
    // ...
}

5. 注意事项

  • 安全性:确保 Token 的生成和验证过程安全可靠。常见的做法是使用 JWT(JSON Web Tokens)。
  • HTTPS:始终在 HTTPS 下发送 Token,以防止中间人攻击。
  • Token 过期:实现 Token 的过期机制,并处理 Token 过期后的请求。

6. 结论

在 Ajax 请求中添加请求头和 Token 是确保应用安全的重要步骤。通过正确配置请求,您可以有效地保护 API 和用户数据。希望本文能帮助您理解如何在 Ajax 请求中使用 Token。

">