所有由浪得虛名发布的文章

交叉编译lrzsz(用于串口传输文件)【轉】

【原文鏈接】

https://blog.csdn.net/zijie_xiao/article/details/50934279

【原文摘錄】

1. 系统环境:

Distributor ID:    Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:    14.04
Codename:    trusty

2. 源码下载地址:

http://freecode.com/projects/lrzsz/

或者

https://ohse.de/uwe/software/lrzsz.html

3. 编译工具:

适用于mini2440开发板的arm-linux-gcc-4.4.3-20100728.tar.gz

4. 添加cache file(可省略)

tar xzvf lrzsz-0.12.20.tar.gz

cd lrzsz-0.12.20

vi arm-linux.cache

ac_cv_prog_CC=${ac_cv_prog_CC=’arm-linux-gcc’}

5. 配置及编译

5.1 执行

./configure –cache-file=./arm-linux.cache –prefix=XX –host=arm-linux –build=arm-linux

若没有设置第四步的cachefile

则执行

CC=arm-linux-gcc ./configure –cache-file=./arm-linux.cache –prefix=XX –host=arm-linux –build=arm-linux

5.2

make && make install
最后生成 bin  man  share 三个目录

可以看到bin目录下有 lrb  lrx  lrz  lsb  lsx  lsz 几个目标文件

用过命令 ls -il 可以看到

7343648 -rwxr-xr-x 3 michael michael 156169  3月 20 00:43 lrb
7343648 -rwxr-xr-x 3 michael michael 156169  3月 20 00:43 lrx
7343648 -rwxr-xr-x 3 michael michael 156169  3月 20 00:43 lrz
7343649 -rwxr-xr-x 3 michael michael 157178  3月 20 00:43 lsb
7343649 -rwxr-xr-x 3 michael michael 157178  3月 20 00:43 lsx
7343649 -rwxr-xr-x 3 michael michael 157178  3月 20 00:43 lsz
lrb lrx lrz 是同一个文件的硬链接, lsb lsx lsz是用一个文件的硬链接。

常用参数

-b 以二进制方式,默认为文本方式。(Binary (tell it likeit is) file transfer override.)

-e 对所有控制字符转义。(Force sender to escape allcontrol characters; normally XON, XOFF, DLE, CR-@-CR, and Ctrl-X are escaped.)

如果要保证上传的文件内容在服务器端保存之后与原始文件一致,最好同时设置这两个标志,如下所示方式使用:

rz -be

使用以下脚本方便编译:

[plain] view plain copy

  1. #!/bin/bash
  2. CUR_DIR=`pwd`
  3. SRC=lrzsz
  4. OBJ=
  5. HOST=arm-linux
  6. BUILD=arm-linux
  7. INSTALL_PREFIX=${CUR_DIR}/lrzsz_out
  8. mkdir -p ${INSTALL_PREFIX}
  9. cd ${SRC}
  10. echo “ac_cv_prog_CC=${ac_cv_prog_CC=’arm-linux-gcc’}” >> arm-linux.cache
  11. ./configure –prefix=${INSTALL_PREFIX} –host=${HOST} –build=${BUILD} –cache-file=./arm-linux.cache
  12. make && make check && make install
  13. cd –

 

参考网址:

http://blog.csdn.net/linucos/article/details/5582979

http://www.tuicool.com/articles/iA3uYz

http://blog.163.com/seven_7_one/blog/static/16260641220101113111645638/

Linux PCI/PCI-E设备配置空间读取与修改【轉】

【原文鏈接】

Linux PCI/PCI-E设备配置空间读取与修改

【原文摘錄】

1 前言

PCI和PCI Express,是计算机常使用的一种高速总线。操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及PCI-E配置空间。PCI/PCI-E设备的正常运行,离不开PCI/PCI-E配置空间。
通过读写PCI/PCI-E配置空间,可以更改设备运行参数,优化设备运行。本文介绍用户空间可以读取、修改、扫描PCI/PCIE设备的用户命令及使用。

