锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 2011-02-19 xiao H Posted in 緋葷粺綆$悊 閿欒鎻愮ず錛?/p> 涓婇潰鐨勬柟娉曚笉琛屽彲浠ヨ瘯璇曚笅闈㈣繖涓?/p> 緇堟瀬澶ф硶 浠ヤ笂鏂規(guī)硶鏉ヨ嚜錛?/p> http://forum.ubuntu.org. 鏈漢鐨勭郴緇熼粯璁ゆ槸鍛戒護(hù)琛岀晫闈㈠惎鍔ㄧ殑銆備簬鏄噸鍚互RunLevel 5榪涘叆鍥懼艦鐣岄潰銆傚彂鐜板浘褰㈢晫闈㈠彲浠ユ甯歌繘鍏ャ備笅闈㈠氨鏌ヨ鏃ュ織鍚э細(xì) 鍦ㄦ棩蹇楁枃浠朵腑錛屾垜鐪嬪埌浜嗗涓嬩俊鎭細(xì) PAM unable to dlopen(/lib/security/pam_limits.so) PAM [error: /lib/security/pam_limits.so: wrong ELF class: ELFCLASS32] PAM adding faulty module: /lib/security/pam_limits.so pam_unix(login:session): session opened for user Oracle by LOGIN(uid=0) Module is unknown 鐪嬪埌榪欓噷錛屾垜鎯寵搗鎴戝湪/etc/pam.d/login涓姞鍏ヤ簡: session required /lib/security/pam_limits.so session required pam_limits.so 涓ゆ潯閰嶇疆璇彞銆傛牴鎹棩蹇椾俊鎭互涓奓ogin涓婄殑鍏朵粬閰嶇疆淇℃伅錛屽皢絎竴鏉¤鍙ユ敞閲婃帀錛?br /> #session required /lib/security/pam_limits.so session required pam_limits.so 閲嶅惎錛岀櫥褰曪紝涓鍒囨甯搞傞棶棰樿В鍐熾?/p> ########################鏇存柊##########################33 浠ヤ笂闂鐨勫嚭鐜版槸鐢變簬鎿嶄綔緋葷粺鐨勯棶棰樸傛垜鏈兂瀹夎32浣峜entos錛岀粨鏋滈敊鎵嬫嬁浜嗕竴涓?4bit Centos瀹夎錛岀劧鍚庢寜鐓?2浣嶇殑閰嶇疆榪涜浜嗛厤緗傛紜厤緗湪64浣嶄笅搴斾負(fù)錛?/p>
Linux Signals are:
As noted above, processes can ignore, block, or catch all signals except
SIGSTOP and SIGKILL. If a process catches a signal, it means that it
includes code that will take appropriate action when the signal is
received. If the signal is not caught by the process, the kernel will
take default action for the signal.
FIFOs are permanent objects and can be created using the mkfifo(1) or
mknod(1) command. Inside the program, the FIFO can be created using the
mknod command, then opened and read from or written to just like a
normal file. The FIFO is normally in blocking mode when attempting to
perform read operations. 寮曠敤鑷細(xì)http://www.comptechdoc.org/os/linux/programming/linux_pgsignals.html 鍦ㄧ粓绔嬌鐢╧ill -l 鍛戒護(hù)鍙互鏄劇ず鎵鏈夌殑淇″彿銆?br>
$kill -l 鍏朵腑鍓嶉潰31涓俊鍙蜂負(fù)涓嶅彲闈犱俊鍙?闈炲疄鏃剁殑錛屽彲鑳戒細(xì)鍑虹幇淇″彿鐨勪涪澶?錛屽悗闈㈢殑淇″彿涓哄彲闈犱俊鍙?瀹炴椂鐨剅eal_time,瀵逛俊鍙?br>
鎺掗槦錛屼笉浼?xì)涓㈠?銆?/strong> 1) SIGHUP (鎸傝搗) 褰撹繍琛岃繘紼嬬殑鐢ㄦ埛娉ㄩ攢鏃墮氱煡璇ヨ繘紼嬶紝浣胯繘紼嬬粓姝?/strong> 2) SIGINT (涓柇) 褰撶敤鎴鋒寜涓嬫椂,閫氱煡鍓嶅彴榪涚▼緇勭粓姝㈣繘紼?/strong> 3) SIGQUIT (閫鍑? 鐢ㄦ埛鎸変笅鎴栨椂閫氱煡榪涚▼錛屼嬌榪涚▼緇堟 4) SIGILL (闈炴硶鎸囦護(hù)) 鎵ц浜嗛潪娉曟寚浠わ紝濡傚彲鎵ц鏂囦歡鏈韓鍑虹幇閿欒銆佽瘯鍥炬墽琛屾暟鎹銆佸爢鏍堟孩鍑?/strong> 5) SIGTRAP 鐢辨柇鐐規(guī)寚浠ゆ垨鍏跺畠trap鎸囦護(hù)浜х敓. 鐢眃ebugger浣跨敤 6) SIGABRT (寮傚父涓) 璋冪敤abort鍑芥暟鐢熸垚鐨勪俊鍙?/strong> 7) SIGBUS 闈炴硶鍦板潃, 鍖呮嫭鍐呭瓨鍦板潃瀵歸綈(alignment)鍑洪敊. eg: 璁塊棶涓涓洓涓瓧闀跨殑鏁存暟, 浣嗗叾鍦板潃涓嶆槸4鐨勫嶆暟. 8) SIGFPE (綆楁湳寮傚父) 鍙戠敓鑷村懡綆楁湳榪愮畻閿欒,鍖呮嫭嫻偣榪愮畻閿欒銆佹孩鍑哄強(qiáng)闄ゆ暟涓?. 9) SIGKILL (紜鏉姝? 褰撶敤鎴烽氳繃kill -9鍛戒護(hù)鍚戣繘紼嬪彂閫佷俊鍙鋒椂錛屽彲闈犵殑緇堟榪涚▼ 10) SIGUSR1 鐢ㄦ埛浣跨敤 11) SIGSEGV (孌佃秺鐣? 褰撹繘紼嬪皾璇曡闂笉灞炰簬鑷繁鐨勫唴瀛樼┖闂村鑷村唴瀛橀敊璇椂錛岀粓姝㈣繘紼?/strong> 12) SIGUSR2 鐢ㄦ埛浣跨敤 13) SIGPIPE 鍐欒嚦鏃犺榪涚▼鐨勭閬? 鎴栬匰ocket閫氫俊SOCT_STREAM鐨勮榪涚▼宸茬粡緇堟錛岃屽啀鍐欏叆銆?/strong> 14) SIGALRM (瓚呮椂) alarm鍑芥暟浣跨敤璇ヤ俊鍙鳳紝鏃墮挓瀹氭椂鍣ㄨ秴鏃跺搷搴?/strong> 15) SIGTERM (杞腑鏂? 浣跨敤涓嶅甫鍙傛暟鐨刱ill鍛戒護(hù)鏃剁粓姝㈣繘紼?/strong> 17) SIGCHLD (瀛愯繘紼嬬粨鏉? 褰撳瓙榪涚▼緇堟鏃墮氱煡鐖惰繘紼?/strong> 18) SIGCONT (鏆傚仠榪涚▼緇х畫) 璁╀竴涓仠姝?stopped)鐨勮繘紼嬬戶緇墽琛? 鏈俊鍙蜂笉鑳借闃誨. 19) SIGSTOP (鍋滄) 浣滀笟鎺у埗淇″彿,鏆傚仠鍋滄(stopped)榪涚▼鐨勬墽琛? 鏈俊鍙蜂笉鑳借闃誨, 澶勭悊鎴栧拷鐣? 20) SIGTSTP (鏆傚仠/鍋滄) 浜や簰寮忓仠姝俊鍙? Ctrl-Z 鍙戝嚭榪欎釜淇″彿 21) SIGTTIN 褰撳悗鍙頒綔涓氳浠庣敤鎴風(fēng)粓绔鏁版嵁鏃? 緇堢椹卞姩紼嬪簭浜х敓SIGTTIN淇″彿 22) SIGTTOU 褰撳悗鍙頒綔涓氳寰鐢ㄦ埛緇堢鍐欐暟鎹椂, 緇堢椹卞姩紼嬪簭浜х敓SIGTTOU淇″彿 23) SIGURG 鏈?绱ф?鏁版嵁鎴栫綉緇滀笂甯﹀鏁版嵁鍒拌揪socket鏃朵駭鐢? 24) SIGXCPU 瓚呰繃CPU鏃墮棿璧勬簮闄愬埗. 榪欎釜闄愬埗鍙互鐢眊etrlimit/setrlimit鏉ヨ鍙?鏀瑰彉銆?/strong> 25) SIGXFSZ 褰撹繘紼嬩紒鍥炬墿澶ф枃浠朵互鑷充簬瓚呰繃鏂囦歡澶у皬璧勬簮闄愬埗銆?/strong> 26) SIGVTALRM 铏氭嫙鏃墮挓淇″彿. 綾諱技浜嶴IGALRM, 浣嗘槸璁$畻鐨勬槸璇ヨ繘紼嬪崰鐢ㄧ殑CPU鏃墮棿. 27) SIGPROF (姊楁鏃墮棿瓚呮椂) setitimer(2)鍑芥暟璁劇疆鐨勬姒傜粺璁¢棿闅旇鏃跺櫒(profiling interval timer) 28) SIGWINCH 紿楀彛澶у皬鏀瑰彉鏃跺彂鍑? 29) SIGIO(寮傛I/O) 鏂囦歡鎻忚堪絎﹀噯澶囧氨緇? 鍙互寮濮嬭繘琛岃緭鍏?杈撳嚭鎿嶄綔. 30) SIGPWR 鐢墊簮澶辨晥/閲嶅惎鍔?/strong> 31) SIGSYS 闈炴硶鐨勭郴緇熻皟鐢ㄣ?/strong> 鍦ㄤ互涓婂垪鍑虹殑淇″彿涓紝 姝ゅ錛孲IGIO鍦⊿VR4鏄鍑猴紝鍦?.3BSD涓槸蹇界暐錛汼IGCONT鍦ㄨ繘紼嬫寕璧鋒椂鏄戶緇紝鍚﹀垯鏄拷鐣ワ紝涓嶈兘琚樆濉炪?/strong> 鍦║nix/Linux涓璼ignal鍑芥暟鏄瘮杈冨鏉傜殑涓涓?鍏跺畾涔夊師鍨嬪涓? gdb瀵逛簬澶氱嚎紼嬬▼搴忕殑璋冭瘯鏈夊涓嬬殑鏀寔錛?br>銆銆 銆愬懡浠ゃ憈ime 鈥?鎵ц鍛戒護(hù)騫惰鏃?/span> 銆愭牸寮忋憈ime [-p] command [arguments...] 銆愯鏄庛?/span> 鎵ц鍛戒護(hù)琛?command [arguments...]"錛屽懡浠よ鎵ц緇撴潫鏃跺湪鏍囧噯杈撳嚭涓墦鍗版墽琛岃鍛戒護(hù)琛岀殑鏃墮棿緇熻緇撴灉錛屽叾緇熻緇撴灉鍖呭惈浠ヤ笅鏁版嵁錛?/font> 1)瀹為檯鏃墮棿(real time): 浠巆ommand鍛戒護(hù)琛屽紑濮嬫墽琛屽埌榪愯緇堟鐨勬秷閫濇椂闂達(dá)紱 2)鐢ㄦ埛CPU鏃墮棿(user CPU time): 鍛戒護(hù)鎵ц瀹屾垚鑺辮垂鐨勭敤鎴稢PU鏃墮棿錛屽嵆鍛戒護(hù)鍦ㄧ敤鎴鋒佷腑鎵ц鏃墮棿鎬誨拰錛?/font> 3)緋葷粺CPU鏃墮棿(system CPU time): 鍛戒護(hù)鎵ц瀹屾垚鑺辮垂鐨勭郴緇烠PU鏃墮棿錛屽嵆鍛戒護(hù)鍦ㄦ牳蹇冩佷腑鎵ц鏃墮棿鎬誨拰銆?/font> 鍏朵腑錛岀敤鎴稢PU鏃墮棿鍜岀郴緇烠PU鏃墮棿涔嬪拰涓篊PU鏃墮棿錛屽嵆鍛戒護(hù)鍗犵敤CPU鎵ц鐨勬椂闂存誨拰銆傚疄闄呮椂闂磋澶т簬CPU鏃墮棿錛屽洜涓篖inux鏄浠誨姟鎿嶄綔緋葷粺錛屽線寰鍦ㄦ墽琛屼竴鏉″懡浠ゆ椂錛岀郴緇熻繕瑕佸鐞嗗叾瀹冧換鍔°?/font> 鍙︿竴涓渶瑕佹敞鎰忕殑闂鏄嵆浣挎瘡嬈℃墽琛岀浉鍚屽懡浠わ紝浣嗘墍鑺辮垂鐨勬椂闂翠篃鏄笉涓鏍鳳紝鍏惰姳璐規(guī)椂闂存槸涓庣郴緇熻繍琛岀浉鍏崇殑銆?/font> 渚?錛?/font> 1. # time date 鍦ㄤ緥1涓紝鎵ц鍛戒護(hù)"time date"(瑙佺1琛?銆傜郴緇熷厛鎵ц鍛戒護(hù)"date"錛岀2琛屼負(fù)鍛戒護(hù)"date"鐨勬墽琛岀粨鏋溿傜3-6琛屼負(fù)鎵ц鍛戒護(hù)"date"鐨勬椂闂寸粺璁$粨鏋滐紝鍏朵腑絎? 琛?real"涓哄疄闄呮椂闂達(dá)紝絎?琛?user"涓虹敤鎴稢PU鏃墮棿錛岀6琛?sys"涓虹郴緇烠PU鏃墮棿銆備互涓婁笁縐嶆椂闂寸殑鏄劇ず鏍煎紡鍧囦負(fù) MMmNN[.FFF]s銆?/font> 鍦ㄤ緥1涓紝CPU鏃墮棿 = 鐢ㄦ埛CPU鏃墮棿 + 緋葷粺CPU鏃墮棿 = 0m0.010s + 0m0.070s = 0m0.080s錛屽疄闄呮椂闂村ぇ浜嶤PU鏃墮棿錛岃鏄庡湪date鍛戒護(hù)榪愯鐨勫悓鏃訛紝榪樻湁鍏跺畠浠誨姟鍦ㄨ繍琛屻?/font> 銆愬弬鏁拌鏄庛?/span> -p 浠OSIX緙虹渷鐨勬椂闂存牸寮忔墦鍗版椂闂寸粺璁$粨鏋滐紝鍗曚綅涓虹銆傝緇嗙殑杈撳嚭鏍煎紡瑙佷緥2銆?/font> 渚?錛?/font> 鍦ㄤ緥2涓紝鍚屾牱鎵ц鍛戒護(hù)"time date"(瑙佺1琛?銆傜郴緇熷厛鎵ц鍛戒護(hù) "date"錛岀2琛屼負(fù)璇ュ懡浠ょ殑鎵ц緇撴灉銆傜3-5琛屼負(fù)鎵ц鍛戒護(hù)"date"鐨勬椂闂寸粺璁$粨鏋溿傛敞鎰忔湰渚嬬殑鏃墮棿鏍煎紡涓庝緥1涓殑鏃墮棿鏍煎紡宸埆錛屼嬌鐢?p 鍙傛暟鍚庣殑鏃墮棿鏄劇ず鏍煎紡涓篘N.FF錛屽叾鍗曚綅涓虹銆?/font> 銆愮浉鍏崇幆澧冨彉閲忚鏄庛?/span> TIMEFORMAT 鑷畾涔夎緭鍑虹殑鏃墮棿鏍煎紡銆?/font> 鎴戜滑涔熷彲浠ラ氳繃鐜鍙橀噺TIMEFORMAT鏉ヨ嚜瀹氫箟杈撳嚭鐨勬椂闂存牸寮廩1]銆傛牸寮忎腑浣跨敤鍜屾爣鍑咰涓殑鍑芥暟printf涓鑷寸殑杞箟絎︼紝浠ュ強(qiáng)浣跨敤浠ヤ笅鐨勮漿涔夊簭鍒楁潵鎸囧畾杈撳嚭鐨勬椂闂存牸寮忥細(xì) 鍏朵腑錛岄夐」prec涓烘寚瀹氭椂闂寸簿搴︼紝鍗沖皬鏁扮偣鍚庨潰鐨勪綅鏁幫紱閫夐」l琛ㄧず浣跨敤鍒嗙(鍏蜂綋鏍煎紡涓猴細(xì)MMmNN[.FFF]s)鐨勬牸寮忥紱鏈鍚庝竴涓瓧絎﹁〃紺烘椂闂寸殑綾誨瀷錛屽叾涓璕琛ㄧず瀹為檯鏃墮棿錛孶琛ㄧず鐢ㄦ埛CPU鏃墮棿錛孲琛ㄧず緋葷粺CPU 鏃墮棿錛屽畠浠殑鍗曚綅鍧囦負(fù)縐掋?/font> time鍛戒護(hù)緙虹渷杈撳嚭鐨勬椂闂存牸寮忓悓 TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'銆?/font> 浣跨敤-p鍙傛暟鐨則ime鍛戒護(hù)杈撳嚭鐨勬椂闂存牸寮忓悓 TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'銆?/font> 渚?錛?/font> 姣旇緝渚?鍜屼緥3鏄劇ず緇撴灉錛屽緢瀹規(guī)槗鍙戠幇渚?铏界劧娌℃湁浣跨敤鍙傛暟-p錛屼絾鍏惰緭鍑虹殑緇撴灉鍜屼緥2涓妯′竴鏍楓?/font> 褰撶劧錛屾垜浠篃鍙互淇敼涓轟換浣曡嚜宸卞枩嬈㈢殑鏃墮棿鏍煎紡銆?/font> 渚?錛?/font> 渚?鐨勭4-8琛屾鏄垜浠嚜瀹氫箟鐨勮緭鍑烘牸寮忋?/font> 浠庝互涓婁粙緇嶄簡涓夌鎸囧畾鏃墮棿鏍煎紡鐨勬柟娉曪紝鍗崇己鐪佺殑鏃墮棿鏍煎紡銆佷嬌鐢ㄥ弬鏁?p鐨凱OSIX緙虹渷鐨勬椂闂存牸寮忓拰璁懼畾鐜鍙橀噺TIMEFORMAT鑷畾涔夌殑鏃墮棿鏍煎紡錛孡inux緋葷粺浣跨敤鐨勫厛鍚庨『搴忓涓嬶細(xì) 1.鍙傛暟-p鐨凱OSIX緙虹渷鏃墮棿鏍煎紡錛?/font> 2.鐜鍙橀噺TIMEFORMAT鑷畾涔夌殑鏃墮棿鏍煎紡錛?/font> 3.緙虹渷鐨勬椂闂存牸寮忋?/font> 銆愰鍑虹姸鎬佽鏄庛?/span> 濡傛灉鑳芥墽琛宑ommand鍛戒護(hù)錛屽垯榪斿洖璇ュ懡浠ょ殑閫鍑虹姸鎬侊紝鍚﹀垯榪斿洖濡備笅鐨勯鍑虹姸鎬佸鹼細(xì) 127 鍛戒護(hù)鏈壘鍒?/font> 126 鍛戒護(hù)鎵懼埌錛屼絾涓嶈兘鎵ц 1-125 鍏跺畠閿欒Ubuntu 鏇存柊婧愮鍚嶉敊璇?–BADSIG 40976EAF437D05B5
GPG 閿欒錛歨ttp://mirrors.163.com maverick-updates Release: 涓嬪垪絳懼悕鏃犳晥錛?BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <ftpmaster @ubuntu.com> </ftpmaster>
淇鏂規(guī)硶 gpg --keyserver keyserver.ubuntu.com --recv 40976EAF437D05B5 gpg --export --armor 40976EAF437D05B5 | sudo apt-key add -
sudo aptitude -o Acquire::http::No-Cache=True -o Acquire::BrokenProxy=true update
sudo apt-get clean cd /var/lib/apt sudo mv lists lists.old sudo mkdir -p lists/partial sudo apt-get clean sudo apt-get update
杞嚜錛?br />
]]> 1: # cd /var/log/
2: #cat security
1: session required /lib64/security/pam_limits.so
2:
3: session required pam_limits.so
杞嚜錛?div>http://www.zhaofengcao.com/archives/138
]]>
I was about to try the CD startup when I tried one last thing again.
sudo mdadm --stop /dev/md0
It worked, but I find it strange because I did it before and md0 did not appear in the fdisk -l screen.
Immdiately after that I was able to run the sudo mkfs.ext3 /dev/sdc
Maybe it is because I ran the zero-superblock tasks overnight - something that made me nervous, since I have no idea what it does.
Than You for your help!
It worked for me. Thanks!
]]>
Signal Name
Number
Description
SIGHUP
1
Hangup (POSIX)
SIGINT
2
Terminal interrupt (ANSI)
SIGQUIT
3
Terminal quit (POSIX)
SIGILL
4
Illegal instruction (ANSI)
SIGTRAP
5
Trace trap (POSIX)
SIGIOT
6
IOT Trap (4.2 BSD)
SIGBUS
7
BUS error (4.2 BSD)
SIGFPE
8
Floating point exception (ANSI)
SIGKILL
9
Kill(can't be caught or ignored) (POSIX)
SIGUSR1
10
User defined signal 1 (POSIX)
SIGSEGV
11
Invalid memory segment access (ANSI)
SIGUSR2
12
User defined signal 2 (POSIX)
SIGPIPE
13
Write on a pipe with no reader, Broken pipe (POSIX)
SIGALRM
14
Alarm clock (POSIX)
SIGTERM
15
Termination (ANSI)
SIGSTKFLT
16
Stack fault
SIGCHLD
17
Child process has stopped or exited, changed (POSIX)
SIGCONT
18
Continue executing, if stopped (POSIX)
SIGSTOP
19
Stop executing(can't be caught or ignored) (POSIX)
SIGTSTP
20
Terminal stop signal (POSIX)
SIGTTIN
21
Background process trying to read, from TTY (POSIX)
SIGTTOU
22
Background process trying to write, to TTY (POSIX)
SIGURG
23
Urgent condition on socket (4.2 BSD)
SIGXCPU
24
CPU limit exceeded (4.2 BSD)
SIGXFSZ
25
File size limit exceeded (4.2 BSD)
SIGVTALRM
26
Virtual alarm clock (4.2 BSD)
SIGPROF
27
Profiling alarm clock (4.2 BSD)
SIGWINCH
28
Window size change (4.3 BSD, Sun)
SIGIO
29
I/O now possible (4.2 BSD)
SIGPWR
30
Power failure restart (System V)
FIFOs
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
紼嬪簭涓嶅彲鎹曡幏銆侀樆濉炴垨蹇界暐鐨勪俊鍙鋒湁錛歋IGKILL,SIGSTOP
涓嶈兘鎭㈠鑷抽粯璁ゅ姩浣滅殑淇″彿鏈夛細(xì)SIGILL,SIGTRAP
榛樿浼?xì)瀵艰嚧杩浗E嬫祦浜х殑淇″彿鏈夛細(xì)SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
榛樿浼?xì)瀵艰嚧杩浗E嬮鍑虹殑淇″彿鏈夛細(xì)SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
榛樿浼?xì)瀵艰嚧杩浗E嬪仠姝㈢殑淇″彿鏈夛細(xì)SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
榛樿榪涚▼蹇界暐鐨勪俊鍙鋒湁錛歋IGCHLD,SIGPWR,SIGURG,SIGWINCH
void (*signal(int signo,void (*func)(int))) (int)
榪欎釜鍑芥暟涓?鏈澶栧眰鐨勫嚱鏁頒綋
void (* XXX )(int)琛ㄦ槑鏄竴涓寚閽?鎸囧悜涓涓嚱鏁癤XX鐨勬寚閽?XXX鎵浠h〃鐨勫嚱鏁伴渶瑕佷竴涓猧nt鍨嬬殑鍙傛暟,榪斿洖void
signal(int signo, void(*func)(int))鏄痵ignal鍑芥暟鐨勪富浣?
闇瑕佷袱涓弬鏁癷nt鍨嬬殑signo浠ュ強(qiáng)涓涓寚鍚戝嚱鏁扮殑鍑芥暟.
void (*func)(int).
姝f槸鐢變簬鍏跺鏉傛?鍦╗Plauger 1992]鐢╰ypedef鏉ュ鍏惰繘琛岀畝鍖?br>
typedef void Sigfuc(int);//榪欓噷鍙互鐪嬫垚涓涓繑鍥炲?.
鍐嶅signal鍑芥暟榪涜綆鍖栧氨鏄繖鏍風(fēng)殑浜?br>
Sigfunc *signal(int,Sigfuc *);
鍦╯ignal.h澶存枃浠朵腑榪樻湁浠ヤ笅鍑犱釜瀹氫箟
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?/strong> http://blog.csdn.net/nevercgoodbye/archive/2008/11/25/3367853.aspx
]]>
銆銆綰跨▼浜х敓閫氱煡錛氬湪浜х敓鏂扮殑綰跨▼鏃? gdb浼?xì)缁欏嚭鎻惤C轟俊鎭?br>銆銆(gdb) r
銆銆Starting program: /root/thread
銆銆[New Thread 1073951360 (LWP 12900)]
銆銆[New Thread 1082342592 (LWP 12907)]---浠ヤ笅涓変釜涓烘柊浜х敓鐨勭嚎紼?br>銆銆[New Thread 1090731072 (LWP 12908)]
銆銆[New Thread 1099119552 (LWP 12909)]
銆銆
銆銆鏌ョ湅綰跨▼錛氫嬌鐢╥nfo threads鍙互鏌ョ湅榪愯鐨勭嚎紼嬨?br>銆銆(gdb) info threads
銆銆 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb)
銆銆
銆銆
銆銆娉ㄦ剰錛岃棣栫殑钃濊壊鏂囧瓧涓篻db鍒嗛厤鐨勭嚎紼嬪彿錛屽綰跨▼榪涜鍒囨崲鏃訛紝浣跨敤璇ヨ鍙風(fēng)爜錛岃屼笉鏄笂鏂囨爣鍑虹殑緇胯壊鏁板瓧銆?br>銆銆
銆銆鍙﹀錛岃棣栫殑綰㈣壊鏄熷彿鏍囪瘑浜嗗綋鍓嶆椿鍔ㄧ殑綰跨▼
銆銆
銆銆鍒囨崲綰跨▼錛氫嬌鐢?thread THREADNUMBER 榪涜鍒囨崲錛孴HREADNUMBER 涓轟笂鏂囨彁鍒扮殑綰跨▼鍙楓備笅渚嬫樉紺哄皢媧誨姩綰跨▼浠?1 鍒囨崲鑷?4銆?br>銆銆(gdb) info threads
銆銆 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb) thread 4
銆銆[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0 0xffffe002 in ?? ()
銆銆(gdb) info threads
銆銆* 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
銆銆 3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
銆銆 2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
銆銆 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
銆銆(gdb)
銆銆
銆銆
銆銆 浠ヤ笂鍗充負(fù)浣跨敤gdb鎻愪緵鐨勫澶氱嚎紼嬭繘琛岃皟璇曠殑涓浜涘熀鏈懡浠ゃ傚彟澶栵紝gdb涔熸彁渚涘綰跨▼鐨勬柇鐐硅緗互鍙?qiáng)瀵规寚瀹氭垨鎵鏈夌嚎紼嬪彂甯冨懡浠ょ殑鍛戒護(hù)銆?br>銆銆
銆銆 鍒濇鎺ヨЕgdb涓嬪綰跨▼鐨勮皟璇曪紝寰寰浼?xì)蹇借gdb涓椿鍔ㄧ嚎紼嬬殑姒傚康銆備竴鑸潵璁詫紝鍦ㄤ嬌鐢╣db璋冭瘯鐨勬椂鍊欙紝鍙湁涓涓嚎紼嬩負(fù)媧誨姩綰跨▼錛屽鏋滃笇鏈涘緱鍒板叾浠栫殑綰跨▼鐨勮緭鍑虹粨鏋滐紝蹇呴』浣跨敤thread鍛戒護(hù)鍒囨崲鑷蟲寚瀹氱殑綰跨▼錛屾墠鑳藉璇ョ嚎紼嬭繘琛岃皟璇曟垨瑙傚療杈撳嚭緇撴灉銆?/p>
]]>
2. Sun Mar 26 22:45:34 GMT-8 2006
3.
4. real 0m0.136s
5. user 0m0.010s
6. sys 0m0.070s
7. #
2. Wed Mar 27 00:33:11 GMT-8 2006
3. real 0.11
4. user 0.00
5. sys 0.02
6. #
2. # time date
3. Wed Mar 27 00:52:03 GMT-8 2006
4. real 0.04
5. user 0.00
6. sys 0.01
7. #
2. # time date
3. Wed Mar 27 01:09:26 GMT-8 2006
4.
5. Hello, ThinkerABC!
6. real time : 0m0.016s
7. user CUP time : 0m0.006s
8. system CPU time : 0m0.008s
9. #
]]>
]]>
3.1 寤虹珛璋冭瘯鍏崇郴
鐢╣db璋冭瘯紼嬪簭錛屽彲浠ョ洿鎺db ./test,涔熷彲浠db <pid>(test鐨勮繘紼嬪彿)銆傝繖瀵瑰簲鐫浣跨敤ptrace寤虹珛璺熻釜鍏崇郴鐨勪袱縐嶆柟寮?
1)fork: 鍒╃敤fork+execve鎵ц琚祴璇曠殑紼嬪簭錛屽瓙榪涚▼鍦ㄦ墽琛宔xecve涔嬪墠璋冪敤ptrace(PTRACE_TRACEME)錛屽緩绔嬩簡涓庣埗榪涚▼(debugger)鐨勮窡韙叧緋匯傚鎴戜滑鍦ㄥ垎鏋恠trace鏃舵墍紺烘剰鐨勭▼搴忋?br>2)attach:
debugger鍙互璋冪敤ptrace(PTRACE_ATTACH錛宲id,...)錛屽緩绔嬭嚜宸變笌榪涚▼鍙蜂負(fù)pid鐨勮繘紼嬮棿鐨勮窡韙叧緋匯傚嵆鍒╃敤
PTRACE_ATTACH錛屼嬌鑷繁鍙樻垚琚皟璇曠▼搴忕殑鐖惰繘紼?鐢╬s鍙互鐪嬪埌)銆傜敤attach寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝鍙互璋冪敤ptrace
(PTRACE_DETACH錛宲id,...)鏉ヨВ闄ゃ傛敞鎰廰ttach榪涚▼鏃剁殑鏉冮檺闂錛屽涓涓潪root鏉冮檺鐨勮繘紼嬫槸涓嶈兘attach鍒頒竴涓?
root榪涚▼涓婄殑銆?br>
3.2 鏂偣鍘熺悊
鏂偣鏄ぇ瀹跺湪璋冭瘯紼嬪簭鏃跺父鐢ㄧ殑涓涓姛鑳?濡俠reak linenumber錛屽綋鎵ц鍒發(fā)inenumber閭d竴琛岀殑鏃跺欒璋冭瘯紼嬪簭浼?xì)鍋滄锛尳{夊緟debugger鐨勮繘涓姝ユ搷浣溿?
鏂偣鐨勫疄鐜板師鐞嗭紝灝辨槸鍦ㄦ寚瀹氱殑浣嶇疆鎻掑叆鏂偣鎸囦護(hù)錛屽綋琚皟璇曠殑紼嬪簭榪愯鍒版柇鐐圭殑鏃跺欙紝浜х敓SIGTRAP淇″彿銆傝淇″彿琚玤db鎹曡幏騫惰繘琛屾柇鐐瑰懡涓垽瀹氾紝褰揼db鍒ゆ柇鍑鴻繖嬈IGTRAP鏄柇鐐瑰懡涓箣鍚庡氨浼?xì)铦{鍏ョ瓑寰呯敤鎴瘋緭鍏ヨ繘琛屼笅涓姝ュ鐞嗭紝鍚﹀垯緇х畫銆?br>鏂偣鐨勮緗師鐞? 鍦ㄧ▼搴忎腑璁劇疆鏂偣錛屽氨鏄厛灝嗚浣嶇疆鐨勫師鏉ョ殑鎸囦護(hù)淇濆瓨錛岀劧鍚庡悜璇ヤ綅緗啓鍏nt 3銆傚綋鎵ц鍒癷nt 3鐨勬椂鍊欙紝鍙戠敓杞腑鏂紝鍐呮牳浼?xì)缁欏瓙杩浗E嬪彂鍑篠IGTRAP淇″彿錛屽綋鐒惰繖涓俊鍙蜂細(xì)琚漿鍙戠粰鐖惰繘紼嬨傜劧鍚庣敤淇濆瓨鐨勬寚浠ゆ浛鎹nt3,絳夊緟鎭㈠榪愯銆?br>鏂偣鍛戒腑鍒ゅ畾:gdb鎶婃墍鏈夌殑鏂偣浣嶇疆閮藉瓨鏀懼湪涓涓摼琛ㄤ腑錛屽懡涓垽瀹氬嵆鎶婅璋冭瘯紼嬪簭褰撳墠鍋滄鐨勪綅緗拰閾捐〃涓殑鏂偣浣嶇疆榪涜姣旇緝錛岀湅鏄柇鐐逛駭鐢熺殑淇″彿錛岃繕鏄棤鍏充俊鍙楓?br>
3.3 鍗曟璺熻釜鍘熺悊
鍗曟璺熻釜灝辨槸鎸囧湪璋冭瘯紼嬪簭鐨勬椂鍊欙紝璁╃▼搴忚繍琛屼竴鏉℃寚浠?璇彞鍚庡氨鍋滀笅銆侴DB涓父鐢ㄧ殑鍛戒護(hù)鏈塶ext, step, nexti, stepi銆傚崟姝ヨ窡韙張甯稿垎涓鴻鍙ュ崟姝?next, step)鍜屾寚浠ゅ崟姝?濡俷exti, stepi)銆?br>
鍦╨inux涓婏紝鎸囦護(hù)鍗曟鍙互閫氳繃ptrace鏉ュ疄鐜般傝皟鐢╬trace(PTRACE_SINGLESTEP,pid,...)鍙互浣胯璋冭瘯鐨勮繘紼嬪湪姣忔墽琛屽畬涓鏉℃寚浠ゅ悗灝辮Е鍙戜竴涓猄IGTRAP淇″彿錛岃GDB榪愯銆備笅闈㈡潵鐪嬩竴涓緥瀛?
child = fork();
if(child == 0) {
execl("./HelloWorld", "HelloWorld", NULL);
}
else {
ptrace(PTRACE_ATTACH,child,NULL,NULL);
while(1){
wait(&val);
if(WIFEXITED(val))
break;
count++;
ptrace(PTRACE_SINGLESTEP,child,NULL,NULL);
}
printf("Total Instruction number= %d\n",count);
}
榪?
孌電▼搴忔瘮杈冪畝鍗曪紝瀛愯繘紼嬭皟鐢╡xecve鎵цHelloWorld,鑰岀埗榪涚▼鍒欏厛璋冪敤ptrace(PTRACE_ATTACH,pid,...)寤虹珛涓?
瀛愯繘紼嬬殑璺熻釜鍏崇郴銆傜劧鍚庤皟鐢╬trace(PTRACE_SINGLESTEP, pid,
...)璁╁瓙榪涚▼涓姝ヤ竴鍋滐紝浠ョ粺璁″瓙榪涚▼涓鍏辨墽琛屼簡澶氬皯鏉℃寚浠?浣犱細(xì)鍙戠幇涓涓畝鍗曠殑HelloWorld瀹為檯涓婁篃鎵ц浜嗗ソ鍑犱竾鏉℃寚浠ゆ墠瀹屾垚)銆傚綋鐒朵綘涔熷畬
鍏ㄥ彲浠ュ湪榪欎釜鏃跺欐煡鐪婨IP瀵勫瓨鍣ㄤ腑瀛樻斁鐨勬寚浠わ紝鎴栬呮煇涓彉閲忕殑鍊鹼紝褰撶劧鍓嶆彁鏄綘寰楃煡閬撹繖涓彉閲忓湪瀛愯繘紼嬪唴瀛橀暅鍍忎腑鐨勪綅緗?br>鎸囦護(hù)鍗曟鍙互渚濋潬紜歡
瀹屾垚錛屽x86鏋舵瀯澶勭悊鍣ㄦ敮鎸佸崟姝ユā寮?閫氳繃璁劇疆EFLAGS瀵勫瓨鍣ㄧ殑TF鏍囧織瀹炵幇)錛屾瘡鎵ц涓鏉℃寚浠わ紝灝變細(xì)浜х敓涓嬈″紓甯?鍦↖ntel
80386浠ヤ笂鐨勫鐞嗗櫒涓婅繕鎻愪緵浜咲Rx璋冭瘯瀵勫瓨鍣ㄤ互鐢ㄤ簬杞歡璋冭瘯)銆備篃鍙互閫氳繃杞歡瀹屾垚錛屽嵆鍦ㄦ瘡鏉℃寚浠ゅ悗闈㈤兘鎻掑叆涓鏉℃柇鐐規(guī)寚浠わ紝榪欐牱姣忔墽琛屼竴鏉℃寚浠ら兘浼?
浜х敓涓嬈¤蔣涓柇銆?br>璇彞鍗曟鍩轟簬鎸囦護(hù)鍗曟瀹炵幇錛屽嵆GDB綆楀ソ姣忔潯璇彞鎵瀵瑰簲鐨勬寚浠わ紝浠庝粈涔堝湴鏂瑰紑濮嬪埌浠涔堝湴鏂圭粨鏉熴傜劧鍚庡湪緇撴潫鐨勫湴鏂規(guī)彃鍏ユ柇鐐癸紝鎴栬呮寚浠ゅ崟姝ヤ竴姝ヤ竴姝ョ殑璧板埌緇撴潫鐐癸紝鍐嶈繘琛屽鐞嗐?br>
褰?
鐒秅db鐨勫疄鐜拌繙姣斾粖澶╂垜浠墍璇寸殑鍐呭瑕佸鏉傦紝瀹冭兘璁╂垜浠緢瀹規(guī)槗鐨勭洃嫻嬶紝淇敼琚皟璇曠殑榪涚▼錛屾瘮濡傞氳繃琛屽彿錛屽嚱鏁板悕錛屽彉閲忓悕銆傝岃鐪熸瀹炵幇榪欎簺錛屼竴鏄渶瑕佸湪
緙栬瘧鐨勬椂鍊欐彁渚涜凍澶熺殑淇℃伅錛屽鍦╣cc鏃跺姞鍏?g閫夐」錛岃繖鏍穏cc浼?xì)鎶婁竴浜涚▼搴忎俊鎭斁鍒扮敓鎴愮殑ELF鏂囦歡涓紝鍖呮嫭鍑芥暟絎﹀彿琛紝琛屽彿錛屽彉閲忎俊鎭紝瀹忓畾涔夌瓑錛?
浠ヤ究鏃ュ悗gdb璋冭瘯錛屽綋鐒剁敓鎴愮殑鏂囦歡涔熶細(xì)澶т竴浜涖備簩鏄渶瑕佹垜浠ELF鏂囦歡鏍煎紡錛岃繘紼嬬殑鍐呭瓨闀滃儚(甯冨眬)浠ュ強(qiáng)紼嬪簭鐨勬寚浠ょ爜鍗佸垎鐔熸?zhèn)夈傝繖鏍鋒墠鑳戒繚璇佸湪姝g‘鐨?
鏃舵満(鏂偣鍙戠敓錛熷崟姝ワ紵)鎵懼埌姝g‘鐨勫唴瀛樺湴鍧(浠g爜錛熸暟鎹紵)騫墮摼鎺ュ洖姝g‘鐨勭▼搴忎唬鐮?榪欐槸鍝釜鍙橀噺錛熺▼搴忕鍑犺錛?銆傛劅鍏磋叮鐨勫悓瀛﹀彲浠ユ壘鍒扮浉搴旂殑浠g爜浠?
緇嗗垎鏋愪竴涓嬨?br>
灝忕粨:
ptrace鍙互瀹炴椂鐩戞祴鍜屼慨鏀瑰彟涓涓繘紼嬬殑榪愯錛屽畠鏄姝ょ殑寮哄ぇ浠ヨ嚦浜庢浘緇忓洜涓哄畠鍦╱nix-like騫沖彴
(濡侺inux,
*BSD)涓婁駭鐢熶簡鍚勭婕忔礊銆備絾鎹㈣█涔嬶紝鍙鎴戜滑鑳芥帉鎻″畠鐨勪嬌鐢紝灝辮兘寮鍙戝嚭寰堝浠ュ墠鍦ㄧ敤鎴鋒佷笅涓嶅彲鑳藉疄鐜扮殑搴旂敤銆傚綋鐒惰繖鍙兘闇瑕佹垜浠帉鎻$紪璇戯紝鏂囦歡鏍?
寮忥紝紼嬪簭鍐呭瓨甯冨眬絳夌浉褰撳鐨勫簳灞傜煡璇嗐?br>
鏈鍚庤鎴戜滑鏉ュ洖欏句竴涓媝trace鐨勪嬌鐢?
1)鐢≒TRACE_ATTACH鎴栬匬TRACE_TRACEME 寤虹珛榪涚▼闂寸殑璺熻釜鍏崇郴銆?br>2)PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSR絳夎鍙栧瓙榪涚▼鍐呭瓨/瀵勫瓨鍣ㄤ腑淇濈暀鐨勫箋?br>3)PTRACE_POKETEXT, PTRACE_POKEDATA, PTRACE_POKEUSR絳夋妸鍊煎啓鍏ュ埌琚窡韙繘紼嬬殑鍐呭瓨/瀵勫瓨鍣ㄤ腑銆?br>4)鐢≒TRACE_CONT錛孭TRACE_SYSCALL, PTRACE_SINGLESTEP鎺у埗琚窡韙繘紼嬩互浣曠鏂瑰紡緇х畫榪愯銆?br>5)PTRACE_DETACH, PTRACE_KILL 鑴辯榪涚▼闂寸殑璺熻釜鍏崇郴銆?br>
TIPS:
1. 榪涚▼鐘舵乀ASK_TRACED鐢ㄤ互琛ㄧず褰撳墠榪涚▼鍥犱負(fù)琚埗榪涚▼璺熻釜鑰岃緋葷粺鍋滄銆?br> 2. 濡傚湪瀛愯繘紼嬬粨鏉熷墠錛岀埗榪涚▼緇撴潫錛屽垯trace鍏崇郴瑙i櫎銆?br> 3. 鍒╃敤attach寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝铏界劧ps鐪嬪埌鍙屾柟涓虹埗瀛愬叧緋伙紝浣嗗湪"瀛愯繘紼?涓皟鐢╣etppid()浠嶄細(xì)榪斿洖鍘熸潵鐨勭埗榪涚▼id銆?br> 4. 涓嶈兘attach鍒拌嚜宸變笉鑳借窡韙殑榪涚▼錛屽non-root榪涚▼璺熻釜root榪涚▼銆?br> 5. 宸茬粡琚玹race鐨勮繘紼嬶紝涓嶈兘鍐嶆琚玜ttach銆?br> 6. 鍗充嬌鏄敤PTRACE_TRACEME寤虹珛璧鋒潵鐨勮窡韙叧緋伙紝涔熷彲浠ョ敤DETACH鐨勬柟寮忎簣浠ヨВ闄ゃ?br> 7. 鍥犱負(fù)榪涘叆/閫鍑虹郴緇熻皟鐢ㄩ兘浼?xì)瑙﹀彂涓嬈IGTRAP錛屾墍浠ラ氬父鐨勫仛娉曟槸鍦ㄧ涓嬈?榪涘叆)鐨勬椂鍊欒鍙栫郴緇熻皟鐢ㄧ殑鍙傛暟錛屽湪絎簩嬈?閫鍑?鐨勬椂鍊欒鍙栫郴緇熻皟鐢ㄧ殑榪斿洖鍊箋備絾娉ㄦ剰execve鏄釜渚嬪銆?br> 8. 紼嬪簭璋冭瘯鏃剁殑鏂偣鐢眎nt 3璁劇疆瀹屾垚錛岃屽崟姝ヨ窡韙垯鍙敱ptrace(PTRACE_SINGLESTEP)瀹炵幇銆?br>
Pthread 08/01/14
鍘熸枃鍦板潃錛歨ttp://blog.csdn.net/Javadino/archive/2008/09/06/2891434.aspx
]]>
2.strace鍙互鏂逛究鐨勫府鍔╂垜浠褰曡繘紼嬫墍鎵ц鐨勭郴緇熻皟鐢紝瀹冩槸濡備綍璺熻釜鍒拌繘紼嬫墽琛岀殑錛?br>3.gdb鏄垜浠皟璇曠▼搴忕殑鍒╁櫒錛屽彲浠ヨ緗柇鐐癸紝鍗曟璺熻釜紼嬪簭銆傚畠鐨勫疄鐜板師鐞嗗張鏄粈涔堬紵
鎵鏈夎繖涓鍒囩殑鑳屽悗閮介殣钘忕潃Linux鎵鎻愪緵鐨勪竴涓己澶х殑緋葷粺璋冪敤ptrace().
1.ptrace緋葷粺璋冪敤
ptrace
緋葷粺璋冧粠鍚嶅瓧涓婄湅鏄敤浜庤繘紼嬭窡韙殑錛屽畠鎻愪緵浜嗙埗榪涚▼鍙互瑙傚療鍜屾帶鍒跺叾瀛愯繘紼嬫墽琛岀殑鑳藉姏錛屽茍鍏佽鐖惰繘紼嬫鏌ュ拰鏇挎崲瀛愯繘紼嬬殑鍐呮牳闀滃儚(鍖呮嫭瀵勫瓨鍣?鐨勫箋傚叾鍩?
鏈師鐞嗘槸:
褰撲嬌鐢ㄤ簡ptrace璺熻釜鍚庯紝鎵鏈夊彂閫佺粰琚窡韙殑瀛愯繘紼嬬殑淇″彿(闄や簡SIGKILL)錛岄兘浼?xì)琚浆鍙懢l欑埗榪涚▼錛岃屽瓙榪涚▼鍒欎細(xì)琚樆濉烇紝榪欐椂瀛愯繘紼嬬殑鐘舵佸氨浼?xì)琚?
緋葷粺鏍囨敞涓篢ASK_TRACED銆傝岀埗榪涚▼鏀跺埌淇″彿鍚庯紝灝卞彲浠ュ鍋滄涓嬫潵鐨勫瓙榪涚▼榪涜媯鏌ュ拰淇敼錛岀劧鍚庤瀛愯繘紼嬬戶緇繍琛屻?nbsp;
鍏跺師鍨嬩負(fù)錛?nbsp;
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace鏈夊洓涓弬鏁?
1). enum __ptrace_request request錛氭寚紺轟簡ptrace瑕佹墽琛岀殑鍛戒護(hù)銆?br> 2). pid_t pid: 鎸囩ずptrace瑕佽窡韙殑榪涚▼銆?br> 3). void *addr: 鎸囩ず瑕佺洃鎺х殑鍐呭瓨鍦板潃銆?br> 4). void *data: 瀛樻斁璇誨彇鍑虹殑鎴栬呰鍐欏叆鐨勬暟鎹?br>ptrace鏄姝ょ殑寮哄ぇ錛屼互鑷充簬鏈夊緢澶氬ぇ瀹舵墍甯哥敤鐨勫伐鍏烽兘鍩轟簬ptrace鏉ュ疄鐜幫紝濡俿trace鍜実db銆傛帴涓嬫潵錛屾垜浠熺敱瀵箂trace鍜実db鐨勫疄鐜幫紝鏉ョ湅鐪媝trace鏄浣曚嬌鐢ㄧ殑銆?br>
2. strace鐨勫疄鐜?br>strace甯稿父琚敤鏉ユ嫤鎴拰璁板綍榪涚▼鎵鎵ц鐨勭郴緇熻皟鐢紝浠ュ強(qiáng)榪涚▼鎵鏀跺埌鐨勪俊鍙楓傚鏈夎繖涔堜竴孌電▼搴忥細(xì)
HelloWorld.c:
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
緙栬瘧鍚庯紝鐢╯trace璺熻釜錛?strace ./HelloWorld
鍙互鐪嬪埌褰㈠:
execve("./HelloWorld", ["./HelloWorld"], [/* 67 vars */]) = 0
brk(0) = 0x804a000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f18000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/home/supperman/WorkSpace/lib/tls/i686/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
...
鐨勪竴孌佃緭鍑猴紝榪欏氨鏄湪鎵цHelloWorld涓紝緋葷粺鎵鎵ц鐨勭郴緇熻皟鐢紝浠ュ強(qiáng)浠栦滑鐨勮繑鍥炲箋?br>
涓嬮潰鎴戜滑鐢╬trace鏉ョ爺絀朵竴涓嬪畠鏄庝箞瀹炵幇鐨勩?br>...
switch(pid = fork())
{
case -1:
return -1;
case 0: //瀛愯繘紼?br> ptrace(PTRACE_TRACEME,0,NULL,NULL);
execl("./HelloWorld", "HelloWorld", NULL);
default: //鐖惰繘紼?br> wait(&val); //絳夊緟騫惰褰昬xecve
if(WIFEXITED(val))
return 0;
syscallID=ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);
printf("Process executed system call ID = %ld\n",syscallID);
ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
while(1)
{
wait(&val); //絳夊緟淇″彿
if(WIFEXITED(val)) //鍒ゆ柇瀛愯繘紼嬫槸鍚﹂鍑?br> return 0;
if(flag==0) //絎竴嬈?榪涘叆緋葷粺璋冪敤)錛岃幏鍙栫郴緇熻皟鐢ㄧ殑鍙傛暟
{
syscallID=ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);
printf("Process executed system call ID = %ld ",syscallID);
flag=1;
}
else //絎簩嬈?閫鍑虹郴緇熻皟鐢?錛岃幏鍙栫郴緇熻皟鐢ㄧ殑榪斿洖鍊?br> {
returnValue=ptrace(PTRACE_PEEKUSER, pid, EAX*4, NULL);
printf("with return value= %ld\n", returnValue);
flag=0;
}
ptrace(PTRACE_SYSCALL,pid,NULL,NULL);
}
}
...
鍦?
涓婇潰鐨勭▼搴忎腑錛宖ork鍑虹殑瀛愯繘紼嬪厛璋冪敤浜唒trace(PTRACE_TRACEME)琛ㄧず瀛愯繘紼嬭鐖惰繘紼嬭窡韙嚜宸便傜劧鍚庡瓙榪涚▼璋冪敤execl鍔犺澆鎵ц
浜咹elloWorld銆傝屽湪鐖惰繘紼嬩腑鍒欎嬌鐢╳ait緋葷粺璋冪敤絳夊緟瀛愯繘紼嬬殑鐘舵佹敼鍙樸傚瓙榪涚▼鍥犱負(fù)璁劇疆浜哖TRACE_TRACEME鑰屽湪鎵ц緋葷粺璋冪敤琚郴
緇熷仠姝?璁劇疆涓篢ASK_TRACED)錛岃繖鏃剁埗榪涚▼琚敜閱掞紝浣跨敤ptrace(PTRACE_PEEKUSER,pid,...)鍒嗗埆鍘昏鍙栧瓙榪涚▼鎵ц
鐨勭郴緇熻皟鐢↖D(鏀懼湪ORIG_EAX涓?浠ュ強(qiáng)緋葷粺璋冪敤榪斿洖鏃剁殑鍊?鏀懼湪EAX涓?銆傜劧鍚庝嬌鐢╬trace(PTRACE_SYSCALL,
pid,...)鎸囩ず瀛愯繘紼嬭繍琛屽埌涓嬩竴嬈℃墽琛岀郴緇熻皟鐢ㄧ殑鏃跺?榪涘叆鎴栬呴鍑?錛岀洿鍒板瓙榪涚▼閫鍑轟負(fù)姝€?br>
紼嬪簭鐨勬墽琛岀粨鏋滃涓?
Process executed system call ID = 11
Process executed system call ID = 45 with return value= 134520832
Process executed system call ID = 192 with return value= -1208934400
Process executed system call ID = 33 with return value= -2
Process executed system call ID = 5 with return value= -2
...
鍏?
涓紝11鍙風(fēng)郴緇熻皟鐢ㄥ氨鏄痚xecve錛?5鍙鋒槸brk,192鏄痬map2,33鏄痑ccess,5鏄痮pen...緇忚繃姣斿鍙互鍙戠幇錛屽拰strace鐨?
杈撳嚭緇撴灉涓鏍楓傚綋鐒秙trace榪涜浜嗘洿璇﹀敖鍜屽畬鍠勭殑澶勭悊錛屾垜浠繖閲屽彧鏄彮紺哄叾鍘熺悊錛屾劅鍏磋叮鐨勫悓瀛﹀彲浠ュ幓鐮旂┒涓涓媠trace鐨勫疄鐜般?br>
PS:
1). 鍦ㄧ郴緇熻皟鐢ㄦ墽琛岀殑鏃跺欙紝浼?xì)鎵цpushl %eax # 淇濆瓨緋葷粺璋冪敤鍙稯RIG_EAX鍦ㄧ▼搴忕敤鎴鋒爤涓?br> 2). 鍦ㄧ郴緇熻皟鐢ㄨ繑鍥炵殑鏃跺欙紝浼?xì)鎵цmovl %eax,EAX(%esp)灝嗙郴緇熻皟鐢ㄧ殑榪斿洖鍊兼斁鍏ュ瘎瀛樺櫒%eax涓?br> 3). WIFEXITED()瀹忕敤鏉ュ垽鏂瓙榪涚▼鏄惁涓烘甯擱鍑虹殑錛屽鏋滄槸錛屽畠浼?xì)杩斿洖涓涓潪闆跺箋?br> 4). 琚窡韙殑紼嬪簭鍦ㄨ繘鍏ユ垨鑰呴鍑烘煇嬈$郴緇熻皟鐢ㄧ殑鏃跺欓兘浼?xì)瑙﹀彂涓涓猄IGTRAP淇″彿錛岃岃鐖惰繘紼嬫崟鑾楓?br> 5). execve()緋葷粺璋冪敤鎵ц鎴愬姛鐨勬椂鍊欏茍娌℃湁榪斿洖鍊鹼紝鍥犱負(fù)瀹冨紑濮嬫墽琛屼竴孌墊柊鐨勭▼搴忥紝騫舵病鏈?榪斿洖"鐨勬蹇點傚け璐ョ殑鏃跺欎細(xì)榪斿洖-1銆?br> 6). 鍦ㄧ埗榪涚▼榪涜榪涜鎿嶄綔鐨勬椂鍊欙紝鐢╬s鏌ョ湅錛屽彲浠ョ湅鍒板瓙榪涚▼鐨勭姸鎬佷負(fù)T,琛ㄧず瀛愯繘紼嬪浜嶵ASK_TRACED鐘舵併傚綋鐒朵負(fù)浜嗘洿鍏鋒搷浣滄э紝浣犲彲浠ュ湪鐖惰繘紼嬩腑鍔犲叆sleep()銆?br>
(To Be Continued)
Pthread 08/01/13
鍘熸枃鍦板潃錛歨ttp://blog.csdn.net/Javadino/archive/2008/09/06/2891413.aspx
]]>
ptrace鍑芥暟鐨?/span>_request鍙傛暟鏄渶閲嶈鐨勪竴涓弬鏁幫紝鍥犱負(fù)瀹冪‘瀹氫綘灝嗗仛浠涔堛?/span>BSD鍜?/span>Linux鐨勫ご鏂囦歡浣跨敤涓嶅悓鐨勫畾涔夛紝榪欎嬌寰楀皢ptrace搴旂敤浠庝竴涓鉤鍙扮Щ妞嶅埌鍙︿竴涓鉤鍙板彉寰楀緢澶嶆潅銆傞粯璁ゅ湴錛屾垜浠嬌鐢?/span>BSD澶存枃浠朵腑鐨勫畾涔夈?/span>
r PT_TRACE_ME錛?/span>PTRACE_TRACEME錛夊皢褰撳墠榪涚▼鍒囨崲鍒板仠姝㈢姸鎬併傚畠閫氬父鎬繪槸涓?/span>fork/exec涓璧蜂嬌鐢紝铏界劧涔熻兘閬囧埌鑷垜榪借釜鐨勫簲鐢ㄧ▼搴忋傚浜庢瘡涓涓繘紼嬶紝PT_TRACE_ME鍙兘琚皟鐢ㄤ竴嬈°傝拷韙竴涓琚拷韙殑榪涚▼鏄細(xì)澶辮觸鐨勶紙鍙︿竴涓緝涓嶉噸瑕佺殑緇撴灉鏄繘紼嬩笉鑳借拷韙畠鑷繁銆傚鏋滆榪欐牱鍋氾紝搴旇棣栧厛浠庤嚜韜淳鐢熶竴涓繘紼嬶級銆傚ぇ閲忕殑鍙嶈皟璇曟妧鏈兘鏄互榪欎竴浜嬪疄涓哄熀紜鐨勩備負(fù)浜嗗厠鏈嶈繖綾繪妧鏈紝蹇呴』浣跨敤緇曡繃ptrace鐨勮皟璇曞櫒銆備竴涓俊鍙瘋鍙戦佸埌姝h璋冭瘯鐨勮繘紼嬶紝騫跺皢璇ヨ繘紼嬪垏鎹㈠埌鍋滄鐘舵侊紝璇ヨ繘紼嬪彲浠ヤ嬌鐢ㄤ粠鐖惰繘紼嬩笂涓嬫枃涓皟鐢ㄧ殑PT_CONTINUE鍜?/span>PT_STEP鍛戒護(hù)浠庡仠姝㈢姸鎬侀鍑恒?/span>wait鍑芥暟浼?xì)鍤g榪熺埗榪涚▼鐨勬墽琛岋紝鐩村埌琚皟璇曠殑榪涚▼鍒囨崲涓哄仠姝㈢姸鎬佹垨鑰呯粓姝負(fù)姝紙緇堟鏃訛紝榪斿洖鍊間負(fù)1407錛夈傚叾浠栫殑鎵鏈夊弬鏁?span style="letter-spacing: 0.1pt;">閮借蹇界暐銆?/span>
r PT_ATTACH錛?/span>PTRACE_ATTACH錛?/span>灝嗚繘紼嬫爣蹇椾負(fù)pid鐨勮繍琛岃繘紼嬪垏鎹負(fù)鍋滄鐘舵侊紝鍦ㄨ繖縐嶆儏褰笅錛岃皟璇曞櫒榪涚▼鎴愪負(fù)“鐖惰繘紼?#8221;銆傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ傝繘紼嬪繀欏誨叿鏈変笌璋冭瘯榪涚▼鐩稿悓鐨勭敤鎴鋒爣蹇楋紙UID錛夛紝騫朵笖涓嶈兘鏄?/span>setuid/setduid榪涚▼錛堝惁鍒欏氨瑕佺敤root鏉ヨ皟璇曪級銆?/span>
r PT_DETACH錛?/span>PTRACE_DETACH錛?/span>鍋滄榪涚▼鏍囧織涓?/span>pid榪涚▼錛堢敱PT_ATTACH鍜?/span>PT_TRACE_ME鎸囧畾錛夌殑璋冭瘯錛屽茍緇х畫鍏跺父鎬佽繍琛屻傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ?/span>
r PT_CONTINUE錛?/span>PTRACE_CONT錛?/span>緇х畫榪涚▼鏍囧織涓?/span>pid鐨勮璋冭瘯榪涚▼鐨勬墽琛岋紝鑰屼笉涓柇涓庤皟璇曞櫒榪涚▼鐨勯氫俊銆傚鏋?/span>addr 錛濓紳 1錛堝湪Linux涓負(fù)0錛夛紝浠庝笂嬈″仠姝㈢殑鍦板潃緇х畫鎵ц錛涘惁鍒欙紝浠庢寚瀹氱殑鍦板潃緇х畫鎵ц銆傚弬鏁?/span>_data鎸囧畾鍙戦佸埌琚皟璇曡繘紼嬬殑淇″彿鏁伴噺錛堥浂璇存槑娌℃湁淇″彿錛夈?/span>
r PT_STEP錛?/span>PTRACE_SINGLESTEP錛?/span>榪涜榪涚▼鏍囧織涓?/span>pid鐨勮繘紼嬬殑鍗曟鎵ц錛屽嵆鎵ц涓嬩竴鏉℃満鍣ㄦ寚浠ゅ茍鍒囨崲涓哄仠姝㈢姸鎬侊紙鍦?/span>i386涓紝榪欐槸鏍規(guī)嵁璁劇疆榪借釜鏍囧織鏉ュ疄鐜?span style="letter-spacing: -0.1pt;">鐨勶紝铏界劧鏈変簺“榛戝”鍑芥暟搴撲嬌鐢ㄧ‖浠舵柇鐐癸級銆?/span>BSD瑕佹眰灝嗗弬鏁?/span>addr緗負(fù)1錛岃?/span>Linux瑕佹眰灝嗚鍙傛暟緗負(fù)0銆傚叾浠栫殑鎵鏈夊弬鏁伴兘琚拷鐣ャ?/span>
r PT_READ_I鍜?/span>PT_READ_D錛?/span>PTRACE_PEEKTEXT鍜?/span>PTRACE_PEEKDATA錛夊垎鍒粠浠g爜鍖哄拰姝?/span>琚?/span>璋冭瘯榪涚▼鐨勫湴鍧絀洪棿鍖鴻鍙栨満鍣ㄥ瓧銆傚湪璁稿褰撲唬鐨勫鉤鍙頒腑錛岃繖涓や釜鎸囦護(hù)鏄瓑浠風(fēng)殑銆?/span>ptrace鍑芥暟鎺ユ敹鐩爣鍦板潃addr錛屽茍榪斿洖璇誨埌鐨勭粨鏋溿?/span>
r PT_WRITE_I鍜?/span>PR_READ_D錛?/span>PTRACE_POKETEXT鍜?/span>PTRACE_POKEDATA錛?/span>灝嗙敱_data浼犲叆鐨勬満鍣ㄥ瓧鍐欏叆addr鎵鎸囧畾鐨勫湴鍧銆?/span>
r PT_GETREGS錛?/span>PT_GETFPREGS鍜?/span>PT_GETDBREGS錛?/span>PTRACE_GETREGS錛?/span>PTRACE_ FPREGS鍜?/span>PT_GETFPXREGS錛?/span>灝嗕竴鑸敤閫斿瘎瀛樺櫒銆佹瀵勫瓨鍣ㄥ拰璋冭瘯瀵勫瓨鍣ㄧ殑鍊艱鍏ュ埌鍦板潃鐢?/span>_addr鎸囬拡鎵鎸囧畾鐨勮皟璇曞櫒榪涚▼鐨勫唴瀛樺尯涓傚彧鏈?/span>i386騫沖彴鎺ユ敹榪欎簺涓庣郴緇熺浉鍏崇殑鍛戒護(hù)銆傚瘎瀛樺櫒緇撴瀯鐨勬弿榪版斁鍦ㄥご鏂囦歡machine/reg.h鏂囦歡涓?/span>
r PT_SETREGS錛?/span>PT_SETFPREGS鍜?/span>PT_SETDBREGS錛?/span>PTRACE_SETREGS錛?/span>PTRACE_ SETFPREGS鍜?/span>PT_SETFPXREGS錛?/span>閫氳繃鎷瘋礉鐢?/span>_addr鎸囬拡鎵鎸囧畾鐨勫唴瀛樺尯鍩熺殑鍐呭鏉ヨ緗璋冭瘯榪涚▼鐨勫瘎瀛樺櫒鐨勫箋?/span>
r PT_KILL錛?/span>PTRACE_KILL錛?/span>灝?/span>sigkill鍙戦佸埌琚皟璇曡繘紼嬶紝浠ョ粓姝㈠叾鎵ц銆?/span>
In Part I, we ran the process to be traced as a child after calling ptrace(PTRACE_TRACEME, ..). If you simply wanted to see how the process is making system calls and trace the program, this would be sufficient. If you want to trace or debug a process already running, then ptrace(PTRACE_ATTACH, ..) should be used.
When a ptrace(PTRACE_ATTACH, ..) is called with the pid to be traced, it is roughly equivalent to the process calling ptrace(PTRACE_TRACEME, ..) and becoming a child of the tracing process. The traced process is sent a SIGSTOP, so we can examine and modify the process as usual. After we are done with modifications or tracing, we can let the traced process continue on its own by calling ptrace(PTRACE_DETACH, ..).
The following is the code for a small example tracing program:
int main()
{ int i;
for(i = 0;i < 10; ++i) {
printf("My counter: %d\n", i);
sleep(2);
}
return 0;
}
Save the program as dummy2.c. Compile and run it:
gcc -o dummy2 dummy2.cNow, we can attach to dummy2 by using the code below:
./dummy2 &
#include <sys/ptrace.h>The above program simply attaches to a process, waits for it to stop, examines its eip (instruction pointer) and detaches.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h> /* For user_regs_struct
etc. */
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs;
long ins;
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, ®s);
ins = ptrace(PTRACE_PEEKTEXT, traced_process,
regs.eip, NULL);
printf("EIP: %lx Instruction executed: %lx\n",
regs.eip, ins);
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
To inject code use ptrace(PTRACE_POKETEXT, ..) and ptrace(PTRACE_POKEDATA, ..) after the traced process has stopped.
How do debuggers set breakpoints? Generally, they replace the instruction to be executed with a trap instruction, so that when the traced program stops, the tracing program, the debugger, can examine it. It will replace the original instruction once the tracing program continues the traced process. Here's an example:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h>
const int long_size = sizeof(long);
void getdata(pid_t child, long addr,
char *str, int len)
{ char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data;
i = 0;
j = len / long_size;
laddr = str;
while(i < j) {
data.val = ptrace(PTRACE_PEEKDATA, child,
addr + i * 4, NULL);
memcpy(laddr, data.chars, long_size);
++i;
laddr += long_size;
}
j = len % long_size;
if(j != 0) {
data.val = ptrace(PTRACE_PEEKDATA, child,
addr + i * 4, NULL);
memcpy(laddr, data.chars, j);
}
str[len] = '\0';
}
void putdata(pid_t child, long addr,
char *str, int len)
{ char *laddr;
int i, j;
union u {
long val;
char chars[long_size];
}data;
i = 0;
j = len / long_size;
laddr = str;
while(i < j) {
memcpy(data.chars, laddr, long_size);
ptrace(PTRACE_POKEDATA, child,
addr + i * 4, data.val);
++i;
laddr += long_size;
}
j = len % long_size;
if(j != 0) {
memcpy(data.chars, laddr, j);
ptrace(PTRACE_POKEDATA, child,
addr + i * 4, data.val);
}
}
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs, newregs;
long ins;
/* int 0x80, int3 */
char code[] = {0xcd,0x80,0xcc,0};
char backup[4];
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, ®s);
/* Copy instructions into a backup variable */
getdata(traced_process, regs.eip, backup, 3);
/* Put the breakpoint */
putdata(traced_process, regs.eip, code, 3);
/* Let the process continue and execute
the int 3 instruction */
ptrace(PTRACE_CONT, traced_process, NULL, NULL);
wait(NULL);
printf("The process stopped, putting back "
"the original instructions\n");
printf("Press <enter> to continue\n");
getchar();
putdata(traced_process, regs.eip, backup, 3);
/* Setting the eip back to the original
instruction to let the process continue */
ptrace(PTRACE_SETREGS, traced_process,
NULL, ®s);
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
Here we replace the three bytes with the code for a trap instruction, and when the process stops, we replace the original instructions and reset the eip to original location. Figures 1-4 clarify how the instruction stream looks when above program is executed.
![]() |
![]() |
Figure 1. After the Process Is Stopped |
Figure 2. After the Trap Instruction Bytes Are Set |
![]() |
![]() |
Figure 3. Trap Is Hit and Control Is Given to the Tracing Program |
Figure 4. After the Original Instructions Are Replaced and eip Is Reset to the Original Location |
Now that we have a clear idea of how breakpoints are set, let's inject some code bytes into a running program. These code bytes will print “hello world”.
The following program is a simple “hello world” program with modifications to fit our needs. Compile the following program with:
gcc -o hello hello.c
void main()
{
__asm__("
jmp forward
backward:
popl %esi # Get the address of
# hello world string
movl $4, %eax # Do write system call
movl $2, %ebx
movl %esi, %ecx
movl $12, %edx
int $0x80
int3 # Breakpoint. Here the
# program will stop and
# give control back to
# the parent
forward:
call backward
.string \"Hello World\\n\""
);
}
The jumping backward and forward here is required to find the address of the “hello world” string.
We can get the machine code for the above assembly from GDB. Fire up GDB and disassemble the program:
(gdb) disassemble main
Dump of assembler code for function main:
0x80483e0 <main>: push %ebp
0x80483e1 <main+1>: mov %esp,%ebp
0x80483e3 <main+3>: jmp 0x80483fa <forward>
End of assembler dump.
(gdb) disassemble forward
Dump of assembler code for function forward:
0x80483fa <forward>: call 0x80483e5 <backward>
0x80483ff <forward+5>: dec %eax
0x8048400 <forward+6>: gs
0x8048401 <forward+7>: insb (%dx),%es:(%edi)
0x8048402 <forward+8>: insb (%dx),%es:(%edi)
0x8048403 <forward+9>: outsl %ds:(%esi),(%dx)
0x8048404 <forward+10>: and %dl,0x6f(%edi)
0x8048407 <forward+13>: jb 0x8048475
0x8048409 <forward+15>: or %fs:(%eax),%al
0x804840c <forward+18>: mov %ebp,%esp
0x804840e <forward+20>: pop %ebp
0x804840f <forward+21>: ret
End of assembler dump.
(gdb) disassemble backward
Dump of assembler code for function backward:
0x80483e5 <backward>: pop %esi
0x80483e6 <backward+1>: mov $0x4,%eax
0x80483eb <backward+6>: mov $0x2,%ebx
0x80483f0 <backward+11>: mov %esi,%ecx
0x80483f2 <backward+13>: mov $0xc,%edx
0x80483f7 <backward+18>: int $0x80
0x80483f9 <backward+20>: int3
End of assembler dump.
We need to take the machine code bytes from main+3 to backward+20, which is a total of 41 bytes. The machine code can be seen with the x command in GDB:
(gdb) x/40bx main+3Now we have the instruction bytes to be executed. Why wait? We can inject them using the same method as in the previous example. The following is the source code; only the main function is given here:
<main+3>: eb 15 5e b8 04 00 00 00
<backward+6>: bb 02 00 00 00 89 f1 ba
<backward+14>: 0c 00 00 00 cd 80 cc
<forward+1>: e6 ff ff ff 48 65 6c 6c
<forward+9>: 6f 20 57 6f 72 6c 64 0a
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct regs, newregs;
long ins;
int len = 41;
char insertcode[] =
"\xeb\x15\x5e\xb8\x04\x00"
"\x00\x00\xbb\x02\x00\x00\x00\x89\xf1\xba"
"\x0c\x00\x00\x00\xcd\x80\xcc\xe8\xe6\xff"
"\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f"
"\x72\x6c\x64\x0a\x00";
char backup[len];
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, ®s);
getdata(traced_process, regs.eip, backup, len);
putdata(traced_process, regs.eip,
insertcode, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, ®s);
ptrace(PTRACE_CONT, traced_process,
NULL, NULL);
wait(NULL);
printf("The process stopped, Putting back "
"the original instructions\n");
putdata(traced_process, regs.eip, backup, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, ®s);
printf("Letting it continue with "
"original flow\n");
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
In the previous example we injected the code directly into the executing instruction stream. However, debuggers can get confused with this kind of behaviour, so let's find the free space in the process and inject the code there. We can find free space by examining the /proc/pid/maps file of the traced process. The following function will find the starting address of this map:
long freespaceaddr(pid_t pid)
{
FILE *fp;
char filename[30];
char line[85];
long addr;
char str[20];
sprintf(filename, "/proc/%d/maps", pid);
fp = fopen(filename, "r");
if(fp == NULL)
exit(1);
while(fgets(line, 85, fp) != NULL) {
sscanf(line, "%lx-%*lx %*s %*s %s", &addr,
str, str, str, str);
if(strcmp(str, "00:00") == 0)
break;
}
fclose(fp);
return addr;
}
Each line in /proc/pid/maps represents a mapped region of the process. An entry in /proc/pid/maps looks like this:
map start-mapend protection offset deviceThe following program injects code into free space. It's similar to the previous injection program except the free space address is used for keeping our new code. Here is the source code for the main function:
inode process file
08048000-0804d000 r-xp 00000000 03:08
66111 /opt/kde2/bin/kdeinit
int main(int argc, char *argv[])
{ pid_t traced_process;
struct user_regs_struct oldregs, regs;
long ins;
int len = 41;
char insertcode[] =
"\xeb\x15\x5e\xb8\x04\x00"
"\x00\x00\xbb\x02\x00\x00\x00\x89\xf1\xba"
"\x0c\x00\x00\x00\xcd\x80\xcc\xe8\xe6\xff"
"\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f"
"\x72\x6c\x64\x0a\x00";
char backup[len];
long addr;
if(argc != 2) {
printf("Usage: %s <pid to be traced>\n",
argv[0], argv[1]);
exit(1);
}
traced_process = atoi(argv[1]);
ptrace(PTRACE_ATTACH, traced_process,
NULL, NULL);
wait(NULL);
ptrace(PTRACE_GETREGS, traced_process,
NULL, ®s);
addr = freespaceaddr(traced_process);
getdata(traced_process, addr, backup, len);
putdata(traced_process, addr, insertcode, len);
memcpy(&oldregs, ®s, sizeof(regs));
regs.eip = addr;
ptrace(PTRACE_SETREGS, traced_process,
NULL, ®s);
ptrace(PTRACE_CONT, traced_process,
NULL, NULL);
wait(NULL);
printf("The process stopped, Putting back "
"the original instructions\n");
putdata(traced_process, addr, backup, len);
ptrace(PTRACE_SETREGS, traced_process,
NULL, &oldregs);
printf("Letting it continue with "
"original flow\n");
ptrace(PTRACE_DETACH, traced_process,
NULL, NULL);
return 0;
}
So what happens within the kernel now? How is ptrace implemented? This section could be an article on its own; however, here's a brief description of what happens.
When a process calls ptrace with PTRACE_TRACEME, the kernel sets up the process flags to reflect that it is being traced:
Source: arch/i386/kernel/ptrace.c
if (request == PTRACE_TRACEME) {
/* are we already being traced? */
if (current->ptrace & PT_PTRACED)
goto out;
/* set the ptrace bit in the process flags. */
current->ptrace |= PT_PTRACED;
ret = 0;
goto out;
}
When a system call entry is done, the kernel checks this flag and calls the trace system call if the process is being traced. The gory assembly details can be found in arch/i386/kernel/entry.S.
Now, we are in the sys_trace() function as defined in arch/i386/kernel/ptrace.c. It stops the child and sends a signal to the parent notifying that the child is stopped. This wakes up the waiting parent, and it does the ptrace magic. Once the parent is done, and it calls ptrace(PTRACE_CONT, ..) or ptrace(PTRACE_SYSCALL, ..), it wakes up the child by calling the scheduler function wake_up_process(). Some other architectures can implement this by sending a SIGCHLD to child.
ptrace may appear to be magic to some people, because it can examine and modify a running program. It is generally used by debuggers and system call tracing programs, such as ptrace. It opens up interesting possibilities for doing user-mode extensions as well. There have been a lot of attempts to extend the operating system on the user level. See Resources to read about UFO, a user-level extension to filesystems. ptrace also is used to employ security mechanisms.
All example code from this article and from Part I is available as a tar archive on the Linux Journal FTP site [ftp.ssc.com/pub/lj/listings/issue104/6210.tgz].
鍘熸枃錛?br>
http://www.linuxjournal.com/article/6210
褰撴湇鍔″櫒close涓涓繛鎺ユ椂錛岃嫢client绔帴鐫鍙戞暟鎹傛牴鎹甌CP鍗忚鐨勮瀹氾紝浼?xì)鏀跺堫C竴涓猂ST鍝嶅簲錛宑lient鍐嶅線榪欎釜鏈嶅姟鍣ㄥ彂閫佹暟鎹椂錛岀郴緇熶細(xì)鍙戝嚭涓涓猄IGPIPE淇″彿緇欒繘紼嬶紝鍛婅瘔榪涚▼榪欎釜榪炴帴宸茬粡鏂紑浜嗭紝涓嶈鍐嶅啓浜嗐?br style="LINE-HEIGHT: normal"> 鏍規(guī)嵁淇″彿鐨勯粯璁ゅ鐞嗚鍒橲IGPIPE淇″彿鐨勯粯璁ゆ墽琛屽姩浣滄槸terminate(緇堟銆侀鍑?,鎵浠lient浼?xì)閫鍑恒傝嫢涓嶆兂瀹㈡埛绔鍑哄彲浠ユ妸SIGPIPE璁句負(fù)SIG_IGN 濡? signal(SIGPIPE,SIG_IGN); 鏈嶅姟鍣ㄩ噰鐢ㄤ簡fork鐨勮瘽錛岃鏀墮泦鍨冨溇榪涚▼錛岄槻姝㈠兊灝歌繘紼嬬殑浜х敓錛屽彲浠ヨ繖鏍峰鐞嗭細(xì)
#define MAXBUF 40960 while (1) { memset(sendline, 'a', sizeof(sendline)); } int signal(SIGPIPE, SIG_IGN); if (argc != 2) sockfd = Socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); Connect(sockfd, (SA *) &servaddr, sizeof(servaddr)); str_cli(stdin, sockfd); /* do it all */ exit(0); 涓轟簡鏂逛究瑙傚療閿欒杈撳嚭錛宭ib/writen.c涔熷仛浜嗕慨鏀癸紝鍔犱簡浜涙棩蹇楋細(xì) /* include writen */ ssize_t &nbs
client.c鏀懼湪tcpclieserv鐩綍涓嬶紝淇敼浜哅akefile錛屽鍔犱簡client.c鐨勭紪璇戠洰鏍?/p>
鎺ョ潃灝卞彲浠ュ紑濮嬫祴璇曚簡銆?/p> 嫻嬭瘯1 蹇界暐SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2>鏈満鏈嶅姟绔細(xì)
嫻嬭瘯2 catch SIGPIPE淇″彿錛寃riten涔嬪墠錛屽鏂瑰叧闂帴鍙楄繘紼?/h2>淇敼瀹㈡埛绔唬鐮侊紝catch sigpipe淇″彿
鏈満鏈嶅姟绔細(xì)
嫻嬭瘯3 writen榪囩▼涓紝瀵規(guī)柟鍏抽棴鎺ュ彈榪涚▼涓轟簡鏂逛究鎿嶄綔錛屽姞澶?嬈rite鐨勬暟鎹噺錛屼慨鏀筂AXBUF涓?096000 鏈満鏈嶅姟绔細(xì)
涓轟粈涔堜互涓婃祴璇曪紝閮芥槸瀵規(guī)柟宸茬粡涓柇socket鍚庯紝鍙戦佺鍐嶆write錛岀粨鏋滀細(xì)鏈夋墍涓嶅悓鍛€備粠鍚庢潵鎵懼埌鐨刄NP5.12,5.13鑳芥壘鍒扮瓟妗?/p>
浠ヤ笂瑙i噴浜嗘祴璇?鐨勭幇璞★紝write鏃訛紝鏀跺埌RST.
浠ヤ笂瑙i噴浜嗘祴璇?錛?鐨勭幇璞?write涓涓凡緇忔帴鍙楀埌RST鐨剆ocket錛岀郴緇熷唴鏍鎬細(xì)鍙戦丼IGPIPE緇欏彂閫佽繘紼嬶紝濡傛灉榪涚▼catch/ignore榪欎釜淇″彿錛寃rite閮借繑鍥濫PIPE閿欒. 鍥犳,UNP寤鴻搴旂敤鏍規(guī)嵁闇瑕佸鐞哠IGPIPE淇″彿錛岃嚦灝戜笉瑕佺敤緋葷粺緙虹渷鐨勫鐞嗘柟寮忓鐞嗚繖涓俊鍙鳳紝緋葷粺緙虹渷鐨勫鐞嗘柟寮忔槸閫鍑鴻繘紼嬶紝榪欐牱浣犵殑搴旂敤灝卞緢闅炬煡澶勫鐞嗚繘紼嬩負(fù)浠涔堥鍑恒?/p>
鍦║nix緋葷粺涓嬶紝濡傛灉send鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岃皟鐢╯end鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?br style="LINE-HEIGHT: normal">鍦║nix緋葷粺涓嬶紝濡傛灉recv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶鏂紑浜嗭紝閭d箞璋冪敤recv鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p> 澶勭悊鏂規(guī)硶錛?br style="LINE-HEIGHT: normal">鍦ㄥ垵濮嬪寲鏃惰皟鐢?strong style="LINE-HEIGHT: normal">signal(SIGPIPE,SIG_IGN)蹇界暐璇ヤ俊鍙鳳紙鍙渶涓嬈★級 gdb錛?br style="LINE-HEIGHT: normal">gdb榛樿鏀跺埌sigpipe鏃朵腑鏂▼搴忥紝鍙皟鐢?strong style="LINE-HEIGHT: normal">handle SIGPIPE nostop print 鐩稿叧 (1)SIG_DFL淇″彿涓撶敤鐨勯粯璁ゅ姩浣? (2)SIG_IGN蹇界暐淇″彿 (3)鎸囧悜鍑芥暟鐨勬寚閽?-鎹曡幏淇″彿 姣忎竴縐嶄俊鍙烽兘琚玂SKit緇欎簣浜嗕竴涓鍙峰悕錛屽浜?2浣嶇殑i386騫沖彴鑰岃█錛屼竴涓瓧32浣嶏紝鍥犺屼俊鍙鋒湁32縐嶃備笅闈㈢殑琛ㄧ粰鍑轟簡甯哥敤鐨勭鍙峰悕銆佹弿榪板拰瀹冧滑鐨勪俊鍙峰箋?/p> 絎﹀彿鍚嶃銆淇″彿鍊?鎻忚堪銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄惁絎﹀悎POSIX 鍙﹀錛屾垜鍐嶅仛涓浜涜ˉ鍏咃紝浜х敓RST鍝嶅簲浠ヨ嚦浜庣郴緇熷彂鍑篠IGPIPE淇″彿錛屽簲璇ュ垎涓轟袱縐嶆儏鍐? 1. 瀹㈡埛绔埌鏈嶅姟绔箣闂寸綉緇滄柇鎺夛紝鎴栬呮湇鍔$鏂數(shù)絳夛紝鐗╃悊榪炴帴鏂帀浜嗭紝榪欑鎯呭喌涓嬪鎴風(fēng)涓嶄細(xì)閫鍑猴紝send鍑芥暟姝e父鎵ц錛屼笉浼?xì)鎰熻鍒拌嚜宸卞嚭閿欍傚洜涓虹敱浜庣墿鐞嗙綉緇滄柇寮錛屾湇鍔$涓嶄細(xì)緇欏鎴風(fēng)鍥炲簲閿欒娑堟伅錛屾病鏈塕ST鍝嶅簲錛岃嚜鐒朵篃涓嶄細(xì)浜х敓SIGPIPE淇″彿銆備絾鏄綋鏈嶅姟绔啀鎭㈠姝e父鐨勬椂鍊欙紝瀵瑰鎴風(fēng)send鏉ョ殑娑堟伅浼?xì)漶旂敓RST鍝嶅簲錛屽鎴風(fēng)灝辨敹鍒癝IGPIPE淇″彿浜嗭紝紼嬪簭閫鍑猴紝浣嗘槸榪欐椂send鍑芥暟鏄兘澶熻繑鍥?-1鐨勩傚彲浠ヨ繘琛屽紓甯稿鐞嗐?/p> 2.瀹㈡埛绔埌鏈嶅姟绔殑緗戠粶鑳介氾紝鏈嶅姟紼嬪簭鎸傛帀錛屽鎴風(fēng)紼嬪簭浼?xì)椹笂閫鍑猴紝鍥犱負(fù)鏈嶅姟绔兘姝e父榪斿洖閿欒娑堟伅錛屽鎴風(fēng)鏀跺埌錛孲IGPIPE淇″彿灝變駭鐢熶簡銆備笉榪囨垜涓嶇‘瀹氭鏃舵湇鍔$榪斿洖鏄殑RST鍝嶅簲錛屾姄鍖呮潵鐪嬫病鏈塕ST鏍囧織銆傛按騫蟲湁闄愶紝鍙啓鍒拌繖浜嗐?/p> 鏂囩珷鍑哄錛?a style="LINE-HEIGHT: normal" >http://www.diybl.com/course/6_system/linux/Linuxjs/20081020/150832.html |
|
涓轟簡鏂逛究瑙傚療閿欒杈撳嚭錛宭ib/writen.c涔熷仛浜嗕慨鏀癸紝鍔犱簡浜涙棩蹇楋細(xì)
|
client.c鏀懼湪tcpclieserv鐩綍涓嬶紝淇敼浜哅akefile錛屽鍔犱簡client.c鐨勭紪璇戠洰鏍?/p>
|
鎺ョ潃灝卞彲浠ュ紑濮嬫祴璇曚簡銆?/p>
鏈満鏈嶅姟绔細(xì)
淇敼瀹㈡埛绔唬鐮侊紝catch sigpipe淇″彿
|
鏈満鏈嶅姟绔細(xì)
涓轟簡鏂逛究鎿嶄綔錛屽姞澶?嬈rite鐨勬暟鎹噺錛屼慨鏀筂AXBUF涓?096000
鏈満鏈嶅姟绔細(xì)
涓轟粈涔堜互涓婃祴璇曪紝閮芥槸瀵規(guī)柟宸茬粡涓柇socket鍚庯紝鍙戦佺鍐嶆write錛岀粨鏋滀細(xì)鏈夋墍涓嶅悓鍛€備粠鍚庢潵鎵懼埌鐨刄NP5.12,5.13鑳芥壘鍒扮瓟妗?/p>
The client's call to readline may happen before the server's RST is received by the client, or it may happen after. If the readline happens before the RST is received, as we've shown in our example, the result is an unexpected EOF in the client. But if the RST arrives first, the result is an ECONNRESET ("Connection reset by peer") error return from readline. |
浠ヤ笂瑙i噴浜嗘祴璇?鐨勭幇璞★紝write鏃訛紝鏀跺埌RST.
What happens if the client ignores the error return from readline and writes more data to the server? This can happen, for example, if the client needs to perform two writes to the server before reading anything back, with the first write eliciting the RST. The rule that applies is: When a process writes to a socket that has received an RST, the SIGPIPE signal is sent to the process. The default action of this signal is to terminate the process, so the process must catch the signal to avoid being involuntarily terminated. If the process either catches the signal and returns from the signal handler, or ignores the signal, the write operation returns EPIPE. |
浠ヤ笂瑙i噴浜嗘祴璇?錛?鐨勭幇璞?write涓涓凡緇忔帴鍙楀埌RST鐨剆ocket錛岀郴緇熷唴鏍鎬細(xì)鍙戦丼IGPIPE緇欏彂閫佽繘紼嬶紝濡傛灉榪涚▼catch/ignore榪欎釜淇″彿錛寃rite閮借繑鍥濫PIPE閿欒.
鍥犳,UNP寤鴻搴旂敤鏍規(guī)嵁闇瑕佸鐞哠IGPIPE淇″彿錛岃嚦灝戜笉瑕佺敤緋葷粺緙虹渷鐨勫鐞嗘柟寮忓鐞嗚繖涓俊鍙鳳紝緋葷粺緙虹渷鐨勫鐞嗘柟寮忔槸閫鍑鴻繘紼嬶紝榪欐牱浣犵殑搴旂敤灝卞緢闅炬煡澶勫鐞嗚繘紼嬩負(fù)浠涔堥鍑恒?/p>
http://blog.csdn.net/shcyd/archive/2006/10/28/1354577.aspx
鍦║nix緋葷粺涓嬶紝濡傛灉send鍦ㄧ瓑寰呭崗璁紶閫佹暟鎹椂緗戠粶鏂紑鐨勮瘽錛岃皟鐢╯end鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?br>鍦║nix緋葷粺涓嬶紝濡傛灉recv鍑芥暟鍦ㄧ瓑寰呭崗璁帴鏀舵暟鎹椂緗戠粶鏂紑浜嗭紝閭d箞璋冪敤recv鐨勮繘紼嬩細(xì)鎺ユ敹鍒頒竴涓猄IGPIPE淇″彿錛岃繘紼嬪璇ヤ俊鍙風(fēng)殑榛樿澶勭悊鏄繘紼嬬粓姝€?/p>
澶勭悊鏂規(guī)硶錛?br>鍦ㄥ垵濮嬪寲鏃惰皟鐢?strong>signal(SIGPIPE,SIG_IGN)蹇界暐璇ヤ俊鍙鳳紙鍙渶涓嬈★級
鍏舵椂send鎴杛ecv鍑芥暟灝嗚繑鍥?1錛宔rrno涓篍PIPE錛屽彲瑙嗘儏鍐靛叧闂璼ocket鎴栧叾浠栧鐞?/p>
gdb錛?br>gdb榛樿鏀跺埌sigpipe鏃朵腑鏂▼搴忥紝鍙皟鐢?strong>handle SIGPIPE nostop print
鐩稿叧
(1)SIG_DFL淇″彿涓撶敤鐨勯粯璁ゅ姩浣?
銆銆(a)濡傛灉榛樿鍔ㄤ綔鏄殏鍋滅嚎紼嬶紝鍒欒綰跨▼鐨勬墽琛岃鏆傛椂鎸傝搗銆傚綋綰跨▼鏆傚仠鏈熼棿錛屽彂閫佺粰綰跨▼鐨勪換浣曢檮鍔犱俊鍙烽兘涓嶄氦浠橈紝鐩村埌璇ョ嚎紼嬪紑濮嬫墽琛岋紝浣嗘槸SIGKILL闄ゅ銆?br>銆銆(b)鎶婃寕璧蜂俊鍙風(fēng)殑淇″彿鍔ㄤ綔璁劇疆鎴怱IG_DFL錛屼笖鍏墮粯璁ゅ姩浣滄槸蹇界暐淇″彿 (SIGCHLD)銆?
(2)SIG_IGN蹇界暐淇″彿
銆銆(a)璇ヤ俊鍙風(fēng)殑浜や粯瀵圭嚎紼嬫病鏈夊獎鍝?br>銆銆(b)緋葷粺涓嶅厑璁告妸SIGKILL鎴朣IGTOP淇″彿鐨勫姩浣滆緗負(fù)SIG_DFL
(3)鎸囧悜鍑芥暟鐨勬寚閽?-鎹曡幏淇″彿
銆銆(a)淇″彿涓緇忎氦浠橈紝鎺ユ敹綰跨▼灝卞湪鎸囧畾鍦板潃涓婃墽琛屼俊鍙鋒崟鑾風(fēng)▼搴忋傚湪淇″彿鎹?鑾峰嚱鏁拌繑鍥炲悗錛屾帴鍙楃嚎紼嬪繀欏誨湪琚腑鏂偣鎭㈠鎵ц銆?br>銆銆(b)鐢–璇█鍑芥暟璋冪敤鐨勬柟娉曡繘鍏ヤ俊鍙鋒崟鎹夌▼搴?
銆銆銆銆void func (signo)
銆銆銆銆int signo;
銆銆銆銆func( )鏄寚瀹氱殑淇″彿鎹曟崏鍑芥暟錛宻igno鏄琚氦浠樹俊鍙風(fēng)殑緙栫爜
銆銆(c)濡傛灉SIGFPE,SIGILL鎴朣IGSEGV淇″彿涓嶆槸鐢盋鏍囧噯瀹氫箟鐨刱ill( )鎴杛aise( )鍑芥暟鎵鐢熸垚錛屽垯浠庝俊鍙稴IGFPE,SIGILL,SIGSEGV鐨勪俊鍙鋒崟鑾峰嚱鏁版甯歌繑鍥炲悗綰跨▼鐨勮涓烘槸鏈畾涔夌殑銆?br>銆銆(d)緋葷粺涓嶅厑璁哥嚎紼嬫崟鑾稴IGKILL鍜孲IGSTOP淇″彿銆?br>銆銆(e)濡傛灉綰跨▼涓篠IGCHLD淇″彿寤虹珛淇″彿鎹曡幏鍑芥暟錛岃岃綰跨▼鏈夋湭琚瓑寰呯殑浠ョ粓姝㈢殑瀛愮嚎紼嬫椂錛屾病鏈夎瀹氭槸鍚﹁鐢熸垚SIGCHLD淇″彿鏉ユ寚鏄庨偅涓瓙綰跨▼銆?br>
姣忎竴縐嶄俊鍙烽兘琚玂SKit緇欎簣浜嗕竴涓鍙峰悕錛屽浜?2浣嶇殑i386騫沖彴鑰岃█錛屼竴涓瓧32浣嶏紝鍥犺屼俊鍙鋒湁32縐嶃備笅闈㈢殑琛ㄧ粰鍑轟簡甯哥敤鐨勭鍙峰悕銆佹弿榪板拰瀹冧滑鐨勪俊鍙峰箋?
絎﹀彿鍚嶃銆淇″彿鍊?鎻忚堪銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄惁絎﹀悎POSIX
SIGHUP銆銆1銆銆銆鍦ㄦ帶鍒剁粓绔笂媯嫻嬪埌鎸傛柇鎴栨帶鍒剁嚎紼嬫浜°銆鏄?br>SIGINT銆銆2銆銆銆浜や簰娉ㄦ剰淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGQUIT銆 3銆銆銆浜や簰涓淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGILL銆銆4銆銆銆媯嫻嬪埌闈炴硶紜歡鐨勬寚浠ゃ銆銆銆銆銆銆銆銆銆鏄?br>SIGTRAP銆 5銆銆銆浠庨櫡闃變腑鍥炴湐銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGABRT銆 6銆銆銆寮傚父緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGEMT銆銆7銆銆銆EMT 鎸囦護(hù)銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGFPE銆銆8銆銆銆涓嶆紜殑綆楁湳鎿嶄綔淇″彿銆銆銆銆銆銆銆銆銆銆鏄?br>SIGKILL銆 9銆銆銆緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGBUS銆銆10銆銆 鎬葷嚎閿欒銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGSEGV銆 11銆銆 媯嫻嬪埌闈炴硶鐨勫唴瀛樿皟鐢ㄣ銆銆銆銆銆銆銆銆銆鏄?br>SIGSYS銆銆12銆銆 緋葷粺call鐨勯敊璇弬鏁般銆銆銆銆銆銆銆銆銆銆鍚?br>SIGPIPE銆 13銆銆 鍦ㄦ棤璇昏呯殑綆¢亾涓婂啓銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGALRM銆 14銆銆 鎶ユ椂淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTERM銆 15銆銆 緇堟淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGURG銆銆16銆銆 IO淇¢亾绱фヤ俊鍙楓銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGSTOP銆 17銆銆 鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTSTP銆 18銆銆 浜や簰鏆傚仠淇″彿銆銆銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGCONT銆 19銆銆 濡傛灉鏆傚仠鍒欑戶緇銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGCHLD銆 20銆銆 瀛愮嚎紼嬬粓姝㈡垨鏆傚仠銆銆銆銆銆銆銆銆銆銆銆銆鏄?br>SIGTTIN銆 21銆銆 鍚庡彴綰跨▼緇勪竴鎴愬憳璇曞浘浠庢帶鍒剁粓绔笂璇誨嚭銆銆鏄?br>SIGTTOU銆 22銆銆 鍚庡彴綰跨▼緇勭殑鎴愬憳璇曞浘鍐欏埌鎺у埗緇堢涓娿銆銆鏄?br>SIGIO銆銆 23銆銆 鍏佽I/O淇″彿 銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGXCPU銆 24銆銆 瓚呭嚭CPU鏃墮檺銆銆銆銆銆銆銆銆銆銆銆銆銆銆 鍚?br>SIGXFSZ銆 25銆銆 瓚呭嚭鏂囦歡澶у皬闄愬埗銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGVTALRM 26銆銆 铏氭椂闂磋鎶ュ櫒銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGPROF銆 27銆銆 渚ч潰鏃墮棿璀︽姤鍣ㄣ銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGWINCH銆28銆銆 紿楀彛澶у皬鐨勬洿鏀廣銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGINFO銆 29銆銆 娑堟伅璇鋒眰銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍚?br>SIGUSR1 銆30銆銆 淇濈暀浣滀負(fù)鐢ㄦ埛鑷畾涔夌殑淇″彿1銆銆銆銆銆銆銆 鏄?br>SIGUSR2 銆31銆銆 淇濈暀浣滀負(fù)鐢ㄦ埛鑷畾涔夌殑淇″彿銆銆銆銆銆銆銆銆鏄?nbsp;
娉ㄦ剰錛歀inux淇″彿鏈哄埗鍩烘湰涓婃槸浠嶶nix緋葷粺涓戶鎵胯繃鏉ョ殑銆傛棭鏈烾nix緋葷粺涓殑淇″彿鏈哄埗姣旇緝綆鍗曞拰鍘熷錛屽悗鏉ュ湪瀹炶返涓毚闇插嚭涓浜涢棶棰橈紝鍥犳錛屾妸閭d簺寤虹珛鍦ㄦ棭鏈熸満鍒朵笂鐨勪俊鍙峰彨鍋?涓嶅彲闈犱俊鍙?錛屼俊鍙峰煎皬浜嶴IGRTMIN(Red hat 7.2涓紝SIGRTMIN=32錛孲IGRTMAX=63)鐨勪俊鍙烽兘鏄笉鍙潬淇″彿銆傝繖灝辨槸"涓嶅彲闈犱俊鍙?鐨勬潵婧愩傚畠鐨勪富瑕侀棶棰樻槸錛氳繘紼嬫瘡嬈″鐞嗕俊鍙峰悗錛屽氨灝嗗淇″彿鐨勫搷搴旇緗負(fù)榛樿鍔ㄤ綔銆傚湪鏌愪簺鎯呭喌涓嬶紝灝嗗鑷村淇″彿鐨勯敊璇鐞嗭紱鍥犳錛岀敤鎴峰鏋滀笉甯屾湜榪欐牱鐨勬搷浣滐紝閭d箞灝辮鍦ㄤ俊鍙峰鐞嗗嚱鏁扮粨灝懼啀涓嬈¤皟鐢╯ignal()錛岄噸鏂板畨瑁呰淇″彿銆?/p>
鍙﹀錛屾垜鍐嶅仛涓浜涜ˉ鍏咃紝浜х敓RST鍝嶅簲浠ヨ嚦浜庣郴緇熷彂鍑篠IGPIPE淇″彿錛屽簲璇ュ垎涓轟袱縐嶆儏鍐?
1. 瀹㈡埛绔埌鏈嶅姟绔箣闂寸綉緇滄柇鎺夛紝鎴栬呮湇鍔$鏂數(shù)絳夛紝鐗╃悊榪炴帴鏂帀浜嗭紝榪欑鎯呭喌涓嬪鎴風(fēng)涓嶄細(xì)閫鍑猴紝send鍑芥暟姝e父鎵ц錛屼笉浼?xì)鎰熻鍒拌嚜宸卞嚭閿欍傚洜涓虹敱浜庣墿鐞嗙綉緇滄柇寮錛屾湇鍔$涓嶄細(xì)緇欏鎴風(fēng)鍥炲簲閿欒娑堟伅錛屾病鏈塕ST鍝嶅簲錛岃嚜鐒朵篃涓嶄細(xì)浜х敓SIGPIPE淇″彿銆備絾鏄綋鏈嶅姟绔啀鎭㈠姝e父鐨勬椂鍊欙紝瀵瑰鎴風(fēng)send鏉ョ殑娑堟伅浼?xì)漶旂敓RST鍝嶅簲錛屽鎴風(fēng)灝辨敹鍒癝IGPIPE淇″彿浜嗭紝紼嬪簭閫鍑猴紝浣嗘槸榪欐椂send鍑芥暟鏄兘澶熻繑鍥?-1鐨勩傚彲浠ヨ繘琛屽紓甯稿鐞嗐?/p>
2.瀹㈡埛绔埌鏈嶅姟绔殑緗戠粶鑳介氾紝鏈嶅姟紼嬪簭鎸傛帀錛屽鎴風(fēng)紼嬪簭浼?xì)椹笂閫鍑猴紝鍥犱負(fù)鏈嶅姟绔兘姝e父榪斿洖閿欒娑堟伅錛屽鎴風(fēng)鏀跺埌錛孲IGPIPE淇″彿灝變駭鐢熶簡銆備笉榪囨垜涓嶇‘瀹氭鏃舵湇鍔$榪斿洖鏄殑RST鍝嶅簲錛屾姄鍖呮潵鐪嬫病鏈塕ST鏍囧織銆傛按騫蟲湁闄愶紝鍙啓鍒拌繖浜嗐?br>
# use module
use XML::Simple;
use Data::Dumper;
# create object
$xml = new XML::Simple;
# read XML file
$data = $xml->XMLin("DebugInfo.xml", ForceArray => 1);
# print output
#print Dumper($data);
#print Dumper($data->{'employee'}[0]);
#print Dumper($data->{'employee'}[1]);
$data1=$data->{'DebugInfo'};
#print @{$data1};
open FILE,">>debug.log";
foreach $item (@{$data1}){
print FILE "${$item}{UID}[0],";
print FILE "${$item}{ChannelID}[0],";
print FILE "${$item}{IPAddress}[0],";
if (${$item}{BufferMapString}[0] =~/^HASH/)
{print FILE ",n";}
else{print FILE "${$item}{BufferMapString}[0]n"};
}
close FILE;
紼鐤忥紙Sparse錛夋枃浠剁殑鍒涘緩
鏂囦歡紼鐤忓寲錛坰parsify錛?/strong>
涓嬮潰鐨勬柟娉曢兘鍙互灝嗕竴涓枃浠剁█鐤忓寲銆?br>
1. cp:
cp緙虹渷浣跨敤--sparse=auto錛屼細(xì)鑷姩鎺㈡祴婧愭枃浠朵腑鏄惁鏈夌┖媧烇紝浠ュ喅瀹氱洰鏍囨枃浠舵槸鍚︿負(fù)紼鐤忔枃浠訛紱浣跨敤--sparse=never浼?xì)绂佹鍒涘缓绋鐤忔枃浠躲?br>
2. cpio:
濡傛灉涓嶅姞--sparse鍙傛暟錛岀█鐤忔枃浠朵腑鐨勭┖媧炲皢琚~婊°?
3. tar:
濡傛灉涓嶅姞 -S --sparse鍙傛暟錛岀█鐤忔枃浠朵腑鐨勭┖媧炲皢琚~婊°?
鏂囦歡紼鐤忓寲錛坰parsify錛夋晥鐜囨瘮杈?/strong>
涓嬮潰鎴戜滑鍒涘緩涓涓?00M鐨勭█鐤忔枃浠訛紝姣旇緝涓涓嬪嚑縐嶆枃浠剁█鐤忓寲鏂規(guī)硶鐨勬晥鐜囥?
鐢辨鍙錛屼笂闈㈠嚑縐嶆枃浠剁█鐤忓寲鐨勬柟娉曚腑錛宑p鐨勬晥鐜囨渶楂橈紱tar鍜宑pio鐢變簬浣跨敤綆¢亾錛屾晥鐜囦笅闄嶃?
浣縀XT2/EXT3鏂囦歡緋葷粺紼鐤忓寲錛坰parsify錛?/strong>
濡備綍鏄竴涓枃浠剁郴緇熺殑鏄犲儚鏂囦歡紼鐤忓寲錛烺on Yorston涓哄ぇ瀹舵彁渚涗簡鍑犵鏂規(guī)硶錛屾垜瑙夊緱涓嬮潰鐨勬柟娉曟渶綆鍗曪細(xì)
1. 浣跨敤Ron Yorston鐨?a >zerofree灝嗘枃浠剁郴緇熶腑鏈嬌鐢ㄧ殑鍧楁竻闆躲?br>
2.浣跨敤cp鍛戒護(hù)浣挎槧鍍忔枃浠剁█鐤忓寲錛?
EXT2/EXT3鏂囦歡緋葷粺鐨剆parse_super鍙傛暟
榪欎釜鍙傛暟涓嶦XT2/EXT3鏄惁鏀寔Sparse鏂囦歡鏃犲叧錛涘綋鎵撳紑璇ュ弬鏁版椂錛屾枃浠剁郴緇熷皢浣跨敤鏇村皯鐨勮秴綰у潡錛圫uper block錛夊浠斤紝浠ヨ妭鐪佺┖闂淬?/p>
濡備笅鐨勫懡浠ゅ彲浠ユ煡鐪嬭鍙傛暟錛?br>
鎴栬咃細(xì)
鍙互閫氳繃浣跨敤錛?
鎴栬咃細(xì)
鏉ヨ緗鍙傛暟銆?
鍙傝冭祫鏂?br>
apt-cache search # 鈥斺?package 鎼滅儲鍖?
apt-cache show #鈥斺?package 鑾峰彇鍖呯殑鐩稿叧淇℃伅錛屽璇存槑銆佸ぇ灝忋佺増鏈瓑)
sudo apt-get install # 鈥斺?package 瀹夎鍖?
sudo apt-get install # 鈥?#8211;(package - - reinstall 閲嶆柊瀹夎鍖?
sudo apt-get -f install # 鈥?#8211;(寮哄埗瀹夎?#”-f = –fix-missing”褰撴槸淇瀹夎鍚?#8230;)
sudo apt-get remove #鈥?#8211;(package 鍒犻櫎鍖?
sudo apt-get remove - - purge # 鈥斺?package 鍒犻櫎鍖咃紝鍖呮嫭鍒犻櫎閰嶇疆鏂囦歡絳?
sudo apt-get autoremove –purge # 鈥?(package 鍒犻櫎鍖呭強(qiáng)鍏朵緷璧栫殑杞歡鍖?閰嶇疆鏂囦歡絳夛紙鍙6.10鏈夋晥錛屽己鐑堟帹鑽愶級)
sudo apt-get update #鈥斺旀洿鏂版簮
sudo apt-get upgrade #鈥斺旀洿鏂板凡瀹夎鐨勫寘
sudo apt-get dist-upgrade # 鈥斺斺斿崌綰х郴緇?br>
sudo apt-get dselect-upgrade #鈥斺斾嬌鐢?dselect 鍗囩駭
apt-cache depends #鈥斺?(package 浜嗚В浣跨敤渚濊禆)
apt-cache rdepends # 鈥斺?package 浜嗚В鏌愪釜鍏蜂綋鐨勪緷璧?#褰撴槸鏌ョ湅璇ュ寘琚摢浜涘寘渚濊禆鍚?#8230;)
sudo apt-get build-dep # 鈥斺?package 瀹夎鐩稿叧鐨勭紪璇戠幆澧?
apt-get source #鈥斺?package 涓嬭澆璇ュ寘鐨勬簮浠g爜)
sudo apt-get clean && sudo apt-get autoclean # 鈥斺?#8211;娓呯悊涓嬭澆鏂囦歡鐨勫瓨妗?&& 鍙竻鐞嗚繃鏃剁殑鍖?br>
sudo apt-get check #鈥斺?媯鏌ユ槸鍚︽湁鎹熷潖鐨勪緷璧?/p>
鐩稿叧鏂囦歡錛?br> openssh-clients-2.9p2-7.rpm
openssh-2.9p-7.rpm
openssh-server-2.9p2-7
鍐呭錛?br>顥ヮ棩SSH鐨勮嫳鏂囧叏縐版槸Secure SHell銆傞氳繃浣跨敤SSH錛屼綘鍙互鎶婃墍鏈変紶杈撶殑鏁版嵁榪涜鍔犲瘑錛岃繖鏍?涓棿浜?榪欑鏀誨嚮鏂瑰紡灝變笉鍙兘瀹炵幇浜嗭紝鑰屼笖涔熻兘澶熼槻姝NS鍜孖P嬈洪獥銆傝繕鏈変竴涓澶栫殑濂藉灝辨槸浼犺緭鐨勬暟鎹槸緇忚繃鍘嬬緝鐨勶紝鎵浠ュ彲浠ュ姞蹇紶杈撶殑閫熷害銆係SH鏈夊緢澶氬姛鑳斤紝瀹冩棦鍙互浠f浛telnet錛屽張鍙互涓篺tp銆乸op銆佺敋鑷硃pp鎻愪緵涓涓畨鍏ㄧ殑"閫氶亾"銆?/p>
1.浠涔堟槸SSH錛?br>顥ヮ棩浼犵粺鐨勭綉緇滄湇鍔$▼搴忥紝濡傦細(xì)ftp銆乸op鍜宼elnet鍦ㄦ湰璐ㄤ笂閮芥槸涓嶅畨鍏ㄧ殑錛屽洜涓哄畠浠湪緗戠粶涓婄敤鏄庢枃浼犻佸彛浠ゅ拰鏁版嵁錛屽埆鏈夌敤蹇冪殑浜洪潪甯稿鏄撳氨鍙互鎴幏榪欎簺鍙d護(hù)鍜屾暟鎹傝屼笖錛岃繖浜涙湇鍔$▼搴忕殑瀹夊叏楠岃瘉鏂瑰紡涔熸槸鏈夊叾寮辯偣鐨勶紝灝辨槸寰堝鏄撳彈鍒?涓棿浜?錛坢an-in-the-middle錛夎繖縐嶆柟寮忕殑鏀誨嚮銆傛墍璋?涓棿浜?鐨勬敾鍑?yán)L柟寮忥紝灝辨槸"涓棿浜?鍐掑厖鐪熸鐨勬湇鍔″櫒鎺ユ敹浣犵殑浼犵粰鏈嶅姟鍣ㄧ殑鏁版嵁錛岀劧鍚庡啀鍐掑厖浣犳妸鏁版嵁浼犵粰鐪熸鐨勬湇鍔″櫒銆傛湇鍔″櫒鍜屼綘涔嬮棿鐨勬暟鎹紶閫佽"涓棿浜?涓杞墜鍋氫簡鎵嬭剼涔嬪悗錛屽氨浼?xì)鍑虹幇寰堜弗閲嶇殑闂銆?br>顥ヮ棩SSH鐨勮嫳鏂囧叏縐版槸Secure SHell銆傞氳繃浣跨敤SSH錛屼綘鍙互鎶婃墍鏈変紶杈撶殑鏁版嵁榪涜鍔犲瘑錛岃繖鏍?涓棿浜?榪欑鏀誨嚮鏂瑰紡灝變笉鍙兘瀹炵幇浜嗭紝鑰屼笖涔熻兘澶熼槻姝NS鍜孖P嬈洪獥銆傝繕鏈変竴涓澶栫殑濂藉灝辨槸浼犺緭鐨勬暟鎹槸緇忚繃鍘嬬緝鐨勶紝鎵浠ュ彲浠ュ姞蹇紶杈撶殑閫熷害銆係SH鏈夊緢澶氬姛鑳斤紝瀹冩棦鍙互浠f浛telnet錛屽張鍙互涓篺tp銆乸op銆佺敋鑷硃pp鎻愪緵涓涓畨鍏ㄧ殑"閫氶亾"銆?br>顥ヮ棩鏈鍒漇SH鏄敱鑺叞鐨勪竴瀹跺叕鍙稿紑鍙戠殑銆備絾鏄洜涓哄彈鐗堟潈鍜屽姞瀵嗙畻娉曠殑闄愬埗錛岀幇鍦ㄥ緢澶氫漢閮借漿鑰屼嬌鐢∣penSSH銆侽penSSH鏄疭SH鐨勬浛浠h蔣浠訛紝鑰屼笖鏄厤璐圭殑錛屽彲浠ラ璁″皢鏉ヤ細(xì)鏈夎秺鏉ヨ秺澶氱殑浜轟嬌鐢ㄥ畠鑰屼笉鏄疭SH銆?br>顥ヮ棩SSH鏄敱瀹㈡埛绔拰鏈嶅姟绔殑杞歡緇勬垚鐨勶紝鏈変袱涓笉鍏煎鐨勭増鏈垎鍒槸錛?.x鍜?.x銆傜敤SSH 2.x鐨勫鎴風(fēng)▼搴忔槸涓嶈兘榪炴帴鍒癝SH 1.x鐨勬湇鍔$▼搴忎笂鍘葷殑銆侽penSSH 2.x鍚屾椂鏀寔SSH 1.x鍜?.x銆?/p>
2.SSH鐨勫畨鍏ㄩ獙璇佹槸濡備綍宸ヤ綔鐨?br>顥ヮ棩浠庡鎴風(fēng)鏉ョ湅錛孲SH鎻愪緵涓ょ綰у埆鐨勫畨鍏ㄩ獙璇併?br>顥ヮ棩絎竴縐嶇駭鍒紙鍩轟簬鍙d護(hù)鐨勫畨鍏ㄩ獙璇侊級鍙浣犵煡閬撹嚜宸卞笎鍙峰拰鍙d護(hù)錛屽氨鍙互鐧誨綍鍒拌繙紼嬩富鏈恒傛墍鏈変紶杈撶殑鏁版嵁閮戒細(xì)琚姞瀵嗭紝浣嗘槸涓嶈兘淇濊瘉浣犳鍦ㄨ繛鎺ョ殑鏈嶅姟鍣ㄥ氨鏄綘鎯寵繛鎺ョ殑鏈嶅姟鍣ㄣ傚彲鑳戒細(xì)鏈夊埆鐨勬湇鍔″櫒鍦ㄥ啋鍏呯湡姝g殑鏈嶅姟鍣紝涔熷氨鏄彈鍒?涓棿浜?榪欑鏂瑰紡鐨勬敾鍑匯?br>顥ヮ棩絎簩縐嶇駭鍒紙鍩轟簬瀵嗗寵鐨勫畨鍏ㄩ獙璇侊級闇瑕佷緷闈犲瘑鍖欙紝涔熷氨鏄綘蹇呴』涓鴻嚜宸卞垱寤轟竴瀵瑰瘑鍖欙紝騫舵妸鍏敤瀵嗗寵鏀懼湪闇瑕佽闂殑鏈嶅姟鍣ㄤ笂銆傚鏋滀綘瑕佽繛鎺ュ埌SSH鏈嶅姟鍣ㄤ笂錛屽鎴風(fēng)杞歡灝變細(xì)鍚戞湇鍔″櫒鍙戝嚭璇鋒眰錛岃姹傜敤浣犵殑瀵嗗寵榪涜瀹夊叏楠岃瘉銆傛湇鍔″櫒鏀跺埌璇鋒眰涔嬪悗錛屽厛鍦ㄤ綘鍦ㄨ鏈嶅姟鍣ㄧ殑瀹剁洰褰曚笅瀵繪壘浣犵殑鍏敤瀵嗗寵錛岀劧鍚庢妸瀹冨拰浣犲彂閫佽繃鏉ョ殑鍏敤瀵嗗寵榪涜姣旇緝銆傚鏋滀袱涓瘑鍖欎竴鑷達(dá)紝鏈嶅姟鍣ㄥ氨鐢ㄥ叕鐢ㄥ瘑鍖欏姞瀵?璐ㄨ"錛坈hallenge錛夊茍鎶婂畠鍙戦佺粰瀹㈡埛绔蔣浠躲傚鎴風(fēng)杞歡鏀跺埌"璐ㄨ"涔嬪悗灝卞彲浠ョ敤浣犵殑縐佷漢瀵嗗寵瑙e瘑鍐嶆妸瀹冨彂閫佺粰鏈嶅姟鍣ㄣ?br>顥ヮ棩鐢ㄨ繖縐嶆柟寮忥紝浣犲繀欏葷煡閬撹嚜宸卞瘑鍖欑殑鍙d護(hù)銆備絾鏄紝涓庣涓縐嶇駭鍒浉姣旓紝絎簩縐嶇駭鍒笉闇瑕佸湪緗戠粶涓婁紶閫佸彛浠ゃ?br>顥ヮ棩絎簩縐嶇駭鍒笉浠呭姞瀵嗘墍鏈変紶閫佺殑鏁版嵁錛岃屼笖"涓棿浜?榪欑鏀誨嚮鏂瑰紡涔熸槸涓嶅彲鑳界殑錛堝洜涓轟粬娌℃湁浣犵殑縐佷漢瀵嗗寵錛夈備絾鏄暣涓櫥褰曠殑榪囩▼鍙兘闇瑕?0縐掋?/p>
3.瀹夎騫舵祴璇昈penSSH
顥ヮ棩鍥犱負(fù)鍙楀埌緹庡浗娉曞緥鐨勯檺鍒訛紝鍦ㄥ緢澶歀inux鐨勫彂琛岀増涓兘娌℃湁鍖呮嫭OpenSSH銆備絾鏄紝鍙互浠庣綉緇滀笂涓嬭澆騫跺畨瑁匫penSSH
顥ヮ棩瀹夎瀹孫penSSH涔嬪悗錛岀敤涓嬮潰鍛戒護(hù)嫻嬭瘯涓涓嬶細(xì)
ssh -l [your accountname on the remote host] [address of the remote host]
顥ヮ棩濡傛灉OpenSSH宸ヤ綔姝e父錛屼綘浼?xì)鐪嬪堫C笅闈㈢殑鎻愮ず淇℃伅錛?br>The authenticity of host [hostname] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
顥ヮ棩OpenSSH鍛婅瘔浣犲畠涓嶇煡閬撹繖鍙頒富鏈猴紝浣嗘槸浣犱笉鐢ㄦ媴蹇冭繖涓棶棰橈紝鍥犱負(fù)浣犳槸絎竴嬈$櫥褰曡繖鍙頒富鏈恒傞敭鍏?yes"銆傝繖灝嗘妸榪欏彴涓繪満鐨?璇嗗埆鏍囪"鍔犲埌"~/.ssh/know_hosts"鏂囦歡涓傜浜屾璁塊棶榪欏彴涓繪満鐨勬椂鍊欏氨涓嶄細(xì)鍐嶆樉紺鴻繖鏉℃彁紺轟俊鎭簡銆?br>顥ヮ棩鐒跺悗錛孲SH鎻愮ず浣犺緭鍏ヨ繙紼嬩富鏈轟笂浣犵殑甯愬彿鐨勫彛浠ゃ傝緭鍏ュ畬鍙d護(hù)涔嬪悗錛屽氨寤虹珛浜哠SH榪炴帴錛岃繖涔嬪悗灝卞彲浠ヨ薄浣跨敤telnet閭f牱浣跨敤SSH浜嗐?/p>
4.SSH鐨勫瘑鍖?br>4.1 鐢熸垚浣犺嚜宸辯殑瀵嗗寵瀵?br>顥ヮ棩鐢熸垚騫跺垎鍙戜綘鑷繁鐨勫瘑鍖欐湁涓や釜濂藉錛?br>鍙互闃叉"涓棿浜?榪欑鏀誨嚮鏂瑰紡
鍙互鍙敤涓涓彛浠ゅ氨鐧誨綍鍒版墍鏈変綘鎯崇櫥褰曠殑鏈嶅姟鍣ㄤ笂
鐢ㄤ笅闈㈢殑鍛戒護(hù)鍙互鐢熸垚瀵嗗寵錛?br>ssh-keygen顥ヮ棩濡傛灉榪滅▼涓繪満浣跨敤鐨勬槸SSH 2.x灝辮鐢ㄨ繖涓懡浠わ細(xì)
ssh-keygen -d顥ヮ棩鍦ㄥ悓涓鍙頒富鏈轟笂鍚屾椂鏈塖SH1鍜孲SH2鐨勫瘑鍖欐槸娌℃湁闂鐨勶紝鍥犱負(fù)瀵嗗寵鏄瓨鎴愪笉鍚岀殑鏂囦歡鐨勩?/p>
ssh-keygen鍛戒護(hù)榪愯涔嬪悗浼?xì)鏄窘C轟笅闈㈢殑淇℃伅錛?br>Generating RSA keys: ............................ooooooO......ooooooO
Key generation complete.
Enter file in which to save the key (/home/[user]/.ssh/identity):
[鎸変笅ENTER灝辮浜哴
Created directory '/home/[user]/.ssh'.
Enter passphrase (empty for no passphrase):
[杈撳叆鐨勫彛浠や笉浼?xì)鏄窘C哄湪灞忓箷涓奭
Enter same passphrase again:
[閲嶆柊杈撳叆涓閬嶅彛浠わ紝濡傛灉蹇樿浜嗗彛浠ゅ氨鍙兘閲嶆柊鐢熸垚涓嬈″瘑鍖欎簡]
Your identification has been saved in /home/[user]/.ssh/identity.
[榪欐槸浣犵殑縐佷漢瀵嗗寵]
Your public key has been saved in /home/[user]/.ssh/identity.pub.
The key fingerprint is: 2a:dc:71:2f:27:84:a2:e4:a1:1e:a9:63:e2:fa:a5:89 [user]@[local machine]
顥ヮ棩"ssh-keygen -d"鍋氱殑鏄嚑涔庡悓鏍風(fēng)殑浜嬶紝浣嗘槸鎶婁竴瀵瑰瘑鍖欏瓨涓猴紙榛樿鎯呭喌涓嬶級"/home/[user]/.ssh/id_dsa"錛堢浜哄瘑鍖欙級鍜?/home/[user]/.ssh/id_dsa.pub"錛堝叕鐢ㄥ瘑鍖欙級銆?/p>
顥ヮ棩鐜板湪浣犳湁涓瀵瑰瘑鍖欎簡錛氬叕鐢ㄥ瘑鍖欒鍒嗗彂鍒版墍鏈変綘鎯崇敤ssh鐧誨綍鐨勮繙紼嬩富鏈轟笂鍘伙紱縐佷漢瀵嗗寵瑕佸ソ濂藉湴淇濈闃叉鍒漢鐭ラ亾浣犵殑縐佷漢瀵嗗寵銆傜敤"ls -l ~/.ssh/identity"鎴?ls -l ~/.ssh/id_dsa"鎵鏄劇ず鐨勬枃浠剁殑璁塊棶鏉冮檺蹇呴』鏄?-rw-------"銆?br>顥ヮ棩濡傛灉浣犳鐤戣嚜宸辯殑瀵嗗寵宸茬粡琚埆浜虹煡閬撲簡錛屼笉瑕佽繜鐤戦┈涓婄敓鎴愪竴瀵規(guī)柊鐨勫瘑鍖欍傚綋鐒訛紝浣犺繕瑕侀噸鏂板垎鍙戜竴嬈″叕鐢ㄥ瘑鍖欍?/p>
4.2 鍒嗗彂鍏敤瀵嗗寵
顥ヮ棩鍦ㄦ瘡涓涓綘闇瑕佺敤SSH榪炴帴鐨勮繙紼嬫湇鍔″櫒涓婏紝浣犺鍦ㄨ嚜宸辯殑瀹剁洰褰曚笅鍒涘緩涓涓?.ssh"鐨勫瓙鐩綍錛屾妸浣犵殑鍏敤瀵嗗寵"identity.pub" 鎷瘋礉鍒拌繖涓洰褰曚笅騫舵妸瀹冮噸鍛藉悕涓?authorized_keys"銆傜劧鍚庢墽琛岋細(xì)
chmod 644 .ssh/authorized_keys
顥ヮ棩榪欎竴姝ユ槸蹇呬笉鍙皯鐨勩傚鏋滈櫎浜嗕綘涔嬪鍒漢瀵?authorized_keys"鏂囦歡涔熸湁鍐欑殑鏉冮檺錛孲SH灝變笉浼?xì)宸ヤ綔銆?br>顥ヮ棩濡傛灉浣犳兂浠庝笉鍚岀殑璁$畻鏈虹櫥褰曞埌榪滅▼涓繪満錛?authorized_keys"鏂囦歡涔熷彲浠ユ湁澶氫釜鍏敤瀵嗗寵銆傚湪榪欑鎯呭喌涓嬶紝蹇呴』鍦ㄦ柊鐨勮綆楁満涓婇噸鏂扮敓鎴愪竴瀵瑰瘑鍖欙紝鐒跺悗鎶婄敓鎴愮殑"identify.pub"鏂囦歡鎷瘋礉騫剁矘璐村埌榪滅▼涓繪満鐨?authorized_keys"鏂囦歡閲屻傚綋鐒跺湪鏂扮殑璁$畻鏈轟笂浣犲繀欏繪湁涓涓笎鍙鳳紝鑰屼笖瀵嗗寵鏄敤鍙d護(hù)淇濇姢鐨勩傛湁涓鐐瑰緢閲嶈錛屽氨鏄綋浣犲彇娑堜簡榪欎釜甯愬彿涔嬪悗錛屽埆蹇樹簡鎶婅繖涓瀵瑰瘑鍖欏垹鎺夈?/p>
5.閰嶇疆SSH CompressionLevel 鍘嬬緝鐨勭駭鍒粠"1"錛堟渶蹇級鍒?9"錛堝帇緙╃巼鏈楂橈級銆傞粯璁ゅ間負(fù)"6"銆?/p>
ForwardX11 yes 涓轟簡鍦ㄦ湰鍦拌繍琛岃繙紼嬬殑X紼嬪簭蹇呴』璁劇疆榪欎釜閫夐」銆?/p>
LogLevel DEBUG 褰揝SH鍑虹幇闂鐨勬椂鍊欙紝榪欓夐」灝卞緢鏈夌敤浜嗐傞粯璁ゅ間負(fù)"INFO"銆?/p>
5.2 閰嶇疆鏈嶅姟绔殑杞歡 6.鎷瘋礉鏂囦歡 顥ヮ棩6.2 鐢?sftp"鎷瘋礉鏂囦歡 6.3 鐢?rsync"鎷瘋礉鏂囦歡 6.4 鐢?鍔犲瘑閫氶亾"鐨刦tp鎷瘋礉鏂囦歡 7.鐢⊿SH璁劇疆"鍔犲瘑閫氶亾" 顥ヮ棩濡傛灉鏀跺埌榪欐牱鐨勫嚭閿欎俊鎭細(xì)telnet: Unable to connect to remote host: Connection refused 灝辮鏄庤繙紼嬫湇鍔″櫒涓婃病鏈夎繍琛孲SH鏈嶅姟杞歡銆?/p>
顥ヮ棩绔彛杞彂浣跨敤榪欐牱鐨勫懡浠よ娉曪細(xì) 7.2 涓篜OP鍔犱笂"鍔犲瘑閫氶亾" 7.3 涓篨鍔犱笂"鍔犲瘑閫氶亾" 錛堝鏋滃湪榪滅▼涓繪満涓婁綘鐨勫鐩綍涓嬩笉瀛樺湪".Xauthority"榪欎釜鏂囦歡錛岄偅涔堝綋鐢⊿SH鐧誨綍鐨勬椂鍊欏氨浼?xì)鑷姩鍒涘缓锛夈?br>顥ヮ棩姣斿鍚姩涓涓猉紼嬪簭錛坸term錛夊彲浠ヨ繖涓懡浠わ細(xì) 7.4 涓簂inuxconf鍔犱笂"鍔犲瘑閫氶亾" 7.5 涓篧ebmin鍔犱笂"鍔犲瘑閫氶亾"
5.1 閰嶇疆瀹㈡埛绔殑杞歡
顥ヮ棩OpenSSH鏈変笁縐嶉厤緗柟寮忥細(xì)鍛戒護(hù)琛屽弬鏁般佺敤鎴烽厤緗枃浠跺拰緋葷粺綰х殑閰嶇疆鏂囦歡錛?/etc/ssh/ssh_config"錛夈傚懡浠よ鍙傛暟浼樺厛浜庨厤緗枃浠訛紝鐢ㄦ埛閰嶇疆鏂囦歡浼樺厛浜庣郴緇熼厤緗枃浠躲傛墍鏈夌殑鍛戒護(hù)琛岀殑鍙傛暟閮借兘鍦ㄩ厤緗枃浠朵腑璁劇疆銆傚洜涓哄湪瀹夎鐨勬椂鍊欐病鏈夐粯璁ょ殑鐢ㄦ埛閰嶇疆鏂囦歡錛屾墍浠ヨ鎶?/etc/ssh/ssh_config"鎷瘋礉騫墮噸鏂板懡鍚嶄負(fù)"~/.ssh/config"銆?br>顥ヮ棩鏍囧噯鐨勯厤緗枃浠跺ぇ姒傛槸榪欐牱鐨勶細(xì)
[lots of explanations and possible options listed]
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no
顥ヮ棩榪樻湁寰堝閫夐」鐨勮緗彲浠ョ敤"man ssh"鏌ョ湅"CONFIGURATION FILES"榪欎竴绔犮?br>顥ヮ棩閰嶇疆鏂囦歡鏄寜欏哄簭璇誨彇鐨勩傚厛璁劇疆鐨勯夐」鍏堢敓鏁堛?br>顥ヮ棩鍋囧畾浣犲湪Host *fbc
HostName www.foobar.com
User bilbo
ForwardAgent yes
Compression yes
# Be paranoid by default
Host *
ForwardAgent no
ForwardX11 no
FallBackToRsh no
顥ヮ棩浣犺緭鍏?ssh fbc"涔嬪悗錛孲SH浼?xì)鑷姩鍦颁粠閰嵕|枃浠朵腑鎵懼埌涓繪満鐨勫叏鍚嶏紝鐢ㄤ綘鐨勭敤鎴峰悕鐧誨綍騫朵笖鐢?ssh-agent"綆$悊鐨勫瘑鍖欒繘琛屽畨鍏ㄩ獙璇併傝繖鏍峰緢鏂逛究鍚э紒
顥ヮ棩鐢⊿SH榪炴帴鍒板叾瀹冭繙紼嬭綆楁満鐢ㄧ殑榪樻槸"paranoid錛堝亸鎵э級"榛樿璁劇疆銆傚鏋滄湁浜涢夐」娌℃湁鍦ㄩ厤緗枃浠舵垨鍛戒護(hù)琛屼腑璁劇疆錛岄偅涔堣繕鏄嬌鐢ㄩ粯璁ょ殑"paranoid"璁劇疆銆?br>顥ヮ棩鍦ㄦ垜浠笂闈婦鐨勯偅涓緥瀛愪腑錛屽浜庡埌顥ヮ棩鍏跺畠榪樻湁涓浜涢渶瑕佷粩緇嗙湅涓鐪嬬殑璁劇疆閫夐」鏄細(xì)
CheckHostIP yes 榪欎釜閫夐」鐢ㄦ潵榪涜IP鍦板潃鐨勬鏌ヤ互闃叉DNS嬈洪獥銆?/p>
顥ヮ棩SSH鏈嶅姟鍣ㄧ殑閰嶇疆浣跨敤鐨勬槸"/etc/ssh/sshd_config"閰嶇疆鏂囦歡錛岃繖浜涢夐」鐨勮緗湪閰嶇疆鏂囦歡涓凡緇忔湁浜嗕竴浜涜鏄庤屼笖鐢?man sshd"涔熷彲浠ユ煡鐪嬪府鍔┿傝娉ㄦ剰OpenSSH瀵逛簬SSH 1.x鍜?.x娌℃湁涓嶅悓鐨勯厤緗枃浠躲?br>顥ヮ棩鍦ㄩ粯璁ょ殑璁劇疆閫夐」涓渶瑕佹敞鎰忕殑鏈夛細(xì)
PermitRootLogin yes 鏈濂芥妸榪欎釜閫夐」璁劇疆鎴?PermitRootLogin without-password"錛岃繖鏍?root"鐢ㄦ埛灝變笉鑳戒粠娌℃湁瀵嗗寵鐨勮綆楁満涓婄櫥褰曘傛妸榪欎釜閫夐」璁劇疆鎴?no"灝嗙姝?root"鐢ㄦ埛鐧誨綍錛屽彧鑳界敤"su"鍛戒護(hù)浠庢櫘閫氱敤鎴瘋漿鎴?root"銆?br>X11Forwarding no 鎶婅繖涓夐」璁劇疆鎴?yes"鍏佽鐢ㄦ埛榪愯榪滅▼涓繪満涓婄殑X紼嬪簭銆傚氨綆楃姝㈣繖涓夐」涔熶笉鑳芥彁楂樻湇鍔″櫒鐨勫畨鍏ㄥ洜涓虹敤鎴峰彲浠ュ畨瑁呬粬浠嚜宸辯殑杞彂鍣紙forwarder錛夛紝璇峰弬鐪?man sshd"銆?br>PasswordAuthentication yes 鎶婅繖涓夐」璁劇疆涓?no"鍙厑璁哥敤鎴風(fēng)敤鍩轟簬瀵嗗寵鐨勬柟寮忕櫥褰曘傝繖褰撶劧浼?xì)缁欓偅浜浘l忓父闇瑕佷粠涓嶅悓涓繪満鐧誨綍鐨勭敤鎴峰甫鏉ラ夯鐑︼紝浣嗘槸榪欒兘澶熷湪寰堝ぇ紼嬪害涓婃彁楂樼郴緇熺殑瀹夊叏鎬с傚熀浜庡彛浠ょ殑鐧誨綍鏂瑰紡鏈夊緢澶х殑寮辯偣銆?br># Subsystem /usr/local/sbin/sftpd 鎶婃渶鍓嶉潰鐨勶純鍙峰幓鎺夊茍涓旀妸璺緞鍚嶈緗垚"/usr/bin/sftpserv"錛岀敤鎴峰氨鑳戒嬌鐢?sftp"錛堝畨鍏ㄧ殑FTP錛変簡錛坰ftpserv鍦╯ftp杞歡鍖呬腑錛夈傚洜涓哄緢澶氱敤鎴峰FTP姣旇緝鐔熸?zhèn)夎屼笖"scp"鐢ㄨ搗鏉ヤ篃鏈変竴浜涢夯鐑︼紝鎵浠?sftp"榪樻槸寰堟湁鐢ㄧ殑銆傝屼笖2.0.7鐗堟湰浠ュ悗鐨勫浘褰㈠寲鐨刦tp宸ュ叿"gftp"涔熸敮鎸?sftp"銆?/p>
6.1 鐢?scp"鎷瘋礉鏂囦歡
顥ヮ棩SSH鎻愪緵浜嗕竴浜涘懡浠ゅ拰shell鐢ㄦ潵鐧誨綍榪滅▼鏈嶅姟鍣ㄣ傚湪榛樿鎯呭喌涓嬪畠涓嶅厑璁鎬綘鎷瘋礉鏂囦歡錛屼絾鏄繕鏄彁渚涗簡涓涓?scp"鍛戒護(hù)銆?br>顥ヮ棩鍋囧畾浣犳兂鎶婃湰鍦拌綆楁満褰撳墠鐩綍涓嬬殑涓涓悕涓?dumb"鐨勬枃浠舵嫹璐濆埌榪滅▼鏈嶅姟鍣?a 銆?br>鍙互鐢ㄨ繖涓懡浠わ細(xì)scp dumb bilbo@www.foobar.com:.
鎶婃枃浠舵嫹璐濆洖鏉ョ敤榪欎釜鍛戒護(hù)錛歴cp bilbo@www.foobar.com:dumb .
顥ヮ棩"scp"璋冪敤SSH榪涜鐧誨綍錛岀劧鍚庢嫹璐濇枃浠訛紝鏈鍚庤皟鐢⊿SH鍏抽棴榪欎釜榪炴帴銆?br>顥ヮ棩濡傛灉鍦ㄤ綘鐨?~/.ssh/config"鏂囦歡涓凡緇忎負(fù)www.foobar.com鍋氫簡榪欐牱鐨勯厤緗細(xì)
Host *fbc
HostName www.foobar.com
User bilbo
ForwardAgent yes
顥ヮ棩閭d箞浣犲氨鍙互鐢?fbc"鏉ヤ唬鏇?bilbo@www.foobar.com"錛屽懡浠ゅ氨綆鍖栦負(fù)"scp dumb fbc:."銆?br>顥ヮ棩"scp"鍋囧畾浣犲湪榪滅▼涓繪満涓婄殑瀹剁洰褰曚負(fù)浣犵殑宸ヤ綔鐩綍銆傚鏋滀綘浣跨敤鐩稿鐩綍灝辮鐩稿浜庡鐩綍銆?br>顥ヮ棩鐢?scp"鍛戒護(hù)鐨?-r"鍙傛暟鍏佽閫掑綊鍦版嫹璐濈洰褰曘?scp"涔熷彲浠ュ湪涓や釜涓嶅悓鐨勮繙紼嬩富鏈轟箣闂存嫹璐濇枃浠躲?br>顥ヮ棩鏈夋椂鍊欎綘鍙兘浼?xì)璇曞浘浣湗q欐牱鐨勪簨錛氱敤SSH鐧誨綍鍒?a scp [local machine]:dumb ."鎯崇敤瀹冩妸鏈湴鐨?dumb"鏂囦歡鎷瘋礉鍒頒綘褰撳墠鐧誨綍鐨勮繙紼嬫湇鍔″櫒涓娿傝繖鏃跺欎綘浼?xì)鐪嬪堫C笅闈㈢殑鍑洪敊淇℃伅錛?br>顥ヮ棩ssh: secure connection to [local machine] refused
顥ヮ棩涔嬫墍浠ヤ細(xì)鍑虹幇榪欐牱鐨勫嚭閿欎俊鎭槸鍥犱負(fù)浣犺繍琛岀殑鏄繙紼嬬殑"scp"鍛戒護(hù)錛屽畠璇曞浘鐧誨綍鍒板湪浣犳湰鍦拌綆楁満涓婅繍琛岀殑SSH鏈嶅姟紼嬪簭……鎵浠ユ渶濂藉湪鏈湴榪愯"scp"闄ら潪浣犵殑鏈湴璁$畻鏈轟篃榪愯SSH鏈嶅姟紼嬪簭銆?/p>
顥ヮ棩濡傛灉浣犱範(fàn)鎯嬌鐢╢tp鐨勬柟寮忔嫹璐濇枃浠訛紝鍙互璇曠潃鐢?sftp"銆?sftp"寤虹珛鐢⊿SH鍔犲瘑鐨勫畨鍏ㄧ殑FTP榪炴帴閫氶亾錛屽厑璁鎬嬌鐢ㄦ爣鍑嗙殑ftp鍛戒護(hù)銆傝繕鏈変竴涓ソ澶勫氨鏄?sftp"鍏佽浣犻氳繃"exec"鍛戒護(hù)榪愯榪滅▼鐨勭▼搴忋備粠2.0.7鐗堜互鍚庯紝鍥懼艦鍖栫殑ftp瀹㈡埛杞歡"gftp"灝辨敮鎸?sftp"銆?br>顥ヮ棩濡傛灉榪滅▼鐨勬湇鍔″櫒娌℃湁瀹夎sftp鏈嶅姟鍣ㄨ蔣浠?sftpserv"錛屽彲浠ユ妸"sftpserv"鐨勫彲鎵ц鏂囦歡鎷瘋礉鍒頒綘鐨勮繙紼嬬殑瀹剁洰褰曚腑錛堟垨鑰呭湪榪滅▼璁$畻鏈虹殑$PATH鐜鍙橀噺涓緗殑璺緞錛夈?sftp"浼?xì)鑷姩婵媧昏繖涓湇鍔¤蔣浠訛紝浣犳病鏈夊繀瑕佸湪榪滅▼鏈嶅姟鍣ㄤ笂鏈変粈涔堢壒孌婄殑鏉冮檺銆?/p>
顥ヮ棩"rsync"鏄敤鏉ユ嫹璐濄佹洿鏂板拰縐誨姩榪滅▼鍜屾湰鍦版枃浠剁殑涓涓湁鐢ㄧ殑宸ュ叿錛屽緢瀹規(guī)槗灝卞彲浠ョ敤"-e ssh"鍙傛暟鍜孲SH緇撳悎璧鋒潵浣跨敤銆?rsync"鐨勪竴涓紭鐐瑰氨鏄紝涓嶄細(xì)鎷瘋礉鍏ㄩ儴鐨勬枃浠訛紝鍙細(xì)鎷瘋礉鏈湴鐩綍鍜岃繙紼嬬洰褰曚腑鏈夊尯鍒殑鏂囦歡銆傝屼笖瀹冭繕浣跨敤寰堥珮鏁堢殑鍘嬬緝綆楁硶錛岃繖鏍鋒嫹璐濈殑閫熷害灝卞緢蹇?/p>
顥ヮ棩濡傛灉浣犲潥鎸佽鐢ㄤ紶緇熺殑FTP瀹㈡埛杞歡銆係SH鍙互涓哄嚑涔庢墍鏈夌殑鍗忚鎻愪緵"瀹夊叏閫氶亾"銆侳TP鏄竴涓湁涓鐐瑰鎬殑鍗忚錛堜緥濡傞渶瑕佷袱涓鍙o級鑰屼笖涓嶅悓鐨勬湇鍔$▼搴忓拰鏈嶅姟紼嬪簭涔嬮棿銆佸鎴風(fēng)▼搴忓拰瀹㈡埛紼嬪簭涔嬮棿榪樻湁涓浜涘樊鍒?br>顥ヮ棩瀹炵幇"鍔犲瘑閫氶亾"鐨勬柟娉曟槸浣跨敤"绔彛杞彂"銆備綘鍙互鎶婁竴涓病鏈夌敤鍒扮殑鏈湴绔彛錛堥氬父澶т簬1000錛夎緗垚杞彂鍒頒竴涓繙紼嬫湇鍔″櫒涓婏紝鐒跺悗鍙榪炴帴鏈湴璁$畻鏈轟笂鐨勮繖涓鍙e氨琛屼簡銆傛湁涓鐐瑰鏉傛槸鍚楋紵
顥ヮ棩鍏跺疄涓涓熀鏈殑鎯蟲硶灝辨槸錛岃漿鍙戜竴涓鍙o紝璁㏒SH鍦ㄥ悗鍙拌繍琛岋紝鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?br>ssh [user@remote host] -f -L 1234:[remote host]:21 tail -f /etc/motd
顥ヮ棩鎺ョ潃榪愯FTP瀹㈡埛錛屾妸瀹冭緗埌鎸囧畾鐨勭鍙o細(xì)
lftp -u [username] -p 1234 localhost
顥ヮ棩褰撶劧錛岀敤榪欑鏂規(guī)硶寰堥夯鐑﹁屼笖寰堝鏄撳嚭閿欍傛墍浠ユ渶濂戒嬌鐢ㄥ墠涓夌鏂規(guī)硶銆?/p>
7.1 "鍔犲瘑閫氶亾"鐨勫熀紜鐭ヨ瘑
顥ヮ棩SSH鐨?鍔犲瘑閫氶亾"鏄氳繃"绔彛杞彂"鏉ュ疄鐜扮殑銆備綘鍙互鍦ㄦ湰鍦扮鍙o紙娌℃湁鐢ㄥ埌鐨勶級鍜屽湪榪滅▼鏈嶅姟鍣ㄤ笂榪愯鐨勬煇涓湇鍔$殑绔彛涔嬮棿寤虹珛"鍔犲瘑閫氶亾"銆傜劧鍚庡彧瑕佽繛鎺ュ埌鏈湴绔彛銆傛墍鏈夊鏈湴绔彛鐨勮姹傞兘琚玈SH鍔犲瘑騫朵笖杞彂鍒拌繙紼嬫湇鍔″櫒鐨勭鍙c傚綋鐒跺彧鏈夎繙紼嬫湇鍔″櫒涓婅繍琛孲SH鏈嶅姟鍣ㄨ蔣浠剁殑鏃跺?鍔犲瘑閫氶亾"鎵嶈兘宸ヤ綔銆傚彲浠ョ敤涓嬮潰鍛戒護(hù)媯鏌ヤ竴浜涜繙紼嬫湇鍔″櫒鏄惁榪愯SSH鏈嶅姟錛?br>telnet [full name of remote host] 22
ssh -f [username@remote host] -L [local port]:[full name of remote host]:[remote port] [some command]
顥ヮ棩浣犱笉浠呭彲浠ヨ漿鍙戝涓鍙h屼笖鍙互鍦?~/.ssh/config"鏂囦歡涓敤"LocalForward"璁劇疆緇忓父浣跨敤鐨勪竴浜涜漿鍙戠鍙c?/p>
顥ヮ棩浣犲彲浠ョ敤POP鍗忚浠庢湇鍔″櫒涓婂彇email銆備負(fù)POP鍔犱笂"鍔犲瘑閫氶亾"鍙互闃叉POP鐨勫瘑鐮佽緗戠粶鐩戝惉鍣紙sniffer錛夌洃鍚埌銆傝繕鏈変竴涓ソ澶勫氨鏄疭SH鐨勫帇緙╂柟寮忓彲浠ヨ閭歡浼犺緭寰楁洿蹇?br>顥ヮ棩鍋囧畾浣犲湪pop.foobar.com涓婃湁涓涓狿OP甯愬彿錛屼綘鐨勭敤鎴峰悕鏄?bilbo"浣犵殑POP鍙d護(hù)鏄?topsecret"銆傜敤鏉ュ緩绔婼SH"鍔犲瘑閫氶亾"鐨勫懡浠ゆ槸錛?br>ssh -f -C bilbo@pop.foobar.com -L 1234:pop.foobar.com:110 sleep 5
錛堝鏋滆嫻嬭瘯錛屽彲浠ユ妸"sleep"鐨勫煎姞鍒?00錛夈傝繍琛岃繖涓懡浠や箣鍚庝細(xì)鎻愮ず浣犺緭鍏OP鍙d護(hù)錛?br>bilbo@pop.foobar.com's password:
杈撳叆鍙d護(hù)涔嬪悗灝卞彲浠ョ敤"telnet"榪炴帴鍒版湰鍦扮殑杞彂绔彛浜嗐?br>telnet localhost 1234
浣犱細(xì)鏀跺埌榪滅▼mail鏈嶅姟鍣ㄧ殑"READY"娑堟伅銆?br>顥ヮ棩褰撶劧錛岃繖涓柟娉曡姹備綘鎵嬪伐杈撳叆鎵鏈夌殑POP鍛戒護(hù)錛岃繖鏄緢涓嶆柟渚跨殑銆傚彲浠ョ敤Fetchmail錛堝弬鑰僪ow to configure Fetchmail錛夈係ecure POP via SSH mini-HOWTO銆乵an fetchmail鍜屽湪"/usr/doc/fetchmail-[…]"鐩綍涓嬬殑Fetchmail鐨凢AQ閮芥彁渚涗簡涓浜涘叿浣撶殑渚嬪瓙銆?br>顥ヮ棩璇鋒敞鎰廔MAP鍗忚浣跨敤鐨勬槸涓嶅悓鐨勭鍙o細(xì)IMAP v2鐨勭鍙e彿涓?43鑰孖MAP v3鐨勭鍙e彿涓?20銆?/p>
顥ヮ棩濡傛灉浣犳墦綆楀湪鏈湴璁$畻鏈轟笂榪愯榪滅▼SSH鏈嶅姟鍣ㄤ笂鐨刋紼嬪簭錛岄偅涔堢櫥褰曞埌榪滅▼鐨勮綆楁満涓婏紝鍒涘緩涓涓悕涓?~/.ssh/environment"鐨勬枃浠跺茍鍔犱笂榪欎竴琛岋細(xì)
XAUTHORITY=/home/[remote user name]/.Xauthority
ssh -f -X -l [remote user name] [remote machine] xterm
顥ヮ棩榪欏皢鍦ㄨ繙紼嬭繍琛寈term榪欎釜紼嬪簭銆傚叾瀹冪殑X紼嬪簭涔熸槸鐢ㄧ浉鍚岀殑鏂規(guī)硶銆?/p>
顥ヮ棩Linuxconf(http://www.solucorp.qc.ca/linuxconf/)鏄疞inux鐨勯厤緗伐鍏鳳紝瀹冩敮鎸佽繙紼嬬鐞嗐侺inuxconf鐨凢AQ閲嶈鏄庝簡濡備綍閫氳繃SSH浣跨敤linuxconf錛?br>鍏跺懡浠や負(fù)錛歳emadmin --exec [link_command] linuxconf --guiproto
顥ヮ棩濡傛灉浣犳兂鍦ㄤ袱鍙拌綆楁満涔嬮棿鐢ㄥ姞瀵嗙殑鏂瑰紡浼犻佷俊鎭紝閭d箞鏈濂界敤ssh銆傚懡浠ゆ槸錛?br>remadmin --exec ssh -l [account] linuxconf --guiproto
顥ヮ棩榪欐槸闈炲父鏈夋晥鐨勮屼笖榪愯鐢ㄥ浘褰㈢晫闈㈢鐞嗚綆楁満銆?br>顥ヮ棩榪欑鏂規(guī)硶闇瑕佸湪瀹㈡埛绔畨瑁卨inuxconf銆傚叾瀹冪殑鏂規(guī)硶榪樻湁鐩存帴鐧誨綍鍒版湇鍔″櫒涓婄敤"X11Forwarding"鎴栧瓧絎︾晫闈㈣繍琛宭inuxconf銆?/p>
顥ヮ棩Webmin(ssh -f -l [remote user name] [remote host] -L 1234:[remote host]:10000 tail -f /etc/motd
顥ヮ棩鎶婃祻瑙堝櫒鎸囧悜http://localhost:1234
]]>