C 语言,求两个字符串 相同部分中的相同字符,如:S1:ASDSS,S2:DSA 则相同字符为ASD,不知道为代码什么老不正确?

java中怎样将字符串&asd12sa&倒序输出,输出也要是字符串的形式哦,求大师们指点_百度知道
java中怎样将字符串&asd12sa&倒序输出,输出也要是字符串的形式哦,求大师们指点
.print(s); i=str.for(int i.length-1 to 0;}System,1).substring(i;i--){
s += strString str = &&asd12sa&String s = &
其他类似问题
为您推荐:
其他8条回答
把字符串变成字符数组
char[] data= public static void main(String[] args)
data[i]=data[.length-1-i]=temp,输出也要是字符串的形式
* @param args
*//i&定义字符串
String str=&asd12sa&quot,是可以满足你的要求的;
/把字符数组转换成字符串
/倒序输出.println(str);i++)
char temppublic class Str { //&#47,已通过测试.toCharArray();打印出字符串
data[循环把字符数组里的字符两两调换位置
for(int i=0.length-1-i];2; }}自己运行试试.=(data.length-1)/
/asd12sa&quot.valueOf(data)!;
temp=data[i];/**
* 将字符串&
楼上的都是办法,不过干嘛不用java本身的api来实现呢,StringBuilder 类的reverse()方法可以很好地完成你的要求,如下:String s = &asd12sa&;StringBuilder sb =new StringBuilder(s);sb.reverse();System.out.println(sb.toString());
很简单,类String中有一个方法charAt(int index),这个方法的作用是返回指定索引处的 char 值,例如:
String str=&abcd& ;
str.charAt(0);//返回字母a.
那么这个题的解题思路是,我把这个字符串的长度放到一个字符串里面,然后通过类String的length()方法,取得该字符串的长度,然后用一个for循环,从后往前循环(就是先把后面的字符先加到字符串里面,这样就是取反的过程),把取得的每一个字符都加到一个字符串里面去就OK了,完整的程序如下:
public class ReverseString {
public static void main(String[] args) {
reverse(&asd12sa&);// 调用方法。
public static void reverse(String str) {//定义方法。
int length = str.length();// 取得字符串的长度。
String result = &...
String str = &asd12sa&;
//原始字符串 StringBuffer buff= new StringBuffer(str);
//得到StringBuffer//java.lang.StringBuffer类的reverse()方法可以将字符串反转System.out.println(buff.reverse().toString());
很简单啊,把这个字符串转换成StringBufer,然后通过reverse()方法,反转字符串,再把反转的字符串转换为Sting即可。StringBufer sb = new (&asd12sa&);sb = sb.reverse();String str = sb.toString();
String str = &asd12sa&;
for(int i=str.length()-1;i&=0;i--){
System.out.print(str.charAt(i));
我教你一个简单的办法:StringBuffer stb=new StringBuffer(&asd12sa&);stb.revers();//StringBuffer里的revers()方法,就是将字符串反转试试吧!
str = &asd12sa&;StringBuffer sbf = new
StringBuffer(str);
System.out.println(sbf.reverse());貌似就是这样的吧
字符串的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁DSA算法的理论,实现,以及在破解中的应用
安全中国网
  [第一部分: 理论篇]
  0. 前言
  我眼中的最有代表性的公匙密码算法 ECC,RSA,DSA。 其中前两种已经被国内众多
  Cracker界前辈高人详细的解释并实现,使我等初学者获益匪浅,其中尤为具代表性
  的两篇如:
  ●ECC加密算法入门介绍 [作者:zmworm/CCG]
  ●RSA与大数运算 [作者:afanty]
  更是使我受益良多。
  唯独DSA算法 由于各种原因鲜有相关文章 国内的共享软件也很少有使用这种加密算
  法进行注册验证的, 其实DSA算法有许多它自己独特的地方 它比ECC算法更加便于理
  解和实现, 比RSA产生密匙的速度快很多,且安全性与RSA不相上下 但是DSA的一个
  重要特点是两个素数(P,Q)公开,这样,当使用别人的p和q时,即使不知道私钥,你
  也能确认它们是否是随机产生的,还是作了手脚。RSA算法却作不到。
  我用了一个礼拜时间四处搜集资料 其中包括应用密码学一书中DSA算法章节 DSATool
  中的说明文件 看学学院中DSA算法的简单介绍 等诸多权威信息, 经过自己的整理,
  翻译,理解写出本文,文中少有复杂的数论知识,重在应用和实践,旨在起到一个抛
  砖引玉的作用 希望这套算法被更多人接受,理解,并得到广泛的应用。不足之处在所
  难免 希望各位高人能不吝赐教加以指点 :)
  // 为免译文不准确 部分段落引用英文原文 英文好的朋友可以自行参考
  1. General stuff / 常规资料
  In 1991 the Digital Signature Algorithm(DSA) has become the Digital
  Signature Standard(DSS). DSA is a public-key signature scheme that uses a
  pair of transformations to generate and verify a digital value called
  signature.
  DSA has been developed by the US National Security Agency(NSA) and can
  -not- be used for encryption or key distribution. DSA is some variant of
  the ElGamal signature algorithm and, as defined in the standard, uses the
  Secure Hash Algorithm(SHA/SHA-1) as one-way hash function.
  // Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种,被美国
  NIST(美国国家标准局)作为数字签名标准(DigitalSignature Standard)。同样属于
  公匙密码体系,并使用Secure Hash Algorithm(SHA/SHA-1)作为中间单向计算算法
  2. Parameters / 参数
  P = A prime number in range 512 to 1024 bits which must be a multiple of 64
  P = 一个范围在512至1024之间的素数 且必须为64的倍数
  Q = A 160 bit prime factor of P-1
  Q = P - 1的160bits的素因子
  G = H^((P-1)/Q) mod P. H is any number & P-1 such that H^((P-1)/Q) mod P & 1
  G = h^((p-1)/q) mod P,H 必须 & p - 1, h^((p-1)/q) mod p & 1
  X = A number & Q
  X = 小于Q的一个数
  Y = G^X mod P
  Parameters P, Q, G and Y are public where Y is the public key. X is the
  private key and must be kept secret! To obtain X from Y one needs to solve
  the Discrete Logarithm Problem which is virtually impossible for
  -properly- generated parameters of reasonable size.
  // 以上参数其中P, Q, G 以及 Y 为公匙, X为私匙必须保密!任何第三方用户想要从
  Y解密成X 都必须解决整数有限域离散对数难题
  3. Signing a message (M) / 签名部分
  To sign M, carry through the following steps:
  // 若需要对M进行数字签名 则需要进行下列运算:
  - Generate a -random- number K & Q. NEVER use same K twice or more to sign
  other messages!
  - 产生一个随机数 K (K & Q),,永远不要将同样的K用于进行其他的签名运算!
  - Compute R = (G^K mod P) mod Q
  - 计算 R = (G^K mod P) mod Q
  - Compute S = (K^-1*(SHA(M) + X*R)) mod Q
  - 计算 S = (K^-1*(SHA(M) + X*R)) mod Q
  The number pair (R,S) is the signature of M.
  // R以及S 为这次对M的数字签名结果
  4. Verifying a signature (R,S) of M / 验证部分
  - Compute W = S^-1 mod Q
  - 计算 W = S^-1 mod Q
  - Compute U1 = (SHA(M) * W) mod Q
  - 计算 U1 = (SHA(M) * W) mod Q
  - Compute U2 = (R*W) mod Q
  - 计算 U2 = (R*W) mod Q
  - Compute V = ((G^U1 * Y^U2) mod P) mod Q
  - 计算 V = ((G^U1 * Y^U2) mod P) mod Q
  If V == R the signature is verified.
  // 若v = r,则认为签名有效。
  5. DSA的安全性
  DSA主要依赖于整数有限域离散对数难题。素数 P 必须足够大,且p-1至少包含一个大
  素数因子以抵抗Pohlig & Hellman算法的攻击。M 一般都应采用信息的HASH值(官方推
  荐为SHA算法)。DSA的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对
  于p-1的大素数因子不可约。 个人观点DSA的安全性要次于ECC 与RSA不相上下。但是有
  一点, 就是DSA算法的验证过程 R,S 是以明文形式出现的, 这点很容易被利用,在
  第二篇中各位会体会到这一点。
  6. Cracker眼中的DSA
  DSA算法鲜有被用于国产共享软件的注册验证部分 即使在国外的共享软件中也远不如
  RSA,Blowfish等算法应用广泛。
  DSA算法在破解时 关键的参数就是X 根据 Y = G^X mod P 只要知道 P,G,Y,Q 且能
  分解出 X 就可以伪造R,S写出KeyGen了。
  ====================================================================================
  [第二部分: 签名篇]
  介绍完理论之后 我们来实践了解一下:
  目标: pDriLl's Crypto KeygenMe #4
  主要工具: C32Asm(感谢pll621/CCG 送给我Keyfile); Ollydbg1.09d;
  BigInt Calc Pro 1.2(感谢Stkman/CCG 送给我Keyfile)
  等等....
  先脱壳:用CoolDumper找到OEP是407952 然后使用 ImportREC1.6f 修复IAT表。
  用Ollydbg载入程序 下断点 BPX GetDigItem 断下后走到不远处:
   . LEA EBX,DWORD PTR SS:[EBP-104]
  004012AC . MOV DWORD PTR DS:[EBX],EAX
  004012AE . POP EBX
  004012AF . CMP DWORD PTR SS:[EBP-1D0],0 // 该不会连名字都不输入吧
   . JNZ SHORT Dumped4W.004012DE
   . PUSH 0
  004012BA . LEA EAX,DWORD PTR SS:[EBP-3C]
   . PUSH EAX
   . LEA EAX,DWORD PTR SS:[EBP-20]
   . PUSH EAX
   . LEA EAX,DWORD PTR SS:[EBP+8]
  004012CE . MOV EAX,DWORD PTR DS:[EAX]
   . PUSH EAX
   . LEA EAX,DWORD PTR DS:[4017BD]
   . PUSH EAX
   .-JMP DWORD PTR DS:[40E9A4] user32.MessageBoxA
  004012DE LEA EAX,DWORD PTR SS:[EBP-22C]
   . PUSH EAX
   . CALL Dumped4W. // 过了这个CALL, DB EAX 就看到:
   23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 #Eg壂惋芎榲T2
  See... MD5的常量, 不知道为什么 我一见到MD5就兴奋 对这个算法很有感情 :)
  MD5特点 - 单向不可逆 所以在这里不多说了 主要介绍DSA。
  004012EA . ADD ESP,4
  004012ED . MOV CL,BYTE PTR DS:[40E9C6] // 取Key的第6位
   . MOV BYTE PTR DS:[40E940],CL
   . MOV DL,BYTE PTR DS:[40E9CD] // 取Key的第14位
  004012FF . MOV BYTE PTR DS:[40E941],DL
   . MOV AL,BYTE PTR DS:[40E9D4] // 取Key的第21位
  //所以 Key 最少为21位, 重新输入注册信息, Name:LingDi Key:
  0040130A . MOV BYTE PTR DS:[40E942],AL
  0040130F . MOV DWORD PTR SS:[EBP-48],Dumped4W.0040E&; ASCII "12FHCF-YEAH!!"
   . MOV ECX,DWORD PTR SS:[EBP-104]
  0040131C . PUSH ECX
  0040131D . PUSH Dumped4W. ASCII "%d"
   . MOV EDX,DWORD PTR SS:[EBP-48]
   . PUSH EDX
   . CALL Dumped4W. // 将Key的位数连接到刚才取出的3个Key值后.
  0040132B . ADD ESP,0C
  0040132E . MOV DWORD PTR SS:[EBP-48],Dumped4W.0040E&; ASCII "FHCF-YEAH!!"
   . PUSH Dumped4W. ASCII "EGBE-YEAH!!"
  0040133A . PUSH Dumped4W. ASCII "%s"
  0040133F . MOV EAX,DWORD PTR SS:[EBP-48]
   . PUSH EAX
   . CALL Dumped4W. // 连接 EGBE-YEAH!!
  // DB 40e940看到如下结果
   34 31 32 37 45 47 42 45 2D 59 45 41 48 21 21 74127EGBE-YEAH!!
   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
   . ADD ESP,0C
  0040134B . MOV CL,BYTE PTR DS:[40E945]
   . ADD CL,1
   . MOV BYTE PTR DS:[40E945],CL
  0040135A . MOV DL,BYTE PTR DS:[40E946]
   . ADD DL,1
   . MOV BYTE PTR DS:[40E946],DL
   . MOV AL,BYTE PTR DS:[40E947]
  0040136E . ADD AL,1
   . MOV BYTE PTR DS:[40E947],AL
   . MOV CL,BYTE PTR DS:[40E948]
  0040137B . ADD CL,1
  0040137E . MOV BYTE PTR DS:[40E948],CL
至 0040137E 只不过是分别取 EGBE的ASCII值 并加1
  // 结果为 FHCF, 好像是个组织名 不过没在0DayFTP上看到过这个组织的Relase
   . MOV BYTE PTR DS:[40E950],0
  0040138B . PUSH 10
  0040138D . PUSH Dumped4W.
   . LEA EDX,DWORD PTR SS:[EBP-22C]
   . PUSH EDX // 啦啦啦~ 又看到MD5的四个常量了 你猜接下来要干吗?
   . CALL Dumped4W.
  0040139E . ADD ESP,0C
   . LEA EAX,DWORD PTR SS:[EBP-22C]
   . PUSH EAX
   . LEA ECX,DWORD PTR SS:[EBP-F0]
  004013AE . PUSH ECX
  004013AF . CALL Dumped4W.
   . ADD ESP,8
   . MOV EDX,DWORD PTR SS:[EBP-1CC]
  004013BD . PUSH EDX
  004013BE . LEA EAX,DWORD PTR SS:[EBP-F0]
   . PUSH EAX
  // EAX中保存"74127FHCF-YEAH!!"的MD5 Hash结果:AA6E429C590FEBAAE66643A
   AA 6E 42 9C 59 0F 85 79 E5 D5 1E BA AE 66 64 3A 猲B淵厃逭寒fd:
   . PUSH 10
   . CALL Dumped4W.
  004013CC . ADD ESP,0C
  004013CF . PUSH Dumped4W. ASCII "Bn6EN1dDFrupNxw1Wk4WO5=="
   . MOV ECX,DWORD PTR SS:[EBP-FC]
  004013DA . PUSH ECX
  004013DB . CALL Dumped4W.00405E80
  01CE2CA0 04 00 00 00 AC 2C CE 01 00 00 00 00 B9 63 E1 A4 ...??....筩幛
  01CE2CB0 55 C3 71 93 BA 6B 31 74 75 43 E8 67 00 00 00 00 U胵摵k1tuC鑗....
   . ADD ESP,8
   . MOV EDX,DWORD PTR SS:[EBP-1CC]
   . PUSH EDX
  004013EA . MOV EAX,DWORD PTR SS:[EBP-FC]
   . PUSH EAX
   . CALL Dumped4W.
  // 这个CALL用来比较Hash结果是否等于 67EBBAE163B9
   . ADD ESP,8
   . TEST EAX,EAX
  004013FB . JE SHORT Dumped4W.
  开始我怎么也弄不明白 Bn6EN1dDFrupNxw1Wk4WO5== 这个字符串是干什么用的,后来在学习一段
  Delphi源代码的时候才想起来 Base64 这个东西。上面一段代码的作用就是 对比 "74127FHCF-YEAH!!"
  的MD5 Hash结果:AA6E429C590FEBAAE66643A 是否等于 "Bn6EN1dDFrupNxw1Wk4WO5=="
  即 67EBBAE163B9, 不相等则提示 Hmmm.. you don't even pass the first threshold!!
  我们来考虑一下如何过这第一关, 过关条件是:
  "Key的第6位 + Key的第14位 + Key的第21位 + Key的位数 + FHCF-YEAH!!" 这段字符串的MD5结果必须
  等于67EBBAE163B9
  这就要靠猜了 稍微有点Cracker头脑的人 都会猜到注册码是 xxxxxx-xxxxxx-xxxxxx-xxxxxx 这种格式的 不然
  就必须编程穷举了。 相当于穷举5位密码的MD5值,穷举的速度也不慢 如果条件设置得当,理论上3分钟左右应该
  就可以得到结果 我是属于没有Cracker头脑的人 所以这种格式并不是我想到的 :(
  验证一下: MD5("---27FHCF-YEAH!!") = 67EBBAE163B9 验证通过。
  重新输入注册信息,进入下一阶段:
  Name: LingDi
  Key: 123-567
   . MOV EDI,Dumped4W. ASCII "123-567"
  0040144D . OR ECX,FFFFFFFF
   . XOR EAX,EAX
   . REPNE SCAS BYTE PTR ES:[EDI]
   . NOT ECX
   . ADD ECX,-1
   . CMP DWORD PTR SS:[EBP-100],ECX
  0040145F . JGE SHORT Dumped4W.
   . CMP DWORD PTR SS:[EBP-100],6
   . JNZ SHORT Dumped4W.
  0040146A . MOV EDX,DWORD PTR SS:[EBP-100]
   . ADD EDX,1
   . MOV DWORD PTR SS:[EBP-100],EDX
   & CMP DWORD PTR SS:[EBP-100],0D
   . JNZ SHORT Dumped4W.
   . MOV EAX,DWORD PTR SS:[EBP-100]
   . ADD EAX,1
  0040148B . MOV DWORD PTR SS:[EBP-100],EAX
   & CMP DWORD PTR SS:[EBP-100],14
   . JNZ SHORT Dumped4W.
  0040149A . MOV ECX,DWORD PTR SS:[EBP-100]
   . ADD ECX,1
   . MOV DWORD PTR SS:[EBP-100],ECX
   & MOV EDX,DWORD PTR SS:[EBP-108]
  004014AF . MOV EAX,DWORD PTR SS:[EBP-100]
   . MOV CL,BYTE PTR DS:[EAX+40E9C0]
  004014BB . MOV BYTE PTR DS:[EDX+40E940],CL
   . MOV EDX,DWORD PTR SS:[EBP-108]
   . ADD EDX,1
  004014CA . MOV DWORD PTR SS:[EBP-108],EDX
   .^JMP Dumped4W.
  //看结果就知道 以上是个循环 目地是去除Key中的 "-" 结果:
   32 33 34 35 36 38 39 30 31 32 33 35 36 37 38 5678
   30 32 33 34 35 36 37 00 00 00 00 00 00 00 00 ........
   & MOV EDI,Dumped4W. ASCII ""
   . OR ECX,FFFFFFFF
   . XOR EAX,EAX
  004014FA . REPNE SCAS BYTE PTR ES:[EDI]
  004014FC . NOT ECX
  004014FE . ADD ECX,-1
   . CMP DWORD PTR SS:[EBP-100],ECX
   . JGE SHORT Dumped4W.0040157C
   . MOV ECX,DWORD PTR SS:[EBP-100]
  0040150F . MOVSX EDX,BYTE PTR DS:[ECX+40E940]
   . CMP EDX,41
   . JL SHORT Dumped4W.0040152D
  0040151B . MOV EAX,DWORD PTR SS:[EBP-100]
   . MOVSX ECX,BYTE PTR DS:[EAX+40E940]
   . CMP ECX,46
  0040152B . JLE SHORT Dumped4W.
  0040152D & MOV EDX,DWORD PTR SS:[EBP-100]
   . MOVSX EAX,BYTE PTR DS:[EDX+40E940]
  0040153A . CMP EAX,30
  0040153D . JL SHORT Dumped4W.
  0040153F . MOV ECX,DWORD PTR SS:[EBP-100]
   . MOVSX EDX,BYTE PTR DS:[ECX+40E940]
  0040154C . CMP EDX,39
  0040154F . JLE SHORT Dumped4W.
   & PUSH 0
   . LEA EAX,DWORD PTR SS:[EBP-3C]
   . PUSH EAX
  0040155A . LEA EAX,DWORD PTR SS:[EBP-1C4]
   . PUSH EAX
   . LEA EAX,DWORD PTR SS:[EBP+8]
   . MOV EAX,DWORD PTR DS:[EAX]
   . PUSH EAX
  0040156A . LEA EAX,DWORD PTR DS:[4017BD]
   . PUSH EAX
   .-JMP DWORD PTR DS:[40E9A4] user32.MessageBoxA
  // 得到了 Key 的有效范围: 0~9 A~F
   . LEA ECX,DWORD PTR SS:[EBP-A4]
   . PUSH ECX
   . CALL Dumped4W. // 跟进这个CALL 会看到SHA算法的5个常量
/$Content$MOV EAX,DWORD PTR SS:[ESP+4]
|. XOR ECX,ECX
|. MOV DWORD PTR DS:[EAX],
  // 0040249C |. MOV DWORD PTR DS:[EAX+4],EFCDAB89
|. MOV DWORD PTR DS:[EAX+8],98BADCFE
  // 004024AA |. MOV DWORD PTR DS:[EAX+C],
|. MOV DWORD PTR DS:[EAX+10],C3D2E1F0
|. MOV DWORD PTR DS:[EAX+14],ECX
  // 004024BB |. MOV DWORD PTR DS:[EAX+18],ECX
  // 004024BE \. RETN
  004015CD . ADD ESP,4
   . MOV EDX,DWORD PTR SS:[EBP-1D0]
   . PUSH EDX
   . PUSH Dumped4W. ASCII "LingDi"
  004015DC . LEA EAX,DWORD PTR SS:[EBP-A4] // 期待已久的用户名入栈
   . PUSH EAX
   . CALL Dumped4W.
   . ADD ESP,0C
  004015EB . LEA ECX,DWORD PTR SS:[EBP-A4]
   . PUSH ECX // SHA计算所需要的常量。当前访客身份:游客 [
本博客大多数内容为网上资料整理而成,因找不到原创位置,所以...多数文章并未标注“原创”,实在抱歉,同时,感谢原创者的无私奉献,好人一路平安!!!
:对于做了几年C++的人,能说什么呢?不防尝试一下...
:引用来自“fanqinghui”的评论 害人害己。。 这个...
:害人害己。。
:看的我也眼热,决定学习下
:引用来自“YangMiao”的评论 http://go-tour-zh....
:http://go-tour-/ 无法访问啊大锅...
:引用来自“红尘一人”的评论 let's lua 让我们撸...
今日访问:0
昨日访问:38
本周访问:254
本月访问:298
所有访问:43206
列表模式: |
Pydbg库依赖Pydasm库,所有首先要安装Pydasm库。实际上Pydasm库是借助libdasm 1.5库开发的,在Google Code平台上可以下载 libdasm-1.5-tar.gz , 解压后会发现自带了Pydasm库,Pydasm库需要编译安装后才能使用。
注意,libdasm既不要使用早先的版本(早先有人使用paimei项目用了1.2版本,移植到win7就不正常),也不要使用最新版本(没测试过,不保证可用),只用1.5版本。
libdasm-1.5-tar.gz(或Pydasm库)下载链接 :&/p/libdasm/downloads/list
Pydasm库的完整无错编译安装步骤:
1、为编译做准备A:系统安装好VS2008或更高版本,比如VS2010、VS2012、VS2013;
2、为编译做准备B:修改python路径下的Lib/distutils/msvc9compiler.py的toolskey(243行),默认设置如下
&&&&toolskey = "VS%0.f0COMNTOOLS" % version
其实就是设置VSXXCOMNTOOLS的问题。
distutils库默认是
VS90COMNTOOLS,我安装的是VS2012,所以存在名为“VS110COMNTOOLS”的环境变量,看一下:
C:\&echo %VS110COMNTOOLS%
D:\Program Files\Microsoft Visual Studio 11.0\Common7\Tools\
所以我暴力设置toolskey为:
&&&&#toolskey = "VS%0.f0COMNTOOLS" % version
&&&&toolskey = "VS110COMNTOOLS"
3、编译安装:解压
libdasm-1.5-tar.gz, 进入pydasm目录,运行:
setup.py install
至此,Pydasm安装完成!
Pydbg库的完整无错编译安装步骤:
1、下载:在Github获取Pydbg库:
2、安装:解压后复制到python目录下的Lib\site-packages目录中。
3、删除Lib\site-packages\Pydbg目录下的(因为在上面已经重新安装了)!
Pydbg至此安装完成!
注意,Pydbg还有其他依赖项:utils、pida和pgraph库,这3个库请到paimei项目中直接扣取,并放到Lib\site-packages目录下:/OpenRCE/paimei
发布于 11个月前,
阅读(150) | 评论(0) |
投票(1) | 收藏(1)
[此文章被主人设置为私密,不可见]
统计: 0评/1阅/0赞
这里有两个文件:head.s 和 main.c
* head.s 是有NASM语言写得32位代码
*main.c 是基于C写得简单程序,没有包含任何库,main函数中只有“return 0”一句。
&&&&nasm -felf32 -o head.o head.s
&&&&gcc -m32 -c -o main.o main.c
&&&&ld -Ttext 0x0 head.o main.o -o system
3、system是elf格式,删除其多余信息:
&&&&objcopy -O binary -R .note -R .comment -S system rawsystem
最后的rawsystem即是最终需要的。
本实验在Debian 7 64位下,gcc的-m32选项强制编译为32位,ld的-Ttext 0x0强制程序入口为0x0.
发布于 1年前,
阅读(100) | 评论(0) |
投票(0) | 收藏(5)
[此文章被主人设置为私密,不可见]
统计: 0评/1阅/0赞
原文:http://blog.csdn.net/acmee/article/details/6613060 & & & &我们知道,使用ls命令列出文件列表时,不同的文件类型会用不同的颜色显示。那么如何实现这样带颜色的文本输出呢?答案并不复杂,不管是用shell还是C语言。 一、shell下的实现方法 & & & &先来讲在shell下,如何实现。用echo命令就可以实现,参看以下例子: & & & &echo &-e &&\033[32mHello, world!& & & & &当你在终端里敲下这条命令后,是不是发现系统用绿色输出了&Hello,world!&,不止如此,连之后的命令提示符都变成了绿色?不要着急,听我继续说。echo命令-e选项的作用是激活终端对反斜线转义符(即\)的解释。引号内\033用于引导非常规字符序列,在这里的作用就是引导设置输出属性,后边的[32m就是将前景色设置为绿色,字母m表示设置的属性类别,数字代表属性值。设置可以单独使用,例如: & & & &echo -e &&\033[0m& & & & &这行命令的作用是恢复属性为默认值,也就是说0m设置项用于恢复默认值。现在你的终端是不是又一切正常了? & & & &理解了这些,剩下的就简单了。用这种命令,除了设置文本前景色,还可以设置很多属性。下边列出其他的设置项: & & & -------------------------------------------------------------------------- & & & \033[0m 关闭所有属性 & & & \033[1m 设置高亮度 & & & \033[4m 下划线 & & & \033[5m 闪烁 & & & \033[7m 反显 & & & \033[8m 消隐 & & & \033[30m 至 \33[37m 设置前景色 & & & \033[40m 至 \33[47m 设置背景色 & & & \033[nA 光标上移n行& & & & \033[nB 光标下移n行 & & & \033[nC 光标右移n行 & & & \033[nD 光标左移n行 & & & \033[y;xH设置光标位置 & & & \033[2J 清屏 & & & \033[K 清除从光标到行尾的内容 & & & \033[s 保存光标位置& & & & \033[u 恢复光标位置 & & & \033[?25l 隐藏光标 & & & \033[?25h 显示光标 & & & -------------------------------------------------------------------------- & & & 各数字所代表的颜色如下: & & & 字背景颜色范围:40----49 & & & 40:黑 & & & 41:深红 & & & 42:绿 & & & 43:黄色 & & & 44:蓝色 & & & 45:紫色 & & & 46:深绿 & & & 47:白色
& & & 字颜色:30-----------39 & & & 30:黑 & & & 31:红 & & & 32:绿 & & & 33:黄 & & & 34:蓝色 & & & 35:紫色 & & & 36:深绿& & & & 37:白色 & & & 另外,同类的多种设置项可以组合在一起,中间用分号(;)隔开。如下: & & & echo -e &\033[20;1H\033[1;4;32mHello,world\033[0m& & & & 这行命令首先\033[20;1H将光标移动到终端第20行第1列,之后的\033[1;4;32m将文本属性设置为高亮、带下划线且颜色为绿色,然后输出Hello,world;最后\033[0m将终端属性恢复为默认值,这样就不会看到连命令完成后的命令提示符也变了样儿了。 & & & 通过以上各种命令的组合就可以实现对终端输出地复杂控制。 二、如何在C编程中实现? & & & 理解了以上在Shell中的实现方法,关于在C中如何实现就很简单了。可以说只需要用printf函数代替上边的echo -e就OK了。参见下例: & & & int color = 32; & & & printf(&\033[20;1H\033[1;4;%dmHello, world.\033[0m&, color); & & & 这个例子类似上边shell中最后那个例子,只是这里颜色值通过变量color来指定(当然,也可以直接指定)。 三、联想 & & & 看到这里你可能会想,是不是在其他编程语言里也可以用类似的方法实现对终端输出的控制呢?答案是肯定的!比如在python中,可以如下输出: & & & color=32 & & & print “\033[20;1H\033[1;4;%dHello, world.\033[0m&%color & & & 这个例子的效果跟上边C的例子是相同的
发布于 2年前,
阅读(153) | 评论(0) |
投票(0) | 收藏(14)
IBus 全称 Intelligent Input Bus是下一代输入法框架(或者说“平台”)。 项目现托管于 Google Code -
此项目包含了世界多数语言的文字输入需求——由世界多个国家开发者维护。
[] IBus输入法安装和设置
IBus是一个框架,支持多种输入法。
[] 安裝IBus框架:
在终端输入:
sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4
[] 启用IBus框架:
在终端输入:
im-switch -s ibus
重新启动X(也可以重启电脑)
[] 安装拼音引擎:
在终端输入:
sudo apt-get install ibus-pinyin
设置ibus-pinyin,在终端输入:
/usr/lib/ibus-pinyin/ibus-setup-pinyin
安装sunpinyin模块,在终端输入:
sudo apt-get install ibus-sunpinyin
设置ibus-sunpinyin,在终端输入:
/usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin
[] 安装五笔引擎:
在终端输入:
sudo apt-get install ibus-table-wubi
[] 设置IBus框架:
在终端输入:
ibus-setup
[] Kubuntu下使用IBus:
在终端输入:
sudo apt-get install gnome-icon-theme
[] 找回消失的IBus图标:
在终端输入:
ibus-daemon -drx
[] 其他语言输入法:
安装 ibus-m17n 包即可。
sudo apt-get install ibus-m17n
这个软件包包含了几乎所有除了英语,中日韩等的其他输入法,如:阿拉伯语,阿姆哈拉语,阿萨姆语,阿萨帕斯坎诸语,奥杰布瓦语,白俄罗斯语,波斯 语,藏语,傣语,丹麦语,迪维希语,俄语,法语,梵语,高棉语,格鲁吉亚语,古典希腊语,古吉拉特语,哈萨克语,捷克语,卡纳达语,克里语,克罗地亚语, 克什米尔语,老挝语,马拉提语,马拉雅拉姆语,孟加拉语,缅甸语,尼泊尔语,旁遮普语,普什图语,日语,瑞典语,瑞典,塞尔维亚语,僧加罗语,世界语,斯 洛伐克语,四川彝族语,泰卢固语,泰米尔语,泰语,维吾尔语,乌兹别克语,乌尔都语,希伯来语,现代希腊语,信德语,亚美尼亚语,伊努伊特语,依地语,印 地语,越南,占语,朝鲜,latex输入特殊符号,input-pad等。
如果您使用的是 fcitx,请安装相应的包。
sudo apt-get install fcitx-m17n
[] 自定义码表输入法及设置:
安装好ibus后,在目录:/usr/share/下会有:
ibus,ibus-pinyin,ibus-table
三个文件夹.
其中ibus-table文件夹中用于存放五笔之类的输入法内容.其下
icons文件夹用于存放输入法显示的图片,
tables文件夹用于存放码表(db格式)(SQlite数据库)
我们可以使用ibus提供的工具把自己的码表和参数生成db文件
导入到ibus中,生成自己的输入法使用,
ibus提供了一个样本文件:template.txt
其大概格式如下:
### 该码表文件必须按UTF-8格式编码保存
### 注释行以### 开头而不是一个#
### 它起源于scim码表格式,所以你可以用scim-tables码表来修改
SCIM_Generic_Table_Phrase_Library_TEXT
VERSION_1_0
### 开始定义
BEGIN_DEFINITION
### License
LICENSE = LGPL
### UUID用于标识该表以便于区分其他的表,你可以在终端中使用
### uuidgen命令产生一个uuid给该表
UUID = cabe-12ed-8db5-010b9d51ffed
### 版本号,但不要太长
### For example the last modified date of this file.
### This number must be less than 2^32.
### Just make your table version-able
SERIAL_NUMBER =
### 输入法图标,可以是pygtk识别的图片格式,一般用png,svg格式
### 该图标放在icons目录
ICON = ibus-table.svg
### 默认的表名,必填
NAME = Table
### 本地名,选添
NAME.zh_CN = 形码
NAME.zh_HK = 形碼
NAME.zh_TW = 形碼
描述可填可不填
DESCRIPTION = This is a template engine table for IBus Table.
### 该码表支持的语言
### 只用&zh_CN&则认为是zh_CN
### 但是如果是zh_CN,zh_HK或其他zh_XX则认为是zh
### and &en_US, zh_CN& will be just ignored.
LANGUAGES = zh_CN,zh_SG,zh_TW,zh_HK
### 该表作者
AUTHOR = Z ZZ &&
### 提示字符,它将被显示在状态栏中,CN会被“中”字代替
STATUS_PROMPT = CN
### 可输入的字符
VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyz
### Layout
LAYOUT = us
### 每个字或短语的最大输入长度
MAX_KEY_LENGTH = 4
### 自动上屏功能默认关闭FALSE(TRUE打开)
### 有人说五笔不能自动上屏把这修改成TRUE就好了
AUTO_COMMIT = FALSE
### 标点符号 默认是全角格式
DEF_FULL_WIDTH_PUNCT = TRUE
### 全角字符默认关闭
DEF_FULL_WIDTH_LETTER = FALSE
### 是否允许用户定义词组短语,默认允许
### 但你需要定义构词法则
### 开启后使用该表时定义词组方法:
### 先输入词组中的每一个字,输完选字时用Ctrl+&数字键& 选取
### 词组中的第一个字,然后输入词组中的第二个字,
### 输完选字时用Ctrl+&数字键& 选取
### 直到输入该词组的最后一个字,输完后直接用数字键选则
### 如此,这一词组便录入完闭,以后即可按后面定义的词组法则来输入该词
USER_CAN_DEFINE_PHRASE = TRUE
### 是否允许拼音模式,默认允许,该功能只是为中文设计
### 如果你的输入法不是中文的可以关闭它(似乎没什么用??注音模式?反正我不会用)
PINYIN_MODE = TRUE
### 字,词组,短语频率调节.默认允许
DYNAMIC_ADJUST = TRUE
### Some characters whose frequencies should be fix all the time, e.g.
### some punctuations
### NO_CHECK_CHARS =
### 用户自定义词组后该词输入规则
### ce表示词组长度等于,例如ce2表示词组长度等于2,
### ca表示词组长度等于或大于,
### p21表示词组中第2个字的第一笔(对应的按键)
### 每一个规则用;号隔开
RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p22+p31;ca4:p11+p21+p31+p41
### 以上规则表示,两字词按每字前2个键输入,3字词按1字1键2字1,2键,3字1键输入...
END_DEFINITION
### 开始码表数据
### 码表格式为:“输入建\t(制表符)字词\t(制表符)频率\n(换行)”
### From left to right, the 1st column are the input key combination that you
the 2nd column are presented character or phrase of
### the key
the 3rd column are frequency of the character
### or phrase.
BEGIN_TABLE
input_keys aim_chars freq
input_keys aim_chars freq
input_keys aim_chars freq
### 有些输入法对词组中的字使用不同的码表,例如郑码,它需要定义guocima
### 如果你不许要请把下面的注释掉
### Since some input methods use different table for every character to make
### phrase, such as ZhengMa, they need explict define the goucima (the
### phrase-building code for the given character), the format of every entry is
### &character\tgoucima\n&.
### For the input method which just use the full code as word-building code
### just skip this field. The ibus-table will build the codes needed from
### above TABLE.
### if you don't need different word-building code, please comment out the
### next few lines with ###, just like these lines you are look at now.
BEGIN_GOUCI
character_1 goucima_1
character_1 goucima_2
去掉注释的样本如下:
SCIM_Generic_Table_Phrase_Library_TEXT
VERSION_1_0
BEGIN_DEFINITION
UUID = c88e7342-13ae-498d-9442-fc92ad1d85ee
SERIAL_NUMBER = 1
ICON = wubi98.svg
NAME = WuBi98
NAME.zh_CN = 五笔98
NAME.zh_HK = 五筆98
NAME.zh_TW = 五筆98
LANGUAGES = zh_CN,zh_SG,zh_TW,zh_HK
AUTHOR = SomeBody
STATUS_PROMPT = CN
VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxy
MAX_KEY_LENGTH = 4
AUTO_COMMIT = TRUE
DEF_FULL_WIDTH_PUNCT = FALSE
DEF_FULL_WIDTH_LETTER = FALSE
USER_CAN_DEFINE_PHRASE = TRUE
PINYIN_MODE = TRUE
DYNAMIC_ADJUST = TRUE
RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p31+p32;ca4:p11+p21+p31+p-11
END_DEFINITION
BEGIN_TABLE
根据个人喜好写完上述文件,和&BEGIN_TABLE&与&END_TABLE&之间的码表保存好, 然后到终端用命令:
ibus-table-createdb -s 你的码表名
生成该表的db文件,然后用命令:
sudo cp 你的码表名.db /usr/share/ibus-table/tables/
放到ibus目录中,重启后就可以使用了. 当然了还有输入法的图片:
sudo cp 输入法图片 /usr/share/ibus-table/icons/
发布于 2年前,
阅读(246) | 评论(2) |
投票(0) | 收藏(9)
在指定目录及子目录下所有.go文件中查找字符串“Hikerell”
find . -name &*.go& | xargs grep &Hikerell&
(find . -name &*.go&列出所有文件,xargs从标准输入中执行grep命令)
grep -r &Hikerell& ./
发布于 2年前,
阅读(65) | 评论(0) |
投票(0) | 收藏(0)
有些朋友可能需要自己动手修改一下XenServer中Xen内核,来进行一些细节调整和配置,需要查看Xen的版本号。
方法很简单,如上图:
XenServer中Xen内核的一些基础信息保存在/sys/hypervisor目录中
里面包含properties和version两个目录
其中version目录中包含三个文件:major、minor、extra,分别为Xen的主次和小版本号。
而properties/changeset文件中可以看到详细的Xen和XenServer当前版本号。
从图中我们可以看到XenServer5.6.0-31188p的详细信息:3.4.2 5.6.0.597.20014,其中3.4.2为Xen内核版本,5.6.0.597.20014为XenServer版本号。
发布于 2年前,
阅读(137) | 评论(0) |
投票(0) | 收藏(3)
Roger Hill 在过去 23 年中一直担任大型复杂混合环境中的一名 UNIX&/Linux& 系统工程师和程序员/开发员。在过去 7 年中他主要专注于各种 UNIX、Linux 和 Windows& 平台之间的互通和为这些系统建立无缝、安全的自动化功能。Roger 拥有计算机信息系统副学士学位、计算机科学学士学位、Linux 管理校长证书,且有 9 个专业技术认证。
简介:&您是否是需要能够以尽可能最安全的方式通过网络进行通信的一个新 UNIX& 管理员?重温基础知识、学习 SSH 的复杂细节,并深入研究 SSH 的高级功能,以安全地自动化您的日常系统维护、远程系统管理,并使用高级脚本管理多个主机。
发布日期:&2011 年 5 月 03 日
级别:&中级
原创语言:
访问情况 :&18336 次浏览
什么是 SSH?基本描述
Secure Shell (SSH) 的目的在于在通过网络远程访问另一个主机时提供最大的保护。它通过提供更好的身份验证工具和 Secure Copy (SCP)、Secure File Transfer Protocol (SFTP)、X 会话转发和端口转发等功能来加密网络交换,从而增加其他非安全协议的安全性。有各种类型的加密可用,从 512 位加密到高达 32768 位加密,包括密码,比如 Blowfish、Triple DES、CAST-128、Advanced Encryption Scheme (AES) 和 ARCFOUR。更高位的加密配置以使用更高的网络带宽为代价。&和&&展示如何使用一个像 Wireshark 这样的网络嗅探程序轻松让任何人随意查看 telnet 会话。
图 1. Telnet 协议会话未加密。
常用缩略词
API:应用程序编程接口
FTP:文件传输协议
IETF:互联网工程任务组
POSIX:UNIX 可移植操作系统接口
RFC:请求注解
VPN:虚拟专用网络
在使用 telnet 这样的不安全 “明文” 协议时,网络上的任何人都可以窃取您的密码和其他敏感信息。&展示用户&fsmythe&通过一个 telnet 连接登录到一个远程主机。他输入其用户名&fsmythe&和密码&r@m$20!0,同一网络上的任何其他用户都可以看到,将其看作是倒霉、没有戒心的 telnet 用户。
图 2. SSH 协议会话加密。
&提供了对典型 SSH 会话的概览,并展示了加密的协议如何不被同一网段的任何其他用户看到。现在每个主流 Linux& 和 UNIX& 版本都附带有默认安装的 SSH 包 — 通常是开源 OpenSSH 包—,因此有点需要下载和从源码进行编译。如果您不在一个 Linux 或 UNIX 平台上,有大量开源和基于 SSH 的免费软件工具可用,它们大受追捧并广为应用,比如、、、&和&(安装在 Windows& 操作系统之上的 POSIX 软件)。这些工具在 Windows 平台上提供一个 UNIX 或 Linux 式的 shell 接口。
不管您的操作系统是什么,SSH 都为老生常谈的日常计算操作提供许多实际效益。它不仅可靠、安全和灵活,而且易于安装、使用和配置 — 而且独具特色。
IETF RFC 4251 到 4256 将 SSH 定义为 “经由一个不安全网络进行远程登录和其他安全网络服务的安全 shell 协议”。shell 由三个主要元素组成(参见&):
传输层协议:该协议提供服务器身份验证、隐私和具有完美转发隐私的完整性。该层可以提供可选压缩且通过一个 TCP/IP 连接运行,但是也可用于任何其他可靠的数据流之上。
用户认证协议:该协议从服务器到客户端进行身份验证,且通过传输层运行。
连接协议:该协议多路传输加密隧道到多个逻辑通道,通过用户认证协议运行。
图 3. SSH 协议逻辑层
传输层负责密钥交换和服务器身份验证。它设置加密、完整性验证和(可选)压缩并向上层公开一个用于发送和接收纯文本数据包的 API。用户认证层提供客户端身份验证以及多种验证方法。常见的身份验证方法包括密码、公钥、键盘交互、GSSAPI、SecureID 和 PAM。
连接层定义通道、全局请求和借以提供 SSH 服务的通道请求。单个 SSH 连接可以并行承载多个通道,每个都可双方向传输数据。通道请求转送信息,比如服务器端流程的退出代码。SSH 客户端发起一个转发服务器端端口的请求。
这种开发式架构设计提供广泛的灵活性。传输层可媲美传输层安全(Transport Layer Security,TLS),而且您可以运用定制的身份验证方法来扩展用户认证层。通过连接层,您可以多道传输二级会话到单个 SSH 连接(参见 )。
图 4. 7 层 OSI 模型内的 SSH
针对 UNIX 和 Linux 系统的 SSH 的一般用途
您通常使用 SSH 来允许用户登录到一个远程主机并执行命令。然而,SSH 还支持隧道和 X11 连接。它甚至可以使用 SFTP 或 SCP 传输文件。SSH 适用于大部分常见平台内的多个应用程序,这些平台包括 Linux、UNIX、Windows 和 Apple& OS X,虽然有些应用程序可能需要仅在特定 SSH 客户端或服务器上提供或与之兼容的功能。
下面是一些常见的 SSH 语法例子:
root@edb-'s password: ******
Connecting ...
's password: *******
# rsync -avul --rsh=ssh /opt/edbdata/ :/root/backup/
's password: ******
building file list ... done
dir1/file5.txt
dir2/file6.txt
sent 982813 bytes
received 2116 bytes
total size is 982138
speedup is 1.00
ssh -L 8000:mailserver:
's password: ********
Edit /etc/ssh/sshd_config and change 2 keywords :
AllowTcpForwarding yes
X11Forwarding yes
# service sshd restart
$ export DISPLAY
X11 转发配置与带 SSH X11 隧道的一个 X Windows 客户端的结合,支持实现通过 SSH 安全地在同一 Windows 主机上运行的一个 UNIX 或 Linux GUI 子系统,该 Windows 主机是到 Linux 或 UNIX 远程主机的 SSH 会话的来源:
ssh -ND 8000
Browser Settings, goto 'Manual Proxy Configuration' set &SOCKS Host& ,
the 'Port to 8000' , Enable SOCKS v5, and lastly set 'No Proxy for' field
to 'localhost, 127.0.0.1'
使用&sshfs&将一个目录作为本地计算机上的文件系统安全地挂载到一个远程服务器:
# yum install sshfs fuse-utils (Install sshfs and fuse-utils)
$:/remote_dir /mnt/local_dir
通过一个或多个机制对服务器进行自动化的远程主机监控和管理:
(Report number of apache processes running on the remote ):
ps -ef | grep httpd | wc -l
's password: *****
SSH 安全性和配置最佳实践
对于一些之前列举的代码示例,许多系统管理员担心 SSH 使用情况和功能的一些安全性实现。尽管已经口头和书面说明了常见的各种 SSH 安全性和远程主机安全性方法,下面有一系列流程和配置可用于加强有关远程主机访问的 SSH 安全性:
将 root 账户仅限制为控制台访问:
# vi /etc/ssh/sshd_config
PermitRootLogin no
为私有密钥使用一个强大的口令和密码保护来创建公私密钥对(绝不要生成一个无密码的密钥对或一个无密码口令无密钥的登录):
# vi /etc/ssh/sshd_config
ClientAliveInterval 600
# (Set to 600 seconds = 10 minutes)
ClientAliveCountMax 0
Update /etc/sysconfig/iptables (Redhat specific file) to accept connection only
from 192.168.100.0/24 and 209.64.100.5/27, enter:
-A RH-FW-1-INPUT -s 192.168.100.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-FW-1-INPUT -s 209.64.100.5/27 -m state --state NEW -p tcp --dport 22 -j ACCEPT
限制 SSH 将侦听和绑定到的可用接口:
# vi /etc/ssh/sshd_config
ListenAddress 192.168.100.17
ListenAddress 209.64.100.15
设置用户策略,实施强大的密码来防御强力攻击、社会工程企图(social engineering attempts)和字典攻击:
Redhat iptables example (Update /etc/sysconfig/iptables):
-i eth0 -p tcp --dport 2022 -m state --state NEW -m limit --limit 3/min
--limit-burst 3 -j ACCEPT
-i eth0 -p tcp --dport 2022 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp --sport 2022 -m state --state ESTABLISHED -j ACCEPT
配置&iptables,以便在 30 秒内仅允许在端口 2022 上有三个连接尝试:
Redhat iptables example (Update /etc/sysconfig/iptables):
-I INPUT -p tcp --dport 2022 -i eth0 -m state --state NEW -m recent --set
-I INPUT -p tcp --dport 2022 -i eth0 -m state --state NEW -m recent --update
--seconds 30 --hitcount 3 -j DR
# vi /etc/ssh/sshd_config
VerifyReverseMapping yes # Turn on
reverse name checking
UsePrivilegeSeparation yes # Turn on privilege separation
StrictModes yes
# Prevent the use of insecure home directory
# and key file permissions
AllowTcpForwarding no
# Turn off , if at all possible
X11Forwarding no
# Turn off , if at all possible
PasswordAuthentication no # Specifies whether password authentication is
# allowed.
The default is yes. Users must have
# another authentication method available .
# find /usr -name rsh
/usr/bin/rsh
# rm -f /usr/bin/rsh
# ln -s /usr/bin/ssh /usr/bin/rsh
SSH 支持可启用或禁用的多种不同的身份验证方法和技术。在 /etc/ssh/sshd_config 文件中,您可以进行这些配置更改,方法就是输入为身份验证方法列出的关键字,然后紧接yes&或&no。下面是一些常见的配置更改:
# RSAAuthentication yes
# PubkeyAuthentication yes
# RhostsRSAAuthentication no
# HostbasedAuthentication no
# RhostsRSAAuthentication and HostbasedAuthentication
PasswordAuthentication yes
ChallengeResponseAuthentication no
# KerberosAuthentication no
GSSAPIAuthentication yes
sshd_config 文件内的&AllowedAuthentications&和&RequiredAuthentications&决定哪些身份验证方法和配置仅用于 SSH Protocol 2,且它们支持密码和公钥身份验证的语法如下:
# vi /etc/ssh/sshd_config
AllowedAuthentications publickey, password
RequiredAuthentications publickey, password
SSH 的私钥和公钥对
为了帮助验证身份,SSH 有一个密钥管理功能和相关的代理。当配置为公钥身份验证时,您的密钥证明您在远程 SSH 主机上的身份。一个基于 SSH 的身份包括两个部分:一个公钥和一个私钥。私有 SSH 密钥是用于出站 SSH 连接的用户身份,且应当保密。当用户发起一个 SSH 或 SCP 会话到远程主机或服务器时,他或她被认为是&SSH 客户端。通过一个数学算法,一个私钥如同您的电子身份证;公钥如同您向其出示身份证的锁或门机制。您的私钥说,“这真的是 Fred Smythe”;公钥说,“是的,您确实是真正的 Fred Smythe;您已通过身份验证:请进入。”
您的公钥代表您允许通过您的大门或锁进入的人。公钥需要保密;它们不能用于泄漏一个系统或对系统进行未经授权的访问。在一个 Linux 或 UNIX 系统上,这些私有和公共密钥对存储在 ASCII 文本系统中;在 Windows 系统上,一些程序将密钥对存储为文本文件,一些存储在 Windows 注册表中。
通过一个 SSH Protocol 2 配置可创建使用多个私有密钥的多重鉴定。让我们看看如何在一个典型的 Linux 主机上生成、设置和配置一个 SSH 私有和公共密钥对(参见&)。
图 5. 在 SSH 定义的架构模型中定义的 SSH 公私密钥对事务图
配置公私 SSH 密钥对的步骤
步骤 1 中所示的示例(参见&)为用户 fsmythe 使用&ssh-keygen&使用程序,通过dsa&的&type&创建 SSH 公私密钥对。
清单 1. 生成 SSH 密钥对
[ ~]$ /usr/bin/ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/fsmythe/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): ******
(Enter 'mypassword')
Enter same passphrase again: ****** (Enter 'mypassword')
Your identification has been saved in /home/fsmythe/.ssh/id_dsa.
Your public key has been saved in /home/fsmythe/.ssh/id_dsa.pub.
The key fingerprint is:
33:af:35:cd:58:9c:11:91:0f:4a:0c:3a:d8:1f:0e:e6
步骤 2 中所示的示例() 展示如何将密钥对的私有密钥从源主机复制到目标主机的 authorized_keys 文件,该文件位于目标主机上预期用户帐户的主目录下的 .ssh 子目录内。
清单 2. 将私有密钥从源主机复制到目标主机上的 authorized_keys 文件
[ ~]$ scp -p /home/fsmythe/.ssh/id_dsa.pub
:/home/fsmythe/.ssh/authorized_keys
fsmythe@ 's password:
id_dsa.pub
步骤 3 中所示的示例(参见&)发出第一次远程 SSH 调用(ls -d /tmp)到目标服务器,从而缓存您的服务器的 .ssh/known_hosts 文件内的密钥。您可以输入与在创建 SSH 公私密钥对时同样的口令,且在远程目标服务器上运行的命令的输出可在您本地的源服务器上看到。
清单 3. 通过在目标远程主机上运行远程命令来验证 SSH 访问
ls -d /tmp
The authenticity of host ' (10.12.53.118)' can't be established.
RSA key fingerprint is 84:4f:e5:99:0b:7d:54:d0:1b:3e:2b:96:02:34:41:25.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ',10.12.53.118' (RSA) to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_dsa': ******
(Enter 'mypassword')
注意:对于上述示例,您不必输入用户 fsmythe 的密码。不过您可以输入您在第一步中设置的口令。如果您选择在访问远程目标时不输入口令,那么在提示输入口令时输入步骤 1 中的&enter&来创建一个空口令。现在,您不必输入任何内容来作为用户 fsmythe 访问
远程目标机器。
配置和使用 ssh-agent
对于拒绝创建无密码 SSH 公私密钥对的真正的偏执狂来说,有一个&ssh-agent&实用程序。简言之,您使用&ssh-agent&实用程序来暂时在无口令集的公私密钥对配置上授予无密码的 SSH 访问,但仅针对当前 shell 会话。在运用&ssh-agent&实用程序之前,像往常一样输入口令:
Enter passphrase for key '/root/.ssh/id_dsa':****** (User must type password)
Last login: Sat May
8 06:37:26 2010 from 10.12.53.118
接下来,查询&ssh-agent&以在标准输出中生成 Bourne shell 命令:
[ ~]# ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-vxZIxF1845/agent.1845; export SSH_AUTH_SOCK;
SSH_AGENT_PID=1849; export SSH_AGENT_PID;
echo Agent pid 1849;
在步骤 3 中,在当前 shell 会话中设置前述的环境变量:
[root@example01 ~]# SSH_AUTH_SOCK=/tmp/ssh-vxZIxF1845/agent.1845;export SSH_AUTH_SOCK
SSH_AGENT_PID=1849; export SSH_AGENT_PID;echo Agent pid 1849
Agent pid 1849
然后,确认&ssh-agent&在运行:
[ ~]# ps -fp $SSH_AGENT_PID
C STIME TTY
00:00:00 ssh-agent -s
现在,在运行的&ssh-agent&内列出当前加载的身份:
[ ~]# ssh-add -l
The agent has no identities.
在步骤 6 中,添加所需的 SSH 身份(使用该 SSH 密钥的正确口令对其进行预先验证):
[ ~]# ssh-add
Enter passphrase for /root/.ssh/id_dsa:
Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa) ****** (Entered 'mypassword')
现在,您可以确认将这些身份加载到运行的&ssh-agent&中:
[ ~]# ssh-add -l
1024 33:af:35:cd:58:9c:11:91:0f:4a:0c:3a:d8:1f:0e:e6 /root/.ssh/id_dsa (DSA)
最后,使用 SSH 命令语法测试&ssh-agent。注意,现在有一个口令提示:
# Assuming target remote host has correct authorized key for private key from example01
[ ~]# ssh -A
Last login: Sat May
8 06:36:27 2010 from 10.12.53.118
[root@example02 ~]#
# Assuming target remote host has correct authorized key for private key from example03
[ ~]# ssh -A
Last login: Sat May
8 07:04:05 2010 from 10.12.53.119
[root@example03 ~]#
在使用&ssh-add&命令输入口令时,您实际上是在解密私有密钥然后通过代理将其放到内存中,用于将来使用该口令的 SSH 连接。注意,您可以输入多个私有密钥并使用&ssh-add&命令预先验证它们。
&中所示的 SSH 工具&ssh-keyscan&允许您从多个远程 SSH 主机收集公共 SSH 主机密钥。该工具有助于构建 /etc/ssh_known_hosts 文件且异常快速有效。它主要适用于用于自动化用途的 shell 脚本。
清单 4. 使用 ssh-keyscan 的示例
[root@example01 ~]# /usr/bin/ssh-keyscan -t rsa,
# SSH-2.0-OpenSSH_4.ssh-dss AAAAB3NzaC1kc3MAAACBALd5/TGn7jCL1DWWzYMw96jw3QOZGBXJgP4m9LACViyM0QHs
ewHGo841JdInfE825mVe0nB/UT15iylLOsI/jFCac+ljQRlO+h2q7WOwGveOUN7TxyKlejM+G1pg5DndGt05iYn+2
dDfn5CmEsI+K0F2vk/+mpoSOk9HKq9VgwNzAAAAFQDPeLAth62TRUcN/nTYoqENBmW3SwAAAIEAryoKa+VaG5LQNj
wBujAuA7hGl+DIWVb1aZ8xAHkcyL5XgrOWEKNnK9mDmEN66oMLfTMO3w8/OvbJUmcXcU3jnL3zguz2E2OIv6t6vAa
F6niL7A/VhxGGxy4CJZnceufStrzZ3UKXRzjwlm0Bwu/LruVF2m3XLvR5XVwUgyWvw+AAAACAaK12k3uC/OOokBgi
eu/SuD5wCSBsf9rqG9ZFa32ujZwRZmA/AwPrZd6q3ASxmjtMp6zGQSzxPczUvLH9D9WIJo713bw8wCPo/7pqiQNRs
OZXqlQyaXyrDout6CI683b1/rxsZKPrJpFNehrZwjWrwpYhK7VaTuzxvWtrDyDxWec=
# SSH-2.0-OpenSSH_4.ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq5So5VBeH4gPX1A1VEeQkGsb/miiWsWnNTW8ZWYj
2IvU7rKpk/dBIp64WecYYYgDqTK5u0Q+yTijF8wEEI9rRyoh9p5QraM8qy9NxcHzyGqU4vSzfVrblIQrDI8iv7iwz
7PxQAY76NmweaUyGEDfIErty4gCn/ksy85IgffATa9nt36a4iUhiDNifnE8dm1ZrKkvz3lIg0w+Cu0T9MY77AqLWj
Moo0WoQArIvYa0soS3VhzgD/Biwu/sh3eHJtFUxTVxnATdkWkHKUI1wxma3j7jF0saTRKEQSvG6492W+U1FhEjFGN
r7KeZXH99uFpuUWFA7xO7uaG/MLWSjPJMxw==
# SSH-2.0-OpenSSH_4.ssh-dss AAAAB3NzaC1kc3MAAACBALd5/TGn7jCL1DWWzYMw96jw3QOZGBXJgP4m9LACViyM0QHs
ewHGo841JdInfE825mVe0nB/UT15iylLOsI/jFCac+ljQRlO+h2q7WOwGveOUN7TxyKlejM+G1pg5DndGt05iYn+2
dDfn5CmEsI+K0F2vk/+mpoSOk9HKq9VgwNzAAAAFQDPeLAth62TRUcN/nTYoqENBmW3SwAAAIEAryoKa+VaG5LQNj
wBujAuA7hGl+DIWVb1aZ8xAHkcyL5XgrOWEKNnK9mDmEN66oMLfTMO3w8/OvbJUmcXcU3jnL3zguz2E2OIv6t6vAa
F6niL7A/VhxGGxy4CJZnceufStrzZ3UKXRzjwlm0Bwu/LruVF2m3XLvR5XVwUgyWvw+AAAACAaK12k3uC/OOokBgi
eu/SuD5wCSBsf9rqG9ZFa32ujZwRZmA/AwPrZd6q3ASxmjtMp6zGQSzxPczUvLH9D9WIJo713bw8wCPo/7pqiQNRs
OZXqlQyaXyrDout6CI683b1/rxsZKPrJpFNehrZwjWrwpYhK7VaTuzxvWtrDyDxWec=
# SSH-2.0-OpenSSH_4.ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq5So5VBeH4gPX1A1VEeQkGsb/miiWsWnNTW8ZWYj
2IvU7rKpk/dBIp64WecYYYgDqTK5u0Q+yTijF8wEEI9rRyoh9p5QraM8qy9NxcHzyGqU4vSzfVrblIQrDI8iv7iwz
7PxQAY76NmweaUyGEDfIErty4gCn/ksy85IgffATa9nt36a4iUhiDNifnE8dm1ZrKkvz3lIg0w+Cu0T9MY77AqLWj
Moo0WoQArIvYa0soS3VhzgD/Biwu/sh3eHJtFUxTVxnATdkWkHKUI1wxma3j7jF0saTRKEQSvG6492W+U1FhEjFGN
r7KeZXH99uFpuUWFA7xO7uaG/MLWSjPJMxw==
使用 UNIX 应用程序或脚本配置 SSH
配置供远程 shell 脚本使用的 SSH 访问以及用于维护、远程备份和存档系统的远程工具非常有用,但一旦涉及到服务器安全性,它一直都是一个有极大争议的主题。用户可能希望运行的很多 shell 脚本,比如:
/usr/local/bin/dangerous_script.pl
不能处理提示其进行身份验证的一个必需的 SSH 口令,但除非提前配置一个无密码的公私 SSH 密钥对、一个&ssh-agent&配置或一个可信的主机网络机制 — 不提示输入 SSH 密钥的配置 —,否则这不太可能。这是因为 SSH 期待来自与该 shell 会话相关的当前终端的口令。通过使用一个预期脚本或 Perl(参见&CPAN Module Net::SSH::Perl)脚本(或您的 shell 脚本可以选择性地调用上述脚本类型中的一种)用户可以解决该问题:
#!/usr/local/bin/expect
spawn sftp $argv
expect &password:&
send &mysshpassowrd\r&
向一般用户授予一个无密码的 SSH 机制来访问远程主机在一些系统管理员的眼里已相当不可想象。然而,拥护无密码 SSH 机制访问远程主机的其他安全措施,比如远程主机上的用户仅提供一个受限的 korn shell (rksh) 帐户或受限的 shell (rssh) 而非一个完全的 bash 或 Bourne shell 帐户。一个授权密钥也可以将用户限制为列表中命令的一个子集,因此实际上,用户仅可以使用运程运行所需的确切命令,没有可能发生进一步访问或会损坏系统的一个意外命令运行。&中提供的 SSH 限制示例提供这样一个限制类型。
清单 5. 限制远程主机上 authorized_keys 文件的配置示例
[fsmythe@example02 .ssh]$ more authorized_keys
command=&/usr/local/bin/secureScript.sh&,no-port-forwarding,no-X11-forwarding,no-agent-fo
rwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAACBAOFsC6C7cJUGOZG4Ur9W0J6mxTTk5+MYTu5XfRESPLVwQ
A7HlUxhsXsxgmb1L1RgvR/g0JZnipDS+fGOrN2/IerSpgyzegTVxYLPrOovvuyCn5TA0+rmyrkV27so6yRDkdqTJc
YzWNJOyDndnTrDc/LNmqLFKoGMQ33aur6RNv4VAAAAFQD4leC5Fc1VJqjvXCNsvazBhi84vQAAAIAWbshT80cTESg
dX/srxX4KVNAzY1uhBz5V0UYR4FGP+aoe6laxRj+gQvFIvAKIrpikvBjgyW6cdT8+k0t8HGIQp20MzSBdY9sH8xdj
05AG97Nb/L8xzkceB78qfXhV6txaM1CzssUtiOtaAygrywNPBDEN9MbEbwpVVVyd6iqZNgAAAIAmV0SUZoUr8dHdC
tagRye4bGOQjoztpb4C0RbXQw+w7Jpzr6cZISdZsK4DTBjODvv2+/OWPm7NEzzWyLzHPBNul8hAHOUCOpp+mYWbXX
F78BTk2Ess0SZu8dwpOtasTNEp+xPcsOvQx2Kdr17gTp+28SfpREuLudOr6R3KeTb+hw== fsmythe@example01
主机 example01 上的用户 fsmythe 仅允许执行本例中的命令=&/usr/local/bin/secureScript.sh。
使用 SSH 创建一个可信的主机环境
最后,我要提一下作为一种替代方案来设置公私 SSH 密钥对的可信主机环境。对于自动化或在有必要进行这些类型的调用的一个脚本环境中,虽然可信主机环境仍然承担一些安全风险,但它优于公私密钥对场景。一个可信主机环境或可信主机身份验证主要依赖于列出获准访问的用户和主机组合的预配置文件。有两种可信主机身份验证。较老(比如针对 OpenSSH 和 SSH1)和较弱的使用明文协议命令(rsh、rcp&和&rlogin);检查两个文件;并在 sshd_config 文件中设置一个关键字:
/etc/hosts.equiv
SSH Protocol 2 不支持该方法。相反,对于更安全的可信主机网络,在 /etc/ssh/sshd_config 文件(接受主机名或 IP 地址)中进行如下更改,并配置 shosts.equiv 和/或 .shosts 文件:
要在 /etc/ssh/sshd_config 文件中为 SSH Protocol 2 启用一个可信主机环境,使用:
例如,如果您在服务器
上且按如下方式配置了您的 /etc/shosts.equiv 文件:
+secureserver.net sallyh
+192.168.100.12 fsmythe
-hackers.org james
您将允许用户 fsmythe 从远程源 ,192.168.100.12,和 secureserver.net 进行可信主机身份验证,允许用户从 secureserver.net 进行访问,拒绝来自远程源 hackers.org 的用户 james 的访问。
可信主机身份验证和公私 SSH 密钥对身份验证方法是类似的,在很大程度上实现相同的结果。&提供对两种身份验证方法的并排比较。
表 1. 公私 SSH 密钥对与可信主机环境之比较
公私密钥对
根据 IP 地址进行身份验证
根据主机名进行身份验证
使用其他公钥功能
根据远程用户名进行身份验证
允许主机名和 IP 地址中有通配符
口令是登录访问所必需的
IP 地址或主机名变更消息
服务器和客户端需要的配置
对自动化任务或脚本化需求有用
对那些目前嘲笑在网络上使用无密码远程 SSH 访问来支持可信主机身份验证这一想法的那些管理员,在使用脚本实现远程 SSH 功能时考虑公私密钥对的缺点:
如果一个服务器主机名或 IP 地址改变,公私密钥对配置会由于缓存的已知主机而破坏。需要在 .ssh/known_hosts 文件中删除旧条目,且 SSH 远程主机名和/或 IP 地址被再次缓存。这会破坏依赖于公私密钥对的脚本。
公私密钥对身份验证同时需要客户端和服务器配置。如果一个 SSH 公钥改变或重新生成密钥对,所有远程主机将在其 authorized_keys 文件中需要新的公共密钥。
如果 .ssh/ 文件夹的权限或私有或公共密钥文件本省改变,它会阻止无 SSH 密码的访问发生。要禁用严格的文件和目录权限检查,在 /etc/ssh/sshd_config 文件内将关键字StrictModes&设置为&no。
一旦生成密钥对,没有集中方式来撤销密钥,或确切地知道该密钥已向谁分发。
SSH 是一个强大而安全的网络实用程序,全球有无数用户使用它来完成各种任务。作为 telnet 和&r*&系列命令等明文协议的一个安全替代方案,拥有可免费分发的 SSH 客户端和服务器的多个产品,SSH 是很难被击败的。在许多网络中被广泛用于脚本化技术内的大量远程监控、系统维护、远程系统审计、报告和自动化,SSH 似乎已被普遍接受并将继续不断演化。
Putty Windows SSH 客户端安装程序
putty-0.60-installer.exe
FileZilla Windows SSH 安装程序
FileZilla_3.3.2.1_win32-setup.exe
Tera Term Windows SSH 安装程序
teraterm-4.65.exe
WinSCP 安装包
winscp427setup.exe
Cygwin Universal Downloader
SoftonicDownloader11694.exe
。Wikipedia 提供了对 SSH 的精彩介绍和讨论。
:OpenSSH 是 Internet 技术用户依赖的一个连通性工具版本。可免费获取。
:阅读 SSH 协议架构。
(Girish Venkatachalam,Linux Journal,2007 年 4 月):在 OpenSSH 上获取 “基本事实细节”。
(Cameron Laird,developerWorks,2003 年 7 月):了解使用 SSH 保护服务器的更多信息。
:了解更多并从 Symantec 下载工具。
:更多了解使用公共密钥的风险。
: 提供在 Linux 环境中开始使用 SSH 的一本好教程。
:探究您必须知道的 5 个 SSH 技巧。
:探究这些服务器最佳安全实践。
:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
:阅读关于这些和其他技术主题的图书。
Roger Hill 在过去 23 年中一直担任大型复杂混合环境中的一名 UNIX&/Linux& 系统工程师和程序员/开发员。在过去 7 年中他主要专注于各种 UNIX、Linux 和 Windows& 平台之间的互通和为这些系统建立无缝、安全的自动化功能。Roger 拥有计算机信息系统副学士学位、计算机科学学士学位、Linux 管理校长证书,且有 9 个专业技术认证。
发布于 2年前,
阅读(79) | 评论(0) |
投票(0) | 收藏(0)
我们团队为上一家公司承担运维、优化和扩展工作的时候,我们碰到了各种不同规模的性能很差的系统和基础设备(大型系统居多,比如CNN或者世界银行的系统)。要是再赶上修复时间紧、奇葩的技术平台、缺少信息和文档,基本上这过程都会惨痛到让我们留下深刻的记忆。
遇到服务器故障,问题出现的原因很少可以一下就想到。我们基本上都会从以下步骤入手:
一、尽可能搞清楚问题的前因后果
不要一下子就扎到服务器前面,你需要先搞明白对这台服务器有多少已知的情况,还有故障的具体情况。不然你很可能就是在无的放矢。
必须搞清楚的问题有:
故障的表现是什么?无响应?报错?
故障是什么时候发现的?
故障是否可重现?
有没有出现的规律(比如每小时出现一次)
最后一次对整个平台进行更新的内容是什么(代码、服务器等)?
故障影响的特定用户群是什么样的(已登录的, 退出的, 某个地域的…)?
基础架构(物理的、逻辑的)的文档是否能找到?
是否有监控平台可用? (比如Munin、Zabbix、 Nagios、 New Relic… 什么都可以)
是否有日志可以查看?. (比如Loggly、Airbrake、 Graylog…)
最后两个是最方便的信息来源,不过别抱太大希望,基本上它们都不会有。只能再继续摸索了。
二、有谁在?
用这两个命令看看都有谁在线,有哪些用户访问过。这不是什么关键步骤,不过最好别在其他用户正干活的时候来调试系统。有道是一山不容二虎嘛。(ne cook in the kitchen is enough.)
三、之前发生了什么?
查看一下之前服务器上执行过的命令。看一下总是没错的,加上前面看的谁登录过的信息,应该有点用。另外作为admin要注意,不要利用自己的权限去侵犯别人的隐私哦。
到这里先提醒一下,等会你可能会需要更新 HISTTIMEFORMAT 环境变量来显示这些命令被执行的时间。对要不然光看到一堆不知道啥时候执行的命令,同样会令人抓狂的。
四、现在在运行的进程是啥?
$ pstree -a
这都是查看现有进程的。 ps aux 的结果比较杂乱, pstree -a 的结果比较简单明了,可以看到正在运行的进程及相关用户。
五、监听的网络服务
$ netstat -ntlp
$ netstat -nulp
$ netstat -nxlp
我一般都分开运行这三个命令,不想一下子看到列出一大堆所有的服务。netstat -nalp倒也可以。不过我绝不会用 numeric 选项 (鄙人一点浅薄的看法:IP 地址看起来更方便)。
找到所有正在运行的服务,检查它们是否应该运行。查看各个监听端口。在netstat显示的服务列表中的PID 和 ps aux 进程列表中的是一样的。
如果服务器上有好几个Java或者Erlang什么的进程在同时运行,能够按PID分别找到每个进程就很重要了。
通常我们建议每台服务器上运行的服务少一点,必要时可以增加服务器。如果你看到一台服务器上有三四十个监听端口开着,那还是做个记录,回头有空的时候清理一下,重新组织一下服务器。
六、CPU 和内存
注意以下问题:
还有空余的内存吗? 服务器是否正在内存和硬盘之间进行swap?
还有剩余的CPU吗? 服务器是几核的? 是否有某些CPU核负载过多了?
服务器最大的负载来自什么地方? 平均负载是多少?
$ dmidecode
有很多服务器还是裸机状态,可以看一下:
找到RAID 卡 (是否带BBU备用电池?)、 CPU、空余的内存插槽。根据这些情况可以大致了解硬件问题的来源和性能改进的办法。
网卡是否设置好? 是否正运行在半双工状态? 速度是10MBps? 有没有 TX/RX 报错?
八、IO 性能
$ iostat -kx 2
$ vmstat 2 10
$ mpstat 2 10
$ dstat --top-io --top-bio
这些命令对于调试后端性能非常有用。
检查磁盘使用量:服务器硬盘是否已满?
是否开启了swap交换模式 (si/so)?
CPU被谁占用:系统进程? 用户进程? 虚拟机?
dstat 是我的最爱。用它可以看到谁在进行 IO: 是不是MySQL吃掉了所有的系统资源? 还是你的PHP进程?
九、挂载点 和 文件系统
$ cat /etc/fstab
$ lsof +D / /* beware not to kill your box */
一共挂载了多少文件系统?
有没有某个服务专用的文件系统? (比如MySQL?)
文件系统的挂载选项是什么: noatime? default? 有没有文件系统被重新挂载为只读模式了?
磁盘空间是否还有剩余?
是否有大文件被删除但没有清空?
如果磁盘空间有问题,你是否还有空间来扩展一个分区?
十、内核、中断和网络
$ sysctl -a | grep ...
$ cat /proc/interrupts
$ cat /proc/net/ip_conntrack /* may take some time on busy servers */
你的中断请求是否是均衡地分配给CPU处理,还是会有某个CPU的核因为大量的网络中断请求或者RAID请求而过载了?
SWAP交换的设置是什么?对于工作站来说swappinness 设为 60 就很好, 不过对于服务器就太糟了:你最好永远不要让服务器做SWAP交换,不然对磁盘的读写会锁死SWAP进程。
conntrack_max 是否设的足够大,能应付你服务器的流量?
在不同状态下(TIME_WAIT, …)TCP连接时间的设置是怎样的?
如果要显示所有存在的连接,netstat 会比较慢, 你可以先用 ss 看一下总体情况。
你还可以看一下 Linux TCP tuning 了解网络性能调优的一些要点。
十一、系统日志和内核消息
$ less /var/log/messages
$ less /var/log/secure
$ less /var/log/auth
查看错误和警告消息,比如看看是不是很多关于连接数过多导致?
看看是否有硬件错误或文件系统错误?
分析是否能将这些错误事件和前面发现的疑点进行时间上的比对。
十二、定时任务
$ ls /etc/cron* + cat
$ for user in $(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $ done
是否有某个定时任务运行过于频繁?
是否有些用户提交了隐藏的定时任务?
在出现故障的时候,是否正好有某个备份任务在执行?
十三、应用系统日志
这里边可分析的东西就多了, 不过恐怕你作为运维人员是没功夫去仔细研究它的。关注那些明显的问题,比如在一个典型的LAMP(Linux+Apache+Mysql+Perl)应用环境里:
Apache & N 查找访问和错误日志, 直接找 5xx 错误, 再看看是否有 limit_zone 错误。
MySQL; 在mysql.log找错误消息,看看有没有结构损坏的表, 是否有innodb修复进程在运行,是否有disk/index/query 问题.
PHP-FPM; 如果设定了 php-slow 日志, 直接找错误信息 (php, mysql, memcache, …),如果没设定,赶紧设定。
V 在varnishlog 和 varnishstat 里, 检查 hit/miss比. 看看配置信息里是否遗漏了什么规则,使最终用户可以直接攻击你的后端?
HA-P 后端的状况如何?健康状况检查是否成功?是前端还是后端的队列大小达到最大值了?
经过这5分钟之后,你应该对如下情况比较清楚了:
在服务器上运行的都是些啥?
这个故障看起来是和 IO/硬件/网络 或者 系统配置 (有问题的代码、系统内核调优, …)相关。
这个故障是否有你熟悉的一些特征?比如对数据库索引使用不当,或者太多的apache后台进程。
你甚至有可能找到真正的故障源头。就算还没有找到,搞清楚了上面这些情况之后,你现在也具备了深挖下去的条件。继续努力吧!
原文链接:First 5 Minutes Troubleshooting A Server
发布于 2年前,
阅读(68) | 评论(0) |
投票(0) | 收藏(3)}

我要回帖

更多关于 java判断字符串相同 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信