在Linux内核中,为PCI和PCI-E只适用了一种总线PCI(内核提供的总线系统),故访问PCI-E配置空间,也包括了PCI设备配置空间。

 

2 PCI-E设备配置空间读取

读取PCI-E设备配置空间的命令是lspci

NAME

lspci – list all PCI devices

 

SYNOPSIS

lspci [options]

 

详细命令参数,可以使用man lspci来查看,这里我们只介绍常用参数。

命令默认输出结果是,当前系统的所有PCI/PCI-E设备。

[root@localhost ~]# lspci

00:00.0 Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)

00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 13)

00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 13)

00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 13)

00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 13)

00:10.0 PIC: Intel Corporation 5520/5500/X58 Physical and Link Layer Registers Port 0 (rev 13)

00:10.1 PIC: Intel Corporation 5520/5500/X58 Routing and Protocol Layer Registers Port 0 (rev 13)

00:11.0 PIC: Intel Corporation 5520/5500 Physical and Link Layer Registers Port 1 (rev 13)

00:11.1 PIC: Intel Corporation 5520/5500 Routing & Protocol Layer Register Port 1 (rev 13)

00:13.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub I/OxAPIC Interrupt Controller (rev 13)

00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 13)

… …

01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)

04:00.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1068E PCI-Express Fusion-MPT SAS (rev 08)

05:00.0 VGA compatible controller: XGI Technology Inc. (eXtreme Graphics Innovation) Z9s/Z9m (XG21 core)

[root@localhost ~]#

 

常用参数:

-v 显示设备的详细信息。

-vv 显示设备更详细的信息。

-vvv 显示设备所有可解析的信息。

-x 以16进制显示配置空间的前64字节,或者CardBus桥的前128字节。

-xxx 以16进制显示整个PCI配置空间(256字节)。

-xxxx 以16进制显示整个PCI-E配置空间(4096字节)。

-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]:

显示指定设备。

示例:

[root@localhost ~]# lspci -vvvxxxx -s 00:14.0

00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 13) (prog-if 00 [8259])

    Subsystem: Unknown device 00e5:0008

    Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B-

    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR-

    Capabilities: [40] Express Unknown type IRQ 0

        Device: Supported: MaxPayload 128 bytes, PhantFunc 0, ExtTag-

        Device: Latency L0s <64ns, L1 <1us

        Device: Errors: Correctable- Non-Fatal- Fatal- Unsupported-

        Device: RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-

        Device: MaxPayload 128 bytes, MaxReadReq 128 bytes

        Link: Supported Speed unknown, Width x0, ASPM L0s, Port 0

        Link: Latency L0s unlimited, L1 unlimited

        Link: ASPM Disabled CommClk- ExtSynch-

        Link: Speed unknown, Width x0

00: 86 80 2e 34 00 00 10 00 13 00 00 08 10 00 80 00

10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

20: 00 00 00 00 00 00 00 00 00 00 00 00 e5 00 08 00

… …

fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

 

当我们用老版本的Linux系统在新平台上运行时,会发现lspci命令结果很多值为unknown。lspci显示的设备名称如”Host bridge: Intel Corporation 5500 I/O Hub to ESI Port (rev 13)“,实际上从文件/usr/share/hwdata/pci.ids进行匹配的,PCI-E配置空间并没有类似Intel这样的字符串。出现Unknown设备时,我们可以更新pci.ids文件。

pci.ids文件下载地址为:

http://pciids.sourceforge.net/

下载后,直接覆盖/usr/share/hwdata/pci.ids文件即可。

 

3 PCI-E设备配置空间修改

修改PCIE配置空间的命令为:setpci

NAME

setpci – configure PCI devices

 

SYNOPSIS

setpci [options] devices

 

对于setpci命令来说,主要的参数如下:

-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]

 

就是我们要指定设备,然后修改其配置空间。常用命令格式和参数如下:

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.B=NEWVALUE

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.W=NEWVALUE

setpci -s BUSID:DEVID.FUNCID REGISTEROFFSET.L=NEWVALUE

 

如:

setpci -s 0:14.0 60.B=6

是将设备0:14.0设备,PCI配置空间便宜量为0x60,写入新的字节值为6。查看PCI配置空间修改是否生效,可以通过lspci命令来查看,如设置0:14.0后,读取命令为lspci –s 0:14.0 –xxx。

 

4 扫描PCI设备

扫描或探测PCI/PCI-E设备的命令为:scanpci

NAME

scanpci – scan/probe PCI buses

 

SYNOPSIS

scanpci [-v12OfV]

 

参数:

-v 打印所有设备的配置空间信息。

-1 使用PCI配置Type 1。

-2 使用PCI配置Type 2。

-f 与-1或-2参数结合,强制使用某种类型。

-O:使用OS的PCI配置空间访问方式访问。

几种方法来实现scp拷贝时无需输入密码【轉】

【原文鏈接】

http://blog.csdn.net/nfer_zhuang/article/details/42646849

【原文摘錄】

前言

我在工作中经常要将一些文件传输到另外一个服务器上,而且都是Linux的命令行环境,那么对于我来讲scp就是最直接有效的方法了,其他诸如FTP、SMB以及Winscp这些有界面的文件传输工具到反而有些多余了。

使用过scp的都知道需要指定远端服务器的帐号并手动输入密码,那么如何避免每次都需要输入密码这个操作呢?下面就给出两种方案进行解决。

方法一:建立SSH的信任关系

在这里先介绍两个概念:SSH公钥(~/.ssh/id_rsa.pub)和公钥授权文件(~/.ssh/authorized_keys),这两个文件的作用具体可以参考ssh的man手册:

 ~/.ssh/id_rsa.pub
Contains the public key for authentication.  These files are not sensitive and can (but need not) be readable by anyone.

~/.ssh/authorized_keys
Lists the public keys (DSA/ECDSA/RSA) that can be used for logging in as this user.  The format of this file is described in the sshd(8) manual page.  This file is not highly sensitive, but the recommended permissions are read/write for the user, and not accessible by others.

从描述中我们可以知道,~/.ssh/id_rsa.pub文件中包含了认证的公钥信息,而且该文件可以被任何人读取;而~/.ssh/authorized_keys文件中则列举了登录用户的公钥信息(换句话说就是使用这些公钥信息可以登录当前设备),而为了安全考虑,该文件一般建议只有本用户可以有读写权限。

公钥和私钥

提到公钥对应的就会有私钥,在谈这两个概念之前我们先了解另外一组概念:加密认证

  • 加密是对数据进行处理,添加保护信息,如果非法用户得到被加密过的数据,也无法获取到原始的有效数据内容,所以加密的重点在于数据的安全性。
  • 认证是对数据进行处理,添加鉴权信息,如果在传输的过程中被非法篡改,接收方就会校验失败并丢弃该非法数据,所以认证的重点在于数据的合法性。

上面是从业务概念来上描述了加密和认证的区别,但是从具体技术实现上,认证使用的是加密中的非对称加密算法来实现鉴权和认证的操作。

  • 对称加密算法在加密和解密时使用的是同一个秘钥;
  • 非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

下面就分别描述一下,采用非对称算法(即使用公钥和私钥)的加密和认证各自的过程。

基于公钥和私钥的加密过程

有两个用户Alice和Bob,Alice想把一段数据加密后发送给Bob(注意这里强调的是数据的安全性),那么如何保证除了Bob之外的人即使窃取了数据也无法解密得到原始的数据?基于公钥和私钥的加密可以完成这个需求,具体流程如下:

  1. Bob将他的公钥发送给Alice
  2. Alice用Bob的公钥加密需要传输的数据然后发送给Bob
  3. Bob用他的私钥解密Alice的消息

基于公钥和私钥的认证过程

还是Alice和Bob,Alice想把一段数据发送给Bob(注意这里并不强调数据的安全性),当Bob收到数据时如何判断该数据确实是Alic发送的且传输过程中没有被篡改?基于公钥和私钥的认证可以完成这个需求,具体流程如下:

  1. Alice用她的私钥对数据加密(或者对于数据的哈希值进行加密作为签名)
  2. Alice将加密后的数据(或者明文数据+签名)发送给Bob
  3. Bob用Alice的公钥解密数据(或校验签名),如果解密(校验)成功则可以保证数据的发送方肯定是Alice

基于公钥和私钥的信任关系

了解了公钥/私钥以及加密/认证这些概念后,我们就可以在scp中使用公钥/私钥来建立一个信任关系,从而在数据传输时完成自动认证而无需输入密码。

  1. User在A主机将SCP请求使用自己的私钥进行加密,然后传输给B主机
  2. B主机在收到SCP请求时,使用User的公钥进行解密
  3. 如果解密成功,则表示该请求确实是User发送的请求,则允许操作;如果解密失败,则表示该请求无效,直接丢弃

所以这里的需要做的就是:

  • User在A主机上需要创建一个公私钥对
  • 在B主机上,将User在A主机的公钥加入到ssh的信任公钥列表中(即公钥授权文件)

创建公私钥对

在Linux上使用ssh-keygen工具来生成公私钥对,在man手册中关于ssh-keygen工具的说明如下:

ssh-keygen : authentication key generation, management and conversion
-t    type
Specifies the type    of key to create.  The possible    values are ‘rsa1’ for protocol version 1 and ‘dsa’, ‘ecdsa’, ‘ed25519’, or ‘rsa’ for protocol version 2.

在上面提到了ssh-keygen支持rsa1、dsa、ecdsa、ed25519和rsa这几种非对称加密算法,其中最常用的就是RSA和DSA,比如使用RSA算法来生成公私钥对的过程如下:

[plain] view plain copy

  1. nfer@nfer-VirtualBox:~$ ssh-keygen -t rsa
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/home/nfer/.ssh/id_rsa):
  4. Created directory ‘/home/nfer/.ssh’.
  5. Enter passphrase (empty for no passphrase):
  6. Enter same passphrase again:
  7. Your identification has been saved in /home/nfer/.ssh/id_rsa.
  8. Your public key has been saved in /home/nfer/.ssh/id_rsa.pub.
  9. The key fingerprint is:
  10. 16:77:45:71:31:7c:67:4f:91:09:07:74:4d:30:83:48 nfer@nfer-VirtualBox
  11. The key’s randomart image is:
  12. +–[ RSA 2048]—-+
  13. |         .E..*@XO|
  14. |          . ..oBB|
  15. |        . . .  o+|
  16. |         o .    .|
  17. |        S        |
  18. |       .         |
  19. |                 |
  20. |                 |
  21. |                 |
  22. +—————–+
  23. nfer@nfer-VirtualBox:~$

注意上面有三处需要输入信息,分别是:

  1. 存储公私钥的文件夹位置,如果不输入,则默认为~/.ssh/,文件名则默认是id_rsa和id_rsa.pub
  2. 使用该公私钥时是否需要密码,如果不输入则表示不需要密码
  3. 再次确认是否需要密码

将User在A主机的公钥加入到ssh的信任公钥列表中

将刚才创建的~/.ssh/id_rsa.pub文件中的内容拷贝添加到B主机上的~/.ssh/authorized_keys文件中(如果没有则创建一个),这个时候就建立了一条A–>B的信任关系。注意这个信任关系是有方向性的,如果要建立从B–>A的信任关系,则操作步骤和上面的类似,只不过要反过来。

建立好信任关系后,这个时候使用任何ssh相关的工具则都无需输入远端的登陆密码(如果在创建公私钥对时输入了密码,那么这个时候还需要输入这个密码才能使用公私钥对)。

方法二:使用sshpass工具来自动输入密码

其实上面的建立信任关系的做法是最方便和安全的做法,但是在有些场景下(比如远端的authorized_keys是不能随意更改的),那么这个时候我们就可以借助sshpass这个第三方工具来完成ssh连接时的密码输入。先看一下sshpass的man手册中是如何描述的:

       sshpass – noninteractive ssh password provider

从描述上就可以清晰的了解到,sshpass的设计就是为了使用非交互的场景下输入ssh连接的密码。

sshpass的使用比较简单,先看一下帮助文档:

nfer@nfer-VirtualBox:~$ sshpass
Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
-f filename   Take password to use from file
-d number     Use number as file descriptor for getting password
-p password   Provide password as argument (security unwise)
-e            Password is passed as env-var “SSHPASS”
With no parameters – password will be taken from stdin

-h            Show help (this screen)
-V            Print version information
At most one of -f, -d, -p or -e should be used

其中-p是直接指定密码,-f是从文件中读取密码。那么一个使用sshpass的简单例子就是:

[plain] view plain copy

  1. sshpass -p nferzhuang scp a.txt nferzhuang@192.168.1.101:/home/nferzhuang/a.txt

使用sshpass的好处就是方便直接,无需了解公私钥、加密认证等相关知识,简单易懂;但是使用sshpass最大的坏处就是再使用时会涉及到明文密码,大大降低了安全性。

方法三:使用expect脚本来自动输入密码

expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。

下面就是一个使用expect来完成scp时无需输入密码的脚本:

[plain] view plain copy

  1. #!/usr/bin/expect
  2. set timeout 10
  3. set host [lindex $argv 0]
  4. set username [lindex $argv 1]
  5. set password [lindex $argv 2]
  6. set src_file [lindex $argv 3]
  7. set dest_file [lindex $argv 4]
  8. spawn scp $src_file $username@$host:$dest_file
  9.  expect {
  10.  “(yes/no)?”
  11.   {
  12.     send “yes\n”
  13.     expect “*assword:” { send “$password\n”}
  14.   }
  15.  “*assword:”
  16.   {
  17.     send “$password\n”
  18.   }
  19. }
  20. expect “100%”
  21. expect eof

注意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。

从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:

[plain] view plain copy

  1. ./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file

以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.75.130中的/root下,同时还将这个源文件重命名为dest_file。

spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。

使用expect需要了解的一点是:用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行,没有ssh密钥登录的快速。

注:关于expect部分详细请参考《shell结合expect写的批量scp脚本工具

总结

在本文中提供了三种方法来实现scp的时候无需输入密码的需求,从安全性和速度上考虑建立信任关系都是最佳的方法,至于在具体的环境中选择什么则由你自己来决定。

C语言端序【轉】

【原文鏈接】

http://blog.csdn.net/jixingzhong/article/details/1486110

【原文摘錄】

Endianism,端序,是指用来存储数据的方法,它定义了数据类型对字节进行寻址的方式。

两种端序方式:
1、Little-endian,小端序,是将低位字节存储在内存偏移地址较低的地址中,将高位字节存储在内存偏移地址较高的地址中;
2、Big-endian,大端序,则是将低位字节存储在内存偏移地址较高的地址中,将高位字节存储在内存偏移地址较低的地址中。

比如:
0x12345678 在 big-endian 系统上的布局
内存偏移量     0     1     2     3
内存内容       0x12     0x34     0x56     0x78

0x12345678 在 little-endian 系统上的布局
内存偏移量     0     1     2     3
内存内容     0x78     0x56     0x34     0x12

机器大小端和环境相关,可以使用下面的办法判断机器的大小端:
#include <cstdlib>
#include <iostream>

using namespace std;

union test
{
int i;
char c;
};

int main()
{
union test t;
t.i = 0x12345678;
if(t.c == 0x78)
cout<<“Little-endism”<<endl;
else
cout<<“Big-endism”<<endl;
system(“pause”);
return 0;
}

在获悉环境的大小端后,就可以进行细致的分析了,
比如 Little-endlism 环境下:
#include <cstdlib>
#include <iostream>

using namespace std;

union test
{
int i;
char c;
};

int main()
{
union test t;
t.i = 0x12345678;
short int x= *((short int *)(&(t.c)));
cout<<hex<<x;
system(“pause”);
return 0;
}

0x12345678 在 little-endian 系统上的布局
内存偏移量     0     1     2     3
内存内容     0x78     0x56     0x34     0x12

short int 为2字节(32位平台下)
将访问:
内存偏移量     0     1
内存内容     0x78     0x56
所以, 最后的结果为 (0x)5678

Endianism 在以下情况中非常重要:
1.使用位掩码时
2.对象的间接指针地址部分

合理使用联合体、位域等手段,可以在一定程度避免端序问题。

Ubuntu下Shell快捷键操作大集合及部分Bash使用技巧【轉】

【原文鏈接】

http://blog.csdn.net/xiaoxiaoyu1107/article/details/39376209

【原文內容】

本人收集整理了一些bash或其他shell中常用的快捷键,使用技巧以及ubuntu中一些常用操作的快捷键,希望大家能从中受益,提高工作效率。

使用“!”从历史中执行命令      有时候,我们需要在Bash 中重复执行先前的命令。你当然可以使用上方向键来查看之前曾经运行过的命令。但这里有一些更好的方式:
1) !!
:重复执行上一条指令
2) !a
:重复执行上一条以a为首的指令
3) !number
:重复执行上一条在history表中记录号码为number的指令
4) !-number
:重复执行前第number条指令
5) !$
:表示获得上一条命令中的最后一项内容
6)
Ctrl +r 组合键来进入历史搜索模式在history表中查询某条过往指令,找到需要      重复执行的命令后,按回车键即可

重复命令参数(即上一点中的第5条)    先来看一个例子: mkdir/exampledir    cd !$ 本例中,第一行命令将创建一个目录,而第二行的命令则转到刚创建的目录。这里,“!$”的作用就是重复前一个命令的参数。事实上,不仅是命令的参数可以重复,命令的选项同样可以。另外,Esc + . 快捷键可以切换这些命令参数或选项。

用于编辑的快捷键

Ctrl + a:将光标定位到命令的开头

Ctrl + e:与上一个快捷键相反,将光标定位到命令的结尾

Ctrl + u:剪切光标之前的内容

Ctrl + k:与上一个快捷键相反,剪切光标之后的内容

Ctrl + y:粘贴Ctrl + uCtrl + k所剪切的内容

Ctrl + t:交换光标之前两个字符的顺序

Ctrl + w:删除光标左边的参数(选项)或内容

Ctrl + l:清屏

Ctrl + d:输入已结束。在shell下相当于一个exit

Ctrl + c:键盘中断请求。

Ctrl + s & Ctrl + q:暂停/恢复屏幕输出

Ctrl + n(↓):显示下一条命令

Ctrl + p(↑):显示上一条命令

Ctrl + b:向回移动

Ctrl + f: 向前移动

Ctrl + shift +↓:终端向下滚动

Ctrl + shift +↑:终端向上滚动

Shift+pgup/pgdown:终端上下翻页滚动

处理作业      首先,使用 Ctrl+ z 快捷键可以让正在执行的命令挂起。如果要让该进程在后台执行,那么可以执行 bg 命令。而 fg 命令则可以让该进程重新回到前台来。使用 jobs 命令能够查看到哪些进程在后台执行。 你也可以在 fg bg 命令中使用作业 id,如: fg %3 又如: bg%7

使用置换

命令置换先看例子: du -h -a -c $(find . -name *.conf2>&-) 注意 $() 中的部分,这将告诉 Bash 运行 find 命令,然后把返回的结果作为 du 的参数。

进程置换仍然先看例子: diff <(ps axo comm) <(sshuser@host ps axo comm) 该命令将比较本地系统和远程系统中正在运行的进程。请注意 <() 中的部分。

xargs 看例: find . -name *.conf -print0 | xargs-0 grep -l -Z mem_limit | xargs -0 -i cp {} {}.bak 该命令将备份当前目录中的所有.conf 文件。

使用管道     下面是一个简单的使用管道的例子: psaux | grep init 这里,“|”操作符将 ps aux 的输出重定向给 grep init。 下面还有两个稍微复杂点的例子: ps aux | tee filename | grep init 及: psaux | tee -a filename | grep init

将标准输出保存为文件 你可以将命令的标准输出内容保存到一个文件中,举例如下: ps aux > filename 注意其中的“>”符号。 你也可以将这些输出内容追加到一个已存在的文件中: ps aux >> filename 你还可以分割一个较长的行: command1| command2 | … | commandN > tempfile1 cat tempfile1 | command1 |command2 | … | commandN > tempfile2

标准流:重定向与组合       重定向流的例子: psaux 2>&1 | grep init 这里的数字代表:

0stdin

1stdout

2sterr

上面的命令中,“grep init”不仅搜索“ps aux”的标准输出,而且搜索 sterr 输出。

Ubuntu中的一些常用的快捷键:

窗口管理

Win+E 显示所有桌面,方便的左右选择。
Ctrl + Alt + → / ← 
在不同工作台间切换
Ctrl + Alt + Shift + → / ← 
移动当前窗口到不同工作台
Alt + Shift+ ↑ 
以很酷的方式显示当前窗口
Ctrl + Alt + D 
显示桌面/恢复当前窗口
Alt+ Tab 
切换窗口
Alt + F4 
关闭窗口
Alt + F5 
取消最大化窗口 (恢复窗口原来的大小)
Alt + F7 
移动窗口 (: 在窗口最大化的状态下无效)
Alt + F8 
改变窗口大小 (: 在窗口最大化的状态下无效)
Alt + F9 
最小化窗口
Alt + F10 
最大化窗口
Alt + Space 
打开窗口的控制菜单 (点击窗口左上角图标出现的菜单)
Ctrl+Alt+F7 
返回桌面

文件浏览器Nautilus

Shift+Ctrl+N 新建文件夹, 很有用
Alt + Enter 
查看选择文件/文件夹的属性,代替单击右键选择属性
Ctrl + 1/2 
改变文件夹视图查看方式,图标视图/列表视图
Ctrl + W 
关闭当前Nautilus标签
Ctrl + Shift + W 
关闭所有Nautilus标签
Ctrl+T 
Nautilus中新建一个标签
Ctrl+Page Up 
上一个标签
Ctrl+Page Down 
下一个标签
Alt + ↑/↓ 
移动到父文件夹/选择的文件夹
Alt + → / ← 
后退/前进
Alt + Home 
直接移动到主文件夹
Alt+N 
切换到第N个标签(N为数字)
F9 
开关显示隐藏Nautilus侧边栏
Ctrl + H 
开关显示隐藏文件夹

应用程序中的常用快捷键

Ctrl+N 新建窗口
Ctrl+X 
剪切
Ctrl+C 
复制
Ctrl+V 
粘贴
Ctrl+Z 
撤销上一步操作
Ctrl+Shift+Z 
重做刚撤销的一步操作
Ctrl+S 
保存

其他

Ctrl + Alt + L 锁屏
Alt + F1 
打开应用程序菜单
Alt + F2 
打开运行应用程序对话框
Win +
鼠标滚轮 放大/缩小屏幕
PrintScreen 
全屏截图
Alt + PrintScreen 
当前窗口截图
Ctrl+Alt+Shift+Fn 
终端N或模拟终端N(nN为数字16)

cscope和ctags添加头文件的索引,查看系统库函数【轉】

【原文鏈接】

http://blog.csdn.net/qq_21544879/article/details/51957133

【部分原文】

写C语言代码的时候,有时候希望能查看系统库函数,比如memcpy是怎么实现的。
解决方法:

sudo vi /etc/bash.bashrc   

写入:

alias mkcscopefile='find `pwd` -name "*.[ch]" -o -name "*.cpp" > cscope.files'  
alias mktag='ctags -R;cscope -bRq'    

保存退出
运行:source /etc/bash.bashrc
接下来,利用 mkcscopefile 和mktag就可以生成索引文件了
我们进入c语言的头文件目录生成索引,在项目中加入索引就可以了在我们的代码中跳转到系统库函数了。

cd /usr/include
mkcscopefile && mktag
//生成索引文件

用vim打开我们自己的项目,如果需要查看库函数时,在命令模式输入cs add /usr/include 就可以了。
加入库函数索引前:
这里写图片描述

加入库函数
这里写图片描述

定位到printf, 按下ctrl+], 返回可以按ctrl+t
成功跳转到库函数
这里写图片描述

这里写图片描述

Vim无插件实现Markdown文件实时预览【轉】

【原文鏈接】

http://blog.csdn.net/demorngel/article/details/72631234

【原文內容】

之前的文章Vim插件之vim-instant-markdown曾提到Vim实时预览Markdown文件的方法,不过这个方法有个小缺点,就是依赖不是很好处理–Node.jsnpm在很多发行版(系统)并没有默认安装,有的发行版(系统)上甚至没有这个包,因此下面介绍一种Vim不需要任何插件就能实时预览Markdown文件的方法,而且它还是跨平台的。
首先,需要安装Firefox,Windows用户在安装完Firefox以后还需要将它添加到环境变量中,如下图
这里写图片描述

之后继续安装Markdown ViewerAuto Reload这两个插件并重启Firefox,这里没有选用Chrome是因为Chrome上预览Markdown的插件都存在一个问题–不能正确的显示表格,内容都连在一起了,最后在vimrc中写入

"按<F4>使用Firefox预览文件
nmap <F4> :call Preview()<CR>
func! Preview()
    if &filetype == 'markdown' || $filetype == 'md'
        exec "!firefox %"
    endif
endfunc

这样,当你在Vim中打开Markdown文件并按一次以后就会自动打开Firefox预览窗口,每次保存文件时,Firefox就会自动更新预览页面的内容。

从Linux内核映像中提取内核配置文件【轉】

【原文鏈接】

http://blog.163.com/ljf_gzhu/blog/static/131553440201052004637808/

【原文內容】

如果你是一个喜欢编译内核的狂人,同时也是经常忘记将默认的.config文件备份的懒家伙,那么下面的方法将会使你

的内核配置工作变得更轻松,从linux 2.6开始内核提供了一种将.config附加到映像文件的方法,通过这种方法,内核

配置者可以不必备份当前的.config文件,而是在需要的时候直接从内核映像中提取.config文件。步骤如下:

1. 配置内核

1.1 make menuconfig;

1.2 选择如下:

General setup  —>

<*> Kernel .config support

[*]   Enable access to .config through /proc/config.gz

1.3 make uImage

2.  提取配置文件

2.1 方法一,从uImage文件中提取:

2.1.1 打开控制台,cd进入到linux源码树根目录,我的为:/root/Desktop/easy2440/linux-2.6.30.9-easy2440

2.1.2 输入如下命令:scripts/extract-ikconfig arch/arm/boot/uImage > config

2.1.3 命令执行完后,将会在linux源码树根目录下面生成config文件;

2.1.4 config文件即为我们需要的内核配置文件,可以将其替代.config文件。

2.2 方法二,从开发板的/proc/config.gz中提取:

2.2.1 将新生成的uImage文件下载到开发板;

2.2.2 准备串口控制台,启动开发板;

2.2.3 开发板正常启动后,在控制台输入命令:cat /proc/config.gz | gzip -d > /home/config

2.2.4 命令执行完后,将会在/home目录下生成config文件

2.2.5 config文件即为我们需要的内核配置文件,可以将其替代.config文件。