文章列表
 
您正在查看 "linux学习" 分类下的文章

2008-04-15 11:31
#!/bin/sh
# \
exec expect -- "$0" ${1+"$@"}
exp_version -exit 5.0
if {$argc!=2} {
    send_user "usage: remote-exec command password\n"
    send_user "Eg. remote-exec \"ssh user@host ls\\; echo done\" password\n"
    send_user "or: remote-exec \"scp /local-file user@host:/remote-file\" password\n"
    send_user "or: remote-exec \"scp user@host:/remote-file local-file\" password\n"
    send_user "or: remote-exec \"rsync --rsh=ssh /local-file user@host:/remote-file\" password\n"
    send_user "Caution: command should be quoted.\n"
    exit
}
set cmd [lindex $argv 0]
set password [lindex $argv 1]
eval spawn $cmd
set timeout 30
while {1} {
    expect -re "Are you sure you want to continue connecting (yes/no)?" {
            # First connect, no public key in ~/.ssh/known_hosts
            send "yes\r"
        } -re "assword:" {
            # Already has public key in ~/.ssh/known_hosts
            send "$password\r"
        } -re "Permission denied, please try again." {
            # Password not correct
            exit
        } -re "kB/s|MB/s" {
            # User equivalence already established, no password is necessary
            set timeout -1
        } -re "file list ..." {
            # rsync started
            set timeout -1
        } -re "bind: Address already in use" {
            # For local or remote port forwarding
            set timeout -1
        } -re "Is a directory|No such file or directory" {
            exit
        } -re "Connection refused" {
            exit
        } timeout {
            exit
        } eof {
            exit
        }
}
 
2007-12-21 18:29

1. 进制转换 :

计算机表示数制的英文字母:
1. 十进制 D (decimal)
2. 二进制 B (binary)
3. 八进制 O (octal)
4. 十六进制 H (hexadecimal)

2. 安装 bc 软件

# rpm -ivh bc-1.06-8.i386.rpm

3. 进制转换

ibase和obase是bc使用的变量,其中ibase表示输入数字的进制,而obase表示输出数字的进制

八进制转换二进制

$ echo "ibase=8;obase=2;666" | bc
110110110

二进制 转换 八进制

$ echo "ibase=2;obase=8;000010110" | bc
26

十六进制 转换 十进制
$ echo "ibase=16;B" | bc
11

十六进制 转换 二进制
$ echo "ibase=16;obase=2;35BF" | bc
11010110111111

bc内部默认使用10进制

$ echo "ibase=2;11010110111111" | bc
13759
$ echo "obase=16;13759" | bc
35BF

2. 运算 :
$ bc << eof
> scale=3
> (11+9)/3
> eof
6.666

$ echo "scale=3;(11+9)/3" | bc
6.666

$ s=4;a=11;b=9;echo "scale=$s;($a+$b)/3" | bc
6.6666

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=3
11+9/3
14.000
(11+9)*3
60
quit
$

 
2007-01-16 13:33

SSH不输入密码连接远程Linux主机

机 理:公/私密钥验证。公钥(public key)用于加密,私钥(private key)用于对使用其匹配的公钥加密的数据进行解密。在本地机器生成一个密钥对,把公钥放到远程主机,然后从本地机器发起ssh连接,远程主机的sshd 产生一个随机数并用此公钥进行加密后发给本地机器,本地机器使用私钥进行解密并将结果发回,远程主机验证结果无误后准予登陆。

步骤:
注:密钥需要与远程Linux主机上的SSH系统相匹配。openSSH是Linux上默认的SSH系统,因此这里的内容只适用于openSSH。
1. 生成密钥对。
(1)Linux
$ ssh-keygen -t rsa
这 个命令生成一个密钥对:id_rsa和id_rsa.pub。他们默认被保存在~/.ssh/目录下。可以将id_rsa.pub改名为 local_rsa.pub以免与远程主机上的id_rsa.pub重名。在生成过程中会要求输入pass phrase,这个是用来保护私钥的使用的,即每次你使用私钥的时候需要先输入这个密码,因此这里不要输入任何字符,直接回车。
(2)Windows + putty
需 要用putty-gen.exe来生成密钥。运行putty-gen.exe后,点击“Generate”按钮生成密钥,点击“Save private key”保存putty可以使用的密钥,如test.ppk。pass phrase的部分同前。在“Public key for passing into openSSH authorized_keys file”一行下面的文本框中就是公钥的内容,将该内容拷贝到一个空白的文本文件,保存文件,如test.pub。

