我们通常使用scp在服务器之间的copy数据,但需要每次输入账户密码才能完成copy。

比如我们欲将test.cpp文件从192.168.9.130拷贝到192.168.128服务器,一般执行流程如下图所示:

有时我们需要在脚本中自动将某些数据传输到另外一台机器上,每次输入密码则不那么方便,所以我们需要实现scp服务器间免密拷贝数据。

实现scp服务器间的密码拷贝数据,其方法一般有如下两步:

第一步,在本机生成SSH公私钥;

第二步,将本机生成的公钥拷贝到目标机器上,然后将公钥内容加入对应账号的 /home/{user}/.ssh/authorized_keys 文件内;

阅读全文 »

OpenSSH有两种认证方式:基于口令认证和基于密钥认证。
基于口令的认证相对简单,仅需在SSH客户端登录时输入密码即可。在某些场景,比如登录公司服务器,一般需要我们通过每人的密钥登录。
本文基于我经常使用的SecureCRT和WindTerm两个SSH客户端工具,分别介绍如何使用密钥登录。

阅读全文 »

OpenSSH有两种认证方式:基于口令认证和基于密钥认证。
基于口令的认证相对简单,仅需在SSH客户端登录时输入密码即可。在某些场景,比如登录公司服务器,一般需要我们通过每人的密钥登录。
本文基于我经常使用的SecureCRT和WindTerm两个SSH客户端工具,分别介绍如何使用密钥登录。

阅读全文 »

OpenSSH是SSH(Secure SHell)协议的免费开源实现,SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。OpenSSH是用于远程登录、命令执行以及文件传输的SSH协议的完整实现,它支持SSH协议的V1.3、V1.5和V2。自OpenSSH-V2.9 以来,默认的SSH协议是V2,使用RSA 钥匙。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。

程序主要包括了几个部分:

  • ssh - rlogin与Telnet的替代方案。
  • scp、sftp - rcp的替代方案,将文件复制到其他电脑上。
  • sshd - SSH服务器。
  • ssh-keygen - 产生RSA或DSA密钥,用来认证用。
  • ssh-agent、ssh-add - 帮助用户不需要每次都要输入密钥密码的工具。
  • ssh-keyscan - 扫描一群机器,并记录其公钥。

在Centos、Ubuntu或者Debian等发行版上,我们可以使用yum或者apt提供的软件源直接安装。本文主要讲解的是使用源代码+手工编译+手工安装的方式来编译安装OpenSSH。

阅读全文 »

上文 supervisor基本使用方法教程,我们重点了supervisor的基本使用方法,并未对它进行过多的展开。我们知道supervisor有三个重要的部分 supervisord、supervisorctl、inet_http_server 组成,但我认为隐藏在三部分后面的配置文件,才需要重点关注和学习,毕竟它控制着所有的表现属性。为了比较好的掌握supervisor的使用,本文我们对supervisor的配置文件进行重点分析。

阅读全文 »

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

Supervisor是一个在类UNIX系统上,监控控制大量进程的客户端/服务端系统。其主要功能包括程序自动启动、程序奔溃后自动重启,指定进程数目等等。本文是Supervisor安装、配置和使用的简单教程。

阅读全文 »

在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式。它们生成的makefile文件,一般默认不支持-g调试选项。
但我们使用这种方式编译出来的静态库时,如果程序运行中core在静态库中,我们看不到有用的相关信息。所以有必要编译出debug版本。

阅读全文 »

glibc是标准C库的GNU实现。我们采用C/C++所写的程序,运行时基本都依赖与它。如果我们想看当前机器glibc的源代码,首先需要知道当前机器glibc的版本号,然后到glibc的官网下载对应版本的源代码。

阅读全文 »

背景

当前的工作与SVN有关,今天使用SVN库编写了一个小程序,编译代码时发现编译器告警:”warning: ‘svn_client_ls2’ is deprecated (declared at /home/svn/apps/svn/include/subversion-1/svn_client.h:4942)”。

