IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / AgilePHP
IT 2016-02-10 23:17:17 / 累计浏览 1,940

如何hook一个系统调用

这篇讲的是如何通过hook系统调用来定位一个隐蔽的bug。作者从一个具体问题出发:他们使用的某个库会断言socket的文件描述符必须大于0,但系统运行一段时间后这个断言会失败,意味着有人错误地关闭了标准输入(fd=0)。 面对这个难题,作者没有选择在每个close调用处手动添加日志(工作量大且易遗漏),而是利用了Linux下动态链接的一个精妙特性:`LD_PRELOAD`。文章详细展示了如何编写一个名为`my_close.c`的共享库,在其中重新定义`close`函数。这个函数会先检查传入的fd是否为0,如果是则直接让程序崩溃(coredump),否则通过`dlsym`获取并调用原始的`close`函数。 通过设置`LD_PRELOAD`环境变量指向这个自定义库,程序在运行时就会优先加载它,从而劫持所有的`close`调用。这样,一旦程序中有代码试图关闭标准输入,就能立刻被定位到。整个过程巧妙地利用了系统机制,将原本需要大范围排查的问题,转化为了一个精准的触发点,是调试动态库和大型程序时一个非常实用的技巧。

本机暂存
IT 2011-06-01 23:44:27 / 累计浏览 5,580

SSH无密码登录

这篇讲的是如何彻底告别每次SSH连接时都需要输入密码的烦恼,核心是通过配置公钥认证来实现无密码登录。作者从实际工作频繁使用SSH的痛点出发,记下了这套省时又安全的标准操作流程。关键在于理解SSH公私钥认证的机制:你在本地客户端生成一对密钥,然后将公钥安全地部署到远程服务器上,之后连接时通过密钥对完成身份验证,无需再输密码。文章详细梳理了具体步骤,包括生成密钥对(推荐使用更安全的Ed25519算法)、将公钥分发到服务器的`~/.ssh/authorized_keys`文件中,以及至关重要的文件与目录权限设置(如`.ssh`目录需为700,密钥文件600),任何环节出错都可能导致登录失败。掌握后,对于需要频繁登录同一台或多台服务器的开发者或运维人员来说,能极大提升工作效率并减少因密码泄露带来的风险。

本机暂存
IT 2011-02-09 22:13:04 / 累计浏览 6,580

在C++里写一个不能被继承的类

这篇讲的是C++中一个经典面试题的巧妙解法。作者从一个实际问题切入:C++不像Java那样有现成的`final`关键字来阻止类被继承,但在某些设计场景下,我们确实需要这样的约束。 文章的核心是展示一种变通方案:通过将类的构造函数设为`private`,同时声明友元,来实例化对象。这样一来,外部代码就无法通过常规方式创建该类的子类——因为子类构造函数必须调用父类构造函数,而父类的构造函数是不可访问的。这种技巧利用了C++访问控制和友元机制的特性,绕开了语言的显式限制。 其巧妙之处在于,它不依赖任何编译器扩展,完全基于标准C++语义实现了一个“非继承类”。虽然代价是失去了直接使用`new`在堆上创建对象的便利性(需要配合友元工厂函数),但为需要严格限制继承层次的场景提供了一种可行的、符合C++哲学的设计思路。这也体现了C++程序员常说的那句话:只要规则允许,总能找到创造性的实现方式。

本机暂存