2. 上传公钥。
将生成的公钥,如test.pub,上传到远程主机的~/.ssh目录下,将test.pub的内容附加到authorized_keys文件末尾。

3. 远程主机SSH的设置
authorized_keys必须只有所有者才能访问:
$ chmod go-rwx ~/.ssh/authorized_keys
另外,为了不在每次发起连接时输入pass phrase:
$ ssh-agent $SHELL
$ ssh-add
(注:这个是参照MPICH的SSH设置,我还不确定如果不使用MPICH的话这个是不是必需的。)

4. 连接
(1)Linux
在Linux终端下,直接输入ssh remote_machine_name然后即可发起ssh连接,远程系统将进行公钥认证。
(2)Windows + putty
在session的auth选项中,选择前面步骤中生成的私钥文件,然后点击“open”。在要求输入用户名时,输入用户名。

常见应用举例:
1。 在A上以用户rootSSH到B上作为普通用户user而不是root,因为为了安全,有时不需要作为root,只需要作为普通用户不需要密码以完成相应工作即可。

登录作为root在A上
A# scp /root/.ssh/identity.pub href="mailto:user@B:/home/user/.ssh/authorized_keys">user@B:/home/user/.ssh/authorized_keys

2. tar一批文件从A到B。
A# tar cvf - /etc | ( ssh B tar xvf -)

3. 运行A上的cronjob,对某文件作改动后传到B
0 1 * * * cat /etc/shadow | awk -F: '{print $1":"$2}' | (ssh B 'cat >/home/passwd')

常见问题:
1。 这种方式的SSH需要B上的sshd_config中允许直接的root login (PermitRootLoginyes).
2. 我有服务器A和其它服务器B,C,D。我想从ASSH到这些服务器但不要自动,最好输入RSA passphase,但太麻烦,怎么办?
a. 要A上运行ssh-keygen时输入passphase字。
b. 要登录到A上后运行A#ssh-agent bash
c. 再运行ssh-add加passphase进入内存
d. 再运行ssh B or SSH C or SSH D,则不再需要密码,密码对只需输一次

e. 最后退出shell前输入ssh-agent -k 。
 
2007-01-05 14:26

Sort命令

    sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。

  Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。

  语法:sort [选项] 文件

  说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“-”,则表示排序容来自标准输入。

  sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。
  改变缺省设置的选项主要有:
  -m 若给定文件已排好序,合并文件。
  -c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。
  -u 对排序后认为相同的行只留其中一行。 
  -o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。
  改变缺省排序规则的选项主要有:
  -d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。
  -f 将小写字母与大写字母同等对待。
  -I 忽略非打印字符。 
  -M 作为月份比较:“JAN”<“FEB” 
  -r 按逆序输出排序结果。 
  +posl -pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。
  -b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。
  -t separator 指定字符separator作为字段分隔符。

  下面通过几个例子来讲述sort的使用。
  用sort命令对text文件中各行排序后输出其结果。请注意,在原文件的第二、三行上的第一个单词完全相同,该命令将从它们的第二个单词vegetables与fruit的首字符处继续进行比较。
  $ cat text
  vegetable soup
  fresh vegetables
  fresh fruit 
  lowfat milk 
  $ sort text
  fresh fruit
  fresh vegetables
  lowfat milk
  vegetable soup
  用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result的文件中。
  $ sort text>result 
  以第2个字段作为排序关键字对文件example的内容进行排序。
  $ sort +1-2 example
  对于file1和file2文件内容反向排序,结果放在outfile中,利用第2个字段的第一个字符作为排序关键字。
  $ sort -r -o outfile +1.0 -1.1 example 
  sort排序常用于在管道中与其他命令连用,组合完成比较复杂的功能,如利用管道将当前工作目录中的文件送给sort进行排序,排序关键字是第6个至第8个字段。
  $ ls -l | sort +5 -7
  sort命令也可以对标准输入进行操作。例如,如果您想把几个文件文本行合并,并对合并后的文本行进行排序,您可以首先用命令cat把多个文件合并,然后用管道操作把合并后的文本行输入给命令sort,sort命令将输出这些合并及排序后的文本行。在下的例子中,文件veglist与文件fruitlist的文本行经过合并与排序后被保存到文件clist中。
  $ cat veglist fruitlist | sort > clist 

uniq命令

  文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。
  语法:uniq [选项] 文件 
  说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“-”表示,则从准输入读取。
  该命令各选项含义如下:
  -c 显示输出中,在每行行首加上本行在文件中出现的次数。它可取代-u和-d选项。
  -d 只显示重复行。
  -u 只显示文件中不重复的各行。
  -n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
  +n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
  -f n 与-n相同,这里n是字段数。
  -s n 与+n相同,这里n是字符数。
  例如:
  1. 显示文件example中不重复的行。
  uniq -u example
  2. 显示文件example中不重复的行,从第2个字段的第2个字符开始做比较。
  uniq -u -1 +1 example 

 