1
2
3
4
5
6
7
svn@linux-rwdx:~/objs/motadou> make
g++ webdav.cpp -o webdav -I/home/svn/apps/svn/include/subversion-1 -I/home/svn/apps/neon/include/neon -I/home/svn/apps/apr-util/include/apr-1 -I/home/svn/apps/apr/include/apr-1 -I/home/svn/apps/sqlite/include -I/home/svn/apps/ssl/include/openssl\
-L/home/svn/apps/svn/lib -lsvn_client-1 -lsvn_wc-1 -lsvn_fs-1 -lsvn_fs_fs-1 -lsvn_fs_util-1 -lsvn_ra-1 -lsvn_ra_neon-1 -lsvn_ra_local-1 -lsvn_repos-1 -lsvn_delta-1 -lsvn_diff-1 -lsvn_subr-1 -L/home/svn/apps/neon/lib -lneon -L/home/svn/apps/apr-util/lib -laprutil-1 -L/home/svn/apps/apr/lib -lapr-1 -pthread /home/svn/apps/sqlite/lib/libsqlite3.a -L/home/svn/apps/ssl/lib -lssl -lcrypto -lz

webdav.cpp: In function 'int svn_list(Handle&, const std::string&)':
webdav.cpp:120: warning: 'svn_client_ls2' is deprecated (declared at /home/svn/apps/svn/include/subversion-1/svn_client.h:4942)
webdav.cpp:120: warning: 'svn_client_ls2' is deprecated (declared at /home/svn/apps/svn/include/subversion-1/svn_client.h:4942)
阅读全文 »

背景

相比于静态链接库,Linux上的动态链接库和可执行程序都是ELF格式。原理上动态库也能和可执行程序一样直接运行。

比如,可以直接运行“/lib64/ld-linux-x86-64.so.2”,还有“/lib/x86_64-linux-gnu/libpthread.so.0”, 还有“/lib/x86_64-linux-gnu/libc.so.6”等等。举个例子,libc.so.6是C/C++运行时库的GNU实现,我们直接运行该动态库,打印如下信息:

可见,动态库直接运行后,提示了该动态库的编译信息、版本信息等等。在实际项目中,我们也可以为动态库增加类似功能,用户直接运行我们提供的动态库之后,我们就打印该库的编译环境、运行方法、编译版本等等信息,或者完成其他功能。

阅读全文 »

昨天看一篇关于libco的博文,里面提到了一个由于全静态链接导致的bug。全静态链接?以前没有接触过这个概念,特意到网上搜了下,原来是一个程序将其依赖的所有动态库都替换成对应静态库,即使是libc.so,libm.so,libstdc++.so这种系统级别的动态库。全静态链接出来的可执行程序,不依赖任何动态库,拷贝到任何一台机器,只需要操作系统,这个程序就可以run起来。

这种全静态链接的方式,肯定有好有坏。

  • 第一,缺点:浪费了磁盘空间。全静态链接出来的可执行程序要比动态链接的大。但目前磁盘普遍够大,这个缺点基本可以忽略。
  • 第二,缺点:浪费了内存空间。我们知道相同的动态库在内存中只存在一份,被多个程序共享。而静态库,是需要全部加载到内存的。所以多多少少要浪费一些内存空间。目前来看,内存仍然是服务器中宝贵的资源,能省一些肯定划算。
  • 第三,优点:屏蔽了动态库的版本差异。由于静态链接把所有依赖的函数,全部打包进可执行程序,不依赖于特定机器的动态库函数版本。所有分布式部署的程序,其行为一致。

那全静态链接如何优雅的实现呢?gcc为我们提供了(-static)、(-Wl,-Bstatic)、(-Wl,-Bdynamic),这么几个选项。

阅读全文 »

重启VMWare虚拟机中的操作系统,会在极端时间内重启完成,无法选择从诸如CD-ROM的其他介质启动,所以就不方便使用当前已创建的虚拟磁盘,来重新安装操作系统。本文记录如何利用已创建的磁盘来重装系统。

阅读全文 »

我在Github上有多个账号:

  • motadou账号,是主力账号,主要用于fork比较重要的仓库,用于自己存档,该仓库比较杂乱。
  • pagepaper账号,是博客账号,主要用于博文撰写以及gitbook总结性文章,是自己写作的主要基地。
  • mancodenet账号,是代码账号,主要用于存放自己的开源代码,以简练为主。

按照平时的使用习惯,每个账号我都会设置SSH keys进行免密登录。本文就是记录一种可以在同一台电脑上同时使用多个Github账号的方法。

清除全局账号信息

如果之前你设置过全局user.name和user.email,必须先清理掉该全局设置。
也就是说,不能使用全局的user.name和user.email,必须每个仓库设置自己本地的user.name和user.email。
清理方法如下:

1
2
$ git config --global --unset user.name
$ git config --global --unset user.email
阅读全文 »

Ubuntu通过netplan来配置网卡,为了研究netplan的使用方法和实现原理,我们首先通过编译安装的方法,重新定制netplan。
本文记录编译netplan的方法。

阅读全文 »