2006-12-25 11:55

OPROFILE指南

1.概述:

     Oprofile是一个linux2.2/4/6版本,多种体系结构(X86家族的,如AMD64,只需要简单的导出一个变量就可以了)的性能检测工具,它可以对一个运行程序进行各方面的检测,从内核到库再到二进制文件,都可以以较低的开销在后台进行检测,并且它的优点是不用修改源程序。
     如果想对包括内核在内的都进行profile,则需要使用命令opcontrol –vmlinux=/boot/vmlinux-‘uname –r’,否则使用opcontrol –no-vmlinux。开始profile使用opcontrol –start,结束使用opcontrol –shutdown。
     Profile的结果会周期性的写入/var/lib/oprofile/samples目录下,opcontrol –shutdown或opcontrol –dump也会将结果写入那个目录中。如果想清空以前的记录,使用opcontrol –reset命令。
     为了得到整个系统的总体结果,运行命令 opreport。如果想得到细节的信息,运行命令opreport –l /boot/vmlinux-‘uname –r’

2.Opcontrol命令:

        Op_help:               列出所有支持的事件。
        Opcontrol:               设置需要收集的事件。
        Opreport:               对结果进行统计输出。
        Opannaotate:               产生带注释的源/汇编文件,源语言级的注释需要编译源文件时的支持。
        Opstack:               产生调用图profile,但要求x86/2.6的平台,并且linux2.6安装了call-graph patch
        Opgprof:               产生如gprof相似的结果。
        Oparchive:               将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
        Op_import:               将采样的数据库文件从另一种abi转化成本地格式。

3.Opcontrol命令的选项:

        --list-event:列出本处理器上所有支持的事件。
        --init:               加载oprofile模块,并初始化oprofile接口。
        --setup:               后边跟着要设置的事件名称,支持的事件名称在/root/.oprofile/daemonrc.中。(基本没什么用,可以通过传递一个参数来实现opcontrol –no-vmlinux)。
        --start-daemon:               启动daemon程序,这样可以使start时记录信息中除去启动daemon的那部分。(2.2/4内核不支持)
        --start:               开始数据的收集工作,收集的数据由setup指定,或者由/root/.oprofile/daemon中列出的事件指定。
        --dump:               强迫将数据flush到daemon。
        --stop:               停止数据收集。
        --shutdown:               停止数据收集,结束daemon程序。
        --reset:               清除当前会话中收集到的数据,但以前saved过的数据不清除。
        --save=session_name:               将当前会话的数据存入session_name名的会话中。
        --deinit:               关闭当前daemon,将oprofile模块移除。
        --list-events:               列出所有支持的事件和mask值。
        --help:               帮助信息。

下边是一些可选的信息项,必须是—no-vmlinux或—vmlinux选项的支持,这些信息存储在~/.oprofile/daemonrc中。

     --buffer-size=num:         内核buffer的sample的数目。
     --cpu-buffer-size=num:        每个cpu的buffer的sample的数目。
     --event=eventspec:        指定要收集的硬件参数。
     --separate=[none,lib,kernel,thread,cpu,all] :               指定是否将这些信息分别收集。
        --callgraph=#depth :               指定收集depth深度的调用信息。
        --image=image:               指定要对哪些image进行收集。
        --vmlinux=file:               内核image
        --no-vmlinux:        不收集内核信息。

Opcontrol   --event-list可以列出所有支持的事件,形式如下:
name:count:unitmask:kernel:user

     当处理器的性能检测寄存器溢出时,就会产生中断,这个是oprofile的运行的基础。然而由于所有处理器中的中断时间的发生和处理中断程序之间存在间隔,所以这些profile得到的结果并不是完全精确。每个处理器指针可以配置的参数包括:
        mask:指明要记录的时间。
        Val:指令计数开始的下限。(是从这时候开始吧)
        Kernel:记录内核态还是记录用户态的情况。
     参数的配置情况要求较高,如果配置的较高,则产生的中断数目较少,因此精度低。但如果配置的粒度较小,虽然精度高,但开销也变大。

RTC模式:

        由于一些处理器没有那些调试寄存器,所以它们唯一的时钟中断可以被捕获,因此这个支持所有的处理器。但由于在内核态时中断被关闭,所以RTC模式不能在内核态使用。由于时钟中断一般为2的幂次/s,所以一般设为2的幂数。如果设的不是,oprofile会自动将它设置为最接近的2的幂次。在2.6或更高的版本上,由于处理器没有调试寄存器,所以oprofile不能使用时钟中断,可以通过time=1模块或将启动命令行中的oprofile.time=1。
      在pentium4或exon处理器中有45个事件选择寄存器(ESCR),18个事件配置寄存器(CCCR),18个计数器,由于他们之间的错综复杂的关系,同时只能有上述寄存器中的8个可以互不相关的使用。由于没有进一步的精确事件(PEBS)为基础的支持,因此目前只能使用中断为基础的事件收集方法。但超线程技术目前还不支持。

Itanium2处理器中的pmu(performance monitor unit)所有的特性目前oprofile还不支持。如果将调试寄存器的值设置的过低,则可能会引起频繁的中断,使处理器忙于处理中断而无暇估计别的事件,此时整个处理器就会发生冻结的情况。在2.6以上的版本中,可以设置pid,pgrp参数来过滤所搜集的数据,具体使用方式为opcontrol –pid-filter=??或opcontrol –pgrp-filter。
        在oprofile停止之后的一小段事件内先不要unload模块,可能会引起危险。2.6内核或smp模块不支持unload模块。

统计结果输出:

        为了减小开销,统计的结果分为初始统计数据和最终输出结果两部分。进一步,初始统计数据不一定都在硬盘上存在,因此你必须显式的将数据刷入磁盘,具体使用opcontrol –dump命令。
        Opannotate命令用来输出带注释的源文件或汇编。如果在编译二进制文件时加入了-g选项,则可以生成带注释的源文件,否则只能生成带注释的汇编了。--source或—assembly用来指明是否是汇编文件。用—base-dir来指明文件的原本位置,用—search-dir来指明用来搜索的文件目录。
        Opstack输出调用图,它的显示意义还是看不懂。它仅在x86/linux结构下支持,其余的模式需要添加安装包。
        Gprof模式的输出,使用opgprof可以产生一个gmon.out文件,然后调用gprof –p来生成gprof类似的输出。
        Oparchive可以将目前的可执行文件,调试信息,prof文件等打包然后可以在另一台机器上进行分析。

对指定的任务进行profile,可以通过如下模式:opreport   name:value[,value]。Name一般为image,value指出你要进行profile的文件名。

Profile可以指定的参数包括:
        Session:指明session
        Session-exclude:指明排除的session
        Image:指明image
        Image-exclude
        Lib-image:
        Lib-image-exclude:
        Event:事件列表
        Count:计数器列表,指出当时profile时指明的事件count值。
        Cpu:指定要profile的cpu。
       Tgid:task gid,当per-process参数被指明时有用。
       Tid:thread gid,当per-process参数被指明时有用。
       Uint-mask:指明mask列表。
       --image-path:指明image的path。
       --merge:将以前separate的结果重新merge,以便得到统一的结果。

        Oprofile的限制:由于现代处理器的乱序执行,有些指令的执行事件不精确,尤其是循环中的最后一条指令,并且它的开销比较大的话几乎是不可靠的。Oprofile使用在中断处理函数中收集数据的方法,但在RTC时钟中断时中断被屏蔽,或itanium2中的可屏蔽中断中这些中断都不能得到及时的处理,因此这些也会对结果造成影响。对于有些idle时自动关闭的CPU来说,idle时的时钟就不能被正确的记录,因此需要在启动时加上idle=poll选项,使CPU在idle时调用poll_idle函数。    
        在2.6的实现中使用do_exit()内核函数退出的子程序不能被profile。 在profile kernel的过程中,由于启动时使用了initrd功能,所以oprofile不能正确定位内核模块的位置,因此需要你在使用oprofile时加上-p选项,告诉内核模块的位置。或者你通过insmod,modprob等方式增加了新模块之后,一定要通过-p选项来指明新模块的位置,以免profile去测试那些内核中的旧模块。调用图的解释中,首先要确保编译时没有使用 -fomit-frame-pointer 选项.

推荐一篇好文章: William E. Cohen, "Tuning Programs with OProfi le"

 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

debug hacks(中文版)里166页有一段脚本就是用来设置一些调试操作的。 脚本写在debu
 

tags.sh: line 22: cscope: command not found 这个是什么情况?
 

回复chy:我记得reverse.put.as 的作者写了个.gdbinit的脚本 很强大 你可以参考一
 

谢谢!写的不错,很受益。
 

大哥,应该加工已下呀,你这东西连主函数也没有,怎么看呀
